资源简介
基于MFC的五子棋程序,里面有人人和人机对弈模式,AI水平还不错,可以下载参考啦,里面是一个完整的工程,代码后面有足够详细的注释
代码片段和文件信息
#include “StdAfx.h“
#include “FiveChess.h“
CFiveChess::CFiveChess()
{
m_nCount=0;
}
void CFiveChess::InitArr()
{
for(int i=0;i {
for(int j=0;j {
m_cArr[i][j]=SPACE; //初始化为空格
}
}
m_nCount=0;
}
void CFiveChess::SetArr(int rowint colchar cChess)
{
m_cArr[row][col]=cChess;
}
char CFiveChess::GetArr(int rowint col)
{
return m_cArr[row][col];
}
void CFiveChess::SetCurrentPoint(int rowint col)
{
m_nCurrentX=row;
m_nCurrentY=col;
}
/*
返回:
棋子符号(CHESS_BLACK)‘B‘ 表示黑方胜,
棋子符号(CHESS_WHITE)‘W‘ 表示白方胜,
等于(PEACE)‘=‘ 表示和棋
空格(SPACE)‘ ‘ 表示尚未分出胜负。
*/
//胜负判断实际上是据当前最后一个落子的情况来判断胜负的这也是为什么添加m_nCurrentXm_nCurrentY的原因
//实际上需要从四个位置判断,以该子为出发点的水平,竖直和两条分别为 45度角和135度角的线,
//目的是看在这四个方向是否最后落子的一方构成连续五个的棋子,如果是的话,就表示该盘棋局已经分出胜负。
//所以没必要进行全盘搜索
char CFiveChess::JudegeWin(char cChessFlag)
{
int nRownCol;
int num1num2;
//判断横向
num1=0;num2=0;
for(nCol=m_nCurrentY-1;nCol>=0 && nCol>=m_nCurrentY-4;nCol--) //左边
if(m_cArr[m_nCurrentX][nCol]==cChessFlag)
num1++;
else
break;
for(nCol=m_nCurrentY+1;nCol if(m_cArr[m_nCurrentX][nCol]==cChessFlag)
num2++;
else
break;
if(num1+num2>=4)//左右两边相加大于等于4就说明满5了下同
return cChessFlag;
//判断纵向
num1=0;num2=0;
for(nRow=m_nCurrentX-1;nRow>=0 && nRow>=m_nCurrentX-4;nRow--)//上
if(m_cArr[nRow][m_nCurrentY]==cChessFlag)
num1++;
else
break;
for(nRow=m_nCurrentX+1;nRow if(m_cArr[nRow][m_nCurrentY]==cChessFlag)
num2++;
else
break;
if(num1+num2>=4)
return cChessFlag;
//判断‘\‘方向
num1=0;num2=0;
for(nRow=m_nCurrentX-1nCol=m_nCurrentY-1;nRow>=0 && nRow>=m_nCurrentX-4 && nCol>=0 && nCol>=m_nCurrentY-4;nRow--nCol--)//左上
if(m_cArr[nRow][nCol]==cChessFlag)
num1++;
else
break;
for(nRow=m_nCurrentX+1nCol=m_nCurrentY+1;nRow if(m_cArr[nRow][nCol]==cChessFlag)
num2++;
else
break;
if(num1+num2>=4)
return cChessFlag;
//判断‘/‘方向
num1=0;num2=0;
for(nRow=m_nCurrentX-1nCol=m_nCurrentY+1;nRow>=0 && nRow>=m_nCurrentX-4 && nCol if(m_cArr[nRow][nCol]==cChessFlag)
num1++;
else
break;
for(nRow=m_nCurrentX+1nCol=m_nCurrentY-1;nRow=0 && nCol>=m_nCurrentY-4;nRow++nCol--)//左下
if(m_cArr[nRow][nCol]==cChessFlag)
num2++;
else
break;
if(num1+num2>=4)
return cChessFlag;
if(m_nCount return SPACE;
return CHESS_PEACE; //在判断了其他情况后还未返回就是和棋了
}
//以下是人机对战函数
void CFiveChess::ComputerPlay(char cComputerchar cPeople)
{
int maxComputer=0maxPeople=0;//计算机和人的状态矩阵的最大值
//(即maxComputer是计算机最有价值点的值,maxPeople是人最有价值点的值初始化为0
int nRownCol;
int cxcypxpy;
for(nRow=0;nRow for(nCol=0;nCol computer[nRow][nCol]=people[nRow
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 614400 2012-02-03 19:20 五子棋.exe
文件 28415 2012-02-03 19:23 五子棋\Debug\FiveChess.obj
文件 13280 2012-02-03 19:23 五子棋\Debug\FiveChess.sbr
文件 3806 2012-02-03 19:23 五子棋\Debug\FivePos.obj
文件 562 2012-02-03 19:23 五子棋\Debug\FivePos.sbr
文件 19392 2012-02-03 19:23 五子棋\Debug\MainFrm.obj
文件 3622 2012-02-03 19:23 五子棋\Debug\MainFrm.sbr
文件 760 2012-01-27 23:02 五子棋\Debug\MAP_PP.sbr
文件 105882 2012-02-03 19:23 五子棋\Debug\StdAfx.obj
文件 1375299 2012-02-03 19:23 五子棋\Debug\StdAfx.sbr
文件 230400 2012-02-03 19:23 五子棋\Debug\vc60.idb
文件 397312 2012-02-03 19:23 五子棋\Debug\vc60.pdb
文件 3269632 2012-01-29 01:10 五子棋\Debug\五子棋.bsc
文件 495701 2012-02-03 19:23 五子棋\Debug\五子棋.exe
文件 358588 2012-02-03 19:23 五子棋\Debug\五子棋.ilk
文件 23032 2012-02-03 19:23 五子棋\Debug\五子棋.obj
文件 6882088 2012-02-03 19:23 五子棋\Debug\五子棋.pch
文件 377856 2012-02-03 19:23 五子棋\Debug\五子棋.pdb
文件 278824 2012-02-03 19:23 五子棋\Debug\五子棋.res
文件 8923 2012-02-03 19:23 五子棋\Debug\五子棋.sbr
文件 14820 2012-02-03 19:23 五子棋\Debug\五子棋Doc.obj
文件 7118 2012-02-03 19:23 五子棋\Debug\五子棋Doc.sbr
文件 76212 2012-02-03 19:23 五子棋\Debug\五子棋View.obj
文件 96355 2012-02-03 19:23 五子棋\Debug\五子棋View.sbr
文件 25028 2012-02-01 15:16 五子棋\FiveChess.cpp
文件 2261 2012-02-01 13:46 五子棋\FiveChess.h
文件 213 2012-01-23 21:11 五子棋\FivePos.cpp
文件 175 2012-01-23 21:14 五子棋\FivePos.h
文件 2596 2012-01-26 16:31 五子棋\MainFrm.cpp
文件 1581 2012-01-28 17:13 五子棋\MainFrm.h
............此处省略35个文件信息
- 上一篇:C++实现网络文件传输
- 下一篇:VC++ 共享内存读写操作
评论
共有 条评论