MFC课程设计五子棋汇编.docx
《MFC课程设计五子棋汇编.docx》由会员分享,可在线阅读,更多相关《MFC课程设计五子棋汇编.docx(44页珍藏版)》请在冰豆网上搜索。
MFC课程设计五子棋汇编
Windows程序设计
课程考核报告
班级:
学号:
姓名:
得分:
2016年6月25日
1.设计目的及要求3
1.1设计目的及内容3
1.2设计要求3
1.3软件、硬件环境3
2.课程设计步骤4
3.课程设计内容15
3.1概要设计15
3.1.1程序总体框架描述15
3.1.2程序常用类声明16
3.2主要技术17
3.3系统设计结果(界面截图、操作流程)17
4.设计总结19
4.1遇到的问题及如何解决19
4.2体会19
5.源代码20
1.设计目的及要求
1.1设计目的及内容描述
1.了解Windows编程的基础知识,掌握MFC应用程序的基本知识;
2.基本掌握面向对象程序设计的基本思路和方法;
3.掌握用VC++开发应用程序的的一般步骤和方法;
4.能够利用所学的基本知识,设计一个简单的五子棋游戏,具有以下功能:
①数据结构的设计;五子棋棋盘的绘制。
②两人下棋时,两人下棋算法的设计。
③两人下棋时,判断任一方获胜的算法的设计。
1.2设计要求
用VS2010进行编码,实现应用程序的功能。
注重编码质量,代码要有适当的注释;
提交设计报告一份(课程设计任务书、目录、主要的数据结构、设计的基本思路、设计的步骤及主要代码、心得体会、参考文献)。
游戏规则:
首先可以在更多选项里面选择进行人人对战与人机对战,并可以在人机对战的功能框里选择难易程度。
当棋子连成有五个时游戏结束。
程序功能模块
棋局的绘制、保存、和AI三大块
1.3软件、硬件环境
软件:
Windows10操作系统,MicrosoftVisualstudio2010
硬件:
Inter(R)Core(TM)i5-4200HCPU@3.40GHz
2.课程设计步骤
新建单文档程序Gobang_FiveChess
接着就是定义变量了,但是,由于这个游戏要添加的变量和函数太多了,我们要建一个新类。
是否应该先添加应该类呢?
最好是这样。
因为新类将会涉及到变量。
添加普通类CChess
classCChess
{
public:
CChess(void);
~CChess(void);
voidInit(CRectrect);
voidDraw(CDC*pDC);//画棋局
voidSetPiecePos(CPointptCurrent);//设置当前棋子的位置下棋函数
voidNewGame();//新游戏
BOOLRegret();//悔棋
voidSetVSMode(enumVSModeemVSMode);//设置对战模式enumVSMode
voidSetAIDepth(intemAIDepth);//设置AI智能程度
enumWinFlagGetWinFlag();//获取输赢状况
CRectGetRectBoard();//获取棋盘区域
private:
enumChessColorm_iPositionPiece[COLUMNS][ROWS];//棋子的信息
CChessDrawm_chessdraw;//棋局绘制类
CRectm_rcBoard;//棋盘区域
CPointm_ptCurrent;//棋子当前位置
enumWinFlagm_emWin;//输赢状况
enumVSModem_emVSMode;//对战模式
STC_REGRETm_stcLastPos;//记录最近一次的下棋位置
BOOLm_bTurnBlack;//是否轮到黑方下棋
intm_emAIDepth;//AI智能程度为方便外部调用SetAIDepth(),所以设为了int类型
BOOLIsWin(UINTuiCol,UINTuiRow,enumChessColoremChessColor);//在第uiCol列第uiRow行,判断是否结束,若结束则返回TRUE
BOOLGetBestPosByAI(UINT&uiCol,UINT&uiRow,enumChessColoremEnemyChessColor=BLACK);//获取最好的下棋位置,机器都为白色
};
添加函数:
构造函数:
CChess:
:
CChess(void)
m_bTurnBlack=TRUE;
m_emWin=FIGHTING;
m_emVSMode=PERSON_VS_MACHINE;
m_emAIDepth=AI_MIDDLE;
m_ptCurrent=CPoint(-1,-1);//只要不在棋盘内的点都可以
memset(m_iPositionPiece,0,sizeof(m_iPositionPiece));
m_stcLastPos.iPieceNum=0;
m_stcLastPos.ptBlack=CPoint(0,0);
m_stcLastPos.ptWhite=CPoint(0,0);
m_stcLastPos.ptLastCurPoint=CPoint(-1,-1);
}
画图函数:
voidCChess:
Draw(CDC*pDC)
CMyMemDCmemDC(pDC);
m_chessdraw.SetDC(memDC);
m_chessdraw.DrawBackground();
m_chessdraw.DrawBoard();
//-----------------------重画整个棋局-----------------------
if(FIGHTING==m_emWin)//没分胜负时才允许改变m_emWin的状态
m_emWin=PEACE;
for(inti=0;i{for(intj=0;j{if(NONE!=m_iPositionPiece[i][j]){m_chessdraw.DrawPiece(i,j,BLACK==m_iPositionPiece[i][j]);}elseif(PEACE==m_emWin){m_emWin=FIGHTING;//若有空位,则还可以继续,否则平局,即m_emWin=PEACE;}}}m_chessdraw.DrawPieceCur(m_ptCurrent.x,m_ptCurrent.y);//标记当前棋子下棋函数:voidCChess::SetPiecePos(CPointptCurrent){if(FIGHTING!=m_emWin){return;//没分胜负时才允许改变m_ptCurrent的状态}UINTuiPosX,uiPosY;if(!m_chessdraw.GetCoordinateWithPoint(ptCurrent,&uiPosX,&uiPosY)){return;//不在棋盘内的位置不做处理}if(NONE!=m_iPositionPiece[uiPosX][uiPosY]){return;//已有棋子的位置不做处理} for(inti=0;i<2;i++){m_iPositionPiece[uiPosX][uiPosY]=m_bTurnBlack?BLACK:WHITE;//-----------------------------------判断输赢-----------------------------------if(IsWin(uiPosX,uiPosY,m_iPositionPiece[uiPosX][uiPosY])){m_ptCurrent=CPoint(uiPosX,uiPosY);return;//已分出胜负}//-----------------------------------记录上一次的棋子位置-----------------------------------if((PERSON_VS_PERSON==m_emVSMode)||(m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode))){m_stcLastPos.ptLastCurPoint=m_ptCurrent;}if(m_bTurnBlack){m_stcLastPos.ptBlack=CPoint(uiPosX,uiPosY);}else{m_stcLastPos.ptWhite=CPoint(uiPosX,uiPosY);}m_stcLastPos.iPieceNum++;m_ptCurrent=CPoint(uiPosX,uiPosY);//-----------------------------------轮到白方下棋-----------------------------------m_bTurnBlack=!m_bTurnBlack;if((!m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode))){if(!GetBestPosByAI(uiPosX,uiPosY,(!m_bTurnBlack)?BLACK:WHITE)){return;//已分出胜负}}if(PERSON_VS_PERSON==m_emVSMode){break;//如果是人人对战,则退出循环}}}enumWinFlagCChess::GetWinFlag(){returnm_emWin;}悔棋函数: OOLCChess::Regret(){if((m_stcLastPos.iPieceNum>0)&&(FIGHTING==m_emWin))//如已分出胜负,则不再允许悔棋{m_stcLastPos.iPieceNum=0;//只允许悔一步m_ptCurrent=m_stcLastPos.ptLastCurPoint;if(PERSON_VS_MACHINE==m_emVSMode){m_iPositionPiece[m_stcLastPos.ptBlack.x][m_stcLastPos.ptBlack.y]=NONE;m_iPositionPiece[m_stcLastPos.ptWhite.x][m_stcLastPos.ptWhite.y]=NONE;}if(PERSON_VS_PERSON==m_emVSMode){if(!m_bTurnBlack){m_iPositionPiece[m_stcLastPos.ptBlack.x][m_stcLastPos.ptBlack.y]=NONE;}else{m_iPositionPiece[m_stcLastPos.ptWhite.x][m_stcLastPos.ptWhite.y]=NONE;}m_bTurnBlack=!m_bTurnBlack;}returnTRUE;}returnFALSE;设置对战模式: voidCChess::SetVSMode(enumVSModeemVSMode){m_emVSMode=emVSMode;}voidCChess::SetAIDepth(intemAIDepth){m_emAIDepth=emAIDepth;} 3.课程设计内容3.1概要设计游戏的操作方面主要以鼠标点击为主,鼠标点击方格里面进行落子操作。选择人人对战,人机对战(选择对战难度),五子连棋时就判断白方或者黑方胜利。3.1.1程序总体框架描述 3.1.2本项目主要有棋局绘制、棋局功能、机器AI三个类,主要源码文件如下图3.2主要技术1.界面的设置2.下棋处理函数;3.视图框架设置;4.机器AI算法。5.功能的设置。 3.3系统设计结果(界面截图、操作流程)1.界面截图:此为困难级别,白色为机器方。操作流程图 4.设计总结4.1遇到的问题及如何解决随着五子棋游戏的开发完成,本游戏中预期的主要功能也基本实现。本系统以Visualstudio2010作为前台开发工具,Visualstudio2010以简单、易用等优点成为开发本系统的首选工具。本论文阐述了五子棋游戏的分析与设计的全过程,并在论文中相应的位置插入了图片、流程图以及一些具有技巧性的程序代码,更加清晰的描述了该游戏是如何实现的。五子棋游戏是一款益智类游戏,该游戏与那些网络游戏和3D游戏相比,它有编写简单容易上手等特点,非常适合人们在完成工作的时候适当的娱乐要求。这些小游戏大都是以益智和娱乐为目的,不仅给紧张工作的人们以放松,还可以让人们的大脑得到开发。由于我学习Visualstudio2010和MFC的时间比较短,其中的很多知识还没有了解和掌握,当然出现了很多错误,在设计过程中出现鼠标不响应操作的现象,这是因为定义鼠标函数时出现了错误;在设计过程中对位图的设置不够了解,总是不能调用位图,通过XX,才知道缺少了一部分代码;对于分号、引号的符号出现了不少的错误,主要是中英文切换时没注意,导致编译出错;完成程序之后,对程序进行编译,系统总是提示链接出错,经过仔细检查没有找到语句或定义错误,后来发现是电脑问题,我在任务管理器中结束wkh.exe。再次链接,错误就消除了。4.2体会在五子棋游戏中有些功能还不够完善,例如在五子棋游戏中不能实现游戏的保存和声音的添加。希望在以后的工作和学习中不断的充实自己的知识结构,把扫雷游戏的功能进一步完善,使它成为一个更具有实用价值的游戏软件,同时也恳请老师给予批评指正。 5.源代码CChess::CChess(void){m_bTurnBlack=TRUE;m_emWin=FIGHTING;m_emVSMode=PERSON_VS_MACHINE;m_emAIDepth=AI_MIDDLE;m_ptCurrent=CPoint(-1,-1);//只要不在棋盘内的点都可以memset(m_iPositionPiece,0,sizeof(m_iPositionPiece));m_stcLastPos.iPieceNum=0;m_stcLastPos.ptBlack=CPoint(0,0);m_stcLastPos.ptWhite=CPoint(0,0);m_stcLastPos.ptLastCurPoint=CPoint(-1,-1);}CChess::~CChess(void){NewGame();}voidCChess::NewGame(){m_bTurnBlack=TRUE;m_emWin=FIGHTING;m_ptCurrent=CPoint(-1,-1);memset(m_iPositionPiece,0,sizeof(m_iPositionPiece));m_stcLastPos.iPieceNum=0;m_stcLastPos.ptBlack=CPoint(0,0);m_stcLastPos.ptWhite=CPoint(0,0);m_stcLastPos.ptLastCurPoint=CPoint(-1,-1);if(MACHINE_VS_MACHINE==m_emVSMode){CPointptFirst;srand(time(NULL));ptFirst.x=rand()%COLUMNS;ptFirst.y=rand()%ROWS;m_chessdraw.GetPointWithCoordinate(ptFirst,ptFirst.x,ptFirst.y);SetPiecePos(ptFirst);}}voidCChess::Init(CRectrect){m_chessdraw.InitBoard(rect,COLUMNS,ROWS,rect.Height()/ROWS,rect.Height()/ROWS/2-2);m_rcBoard=m_chessdraw.GetRectBoard();}CRectCChess::GetRectBoard(){returnm_rcBoard;}voidCChess::Draw(CDC*pDC){CMyMemDCmemDC(pDC);m_chessdraw.SetDC(memDC);m_chessdraw.DrawBackground();m_chessdraw.DrawBoard();//-----------------------重画整个棋局-----------------------if(FIGHTING==m_emWin)//没分胜负时才允许改变m_emWin的状态{m_emWin=PEACE;}for(inti=0;i{for(intj=0;j{if(NONE!=m_iPositionPiece[i][j]){m_chessdraw.DrawPiece(i,j,BLACK==m_iPositionPiece[i][j]);}elseif(PEACE==m_emWin){m_emWin=FIGHTING;//若有空位,则还可以继续,否则平局,即m_emWin=PEACE;}}}m_chessdraw.DrawPieceCur(m_ptCurrent.x,m_ptCurrent.y);//标记当前棋子}voidCChess::SetPiecePos(CPointptCurrent){if(FIGHTING!=m_emWin){return;//没分胜负时才允许改变m_ptCurrent的状态}UINTuiPosX,uiPosY;if(!m_chessdraw.GetCoordinateWithPoint(ptCurrent,&uiPosX,&uiPosY)){return;//不在棋盘内的位置不做处理}if(NONE!=m_iPositionPiece[uiPosX][uiPosY]){return;//已有棋子的位置不做处理} for(inti=0;i<2;i++){m_iPositionPiece[uiPosX][uiPosY]=m_bTurnBlack?BLACK:WHITE;//-----------------------------------判断输赢-----------------------------------if(IsWin(uiPosX,uiPosY,m_iPositionPiece[uiPosX][uiPosY])){m_ptCurrent=CPoint(uiPosX,uiPosY);return;//已分出胜负}//-----------------------------------记录上一次的棋子位置-----------------------------------if((PERSON_VS_PERSON==m_emVSMode)||(m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode))){m_stcLastPos.ptLastCurPoint=m_ptCurrent;}if(m_bTurnBlack){m_stcLastPos.ptBlack=CPoint(uiPosX,uiPosY);}else{m_stcLastPos.ptWhite=CPoint(uiPosX,uiPosY);}m_stcLastPos.iPieceNum++;m_ptCurrent=CPoint(uiPosX,uiPosY);//-----------------------------------轮到白方下棋-----------------------------------m_bTurnBlack=!m_bTurnBlack;if((!m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode))){if(!GetBestPosByAI(uiPosX,uiPosY,(!m_bTurnBlack)?BLACK:WHITE)){return;//已分出胜负}}if(PERSON_VS_PERSON==m_emVSMode){break;//如果是人人对战,则退出循环}}}enumWinFlagCChess::GetWinFlag(){returnm_emWin;}BOOLCChess::IsWin(UINTuiCol,UINTuiRow,enumChessColoremChessColor){intiSameColor[MA
for(intj=0;j{if(NONE!=m_iPositionPiece[i][j]){m_chessdraw.DrawPiece(i,j,BLACK==m_iPositionPiece[i][j]);}elseif(PEACE==m_emWin){m_emWin=FIGHTING;//若有空位,则还可以继续,否则平局,即m_emWin=PEACE;}}}m_chessdraw.DrawPieceCur(m_ptCurrent.x,m_ptCurrent.y);//标记当前棋子下棋函数:voidCChess::SetPiecePos(CPointptCurrent){if(FIGHTING!=m_emWin){return;//没分胜负时才允许改变m_ptCurrent的状态}UINTuiPosX,uiPosY;if(!m_chessdraw.GetCoordinateWithPoint(ptCurrent,&uiPosX,&uiPosY)){return;//不在棋盘内的位置不做处理}if(NONE!=m_iPositionPiece[uiPosX][uiPosY]){return;//已有棋子的位置不做处理} for(inti=0;i<2;i++){m_iPositionPiece[uiPosX][uiPosY]=m_bTurnBlack?BLACK:WHITE;//-----------------------------------判断输赢-----------------------------------if(IsWin(uiPosX,uiPosY,m_iPositionPiece[uiPosX][uiPosY])){m_ptCurrent=CPoint(uiPosX,uiPosY);return;//已分出胜负}//-----------------------------------记录上一次的棋子位置-----------------------------------if((PERSON_VS_PERSON==m_emVSMode)||(m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode))){m_stcLastPos.ptLastCurPoint=m_ptCurrent;}if(m_bTurnBlack){m_stcLastPos.ptBlack=CPoint(uiPosX,uiPosY);}else{m_stcLastPos.ptWhite=CPoint(uiPosX,uiPosY);}m_stcLastPos.iPieceNum++;m_ptCurrent=CPoint(uiPosX,uiPosY);//-----------------------------------轮到白方下棋-----------------------------------m_bTurnBlack=!m_bTurnBlack;if((!m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode))){if(!GetBestPosByAI(uiPosX,uiPosY,(!m_bTurnBlack)?BLACK:WHITE)){return;//已分出胜负}}if(PERSON_VS_PERSON==m_emVSMode){break;//如果是人人对战,则退出循环}}}enumWinFlagCChess::GetWinFlag(){returnm_emWin;}悔棋函数: OOLCChess::Regret(){if((m_stcLastPos.iPieceNum>0)&&(FIGHTING==m_emWin))//如已分出胜负,则不再允许悔棋{m_stcLastPos.iPieceNum=0;//只允许悔一步m_ptCurrent=m_stcLastPos.ptLastCurPoint;if(PERSON_VS_MACHINE==m_emVSMode){m_iPositionPiece[m_stcLastPos.ptBlack.x][m_stcLastPos.ptBlack.y]=NONE;m_iPositionPiece[m_stcLastPos.ptWhite.x][m_stcLastPos.ptWhite.y]=NONE;}if(PERSON_VS_PERSON==m_emVSMode){if(!m_bTurnBlack){m_iPositionPiece[m_stcLastPos.ptBlack.x][m_stcLastPos.ptBlack.y]=NONE;}else{m_iPositionPiece[m_stcLastPos.ptWhite.x][m_stcLastPos.ptWhite.y]=NONE;}m_bTurnBlack=!m_bTurnBlack;}returnTRUE;}returnFALSE;设置对战模式: voidCChess::SetVSMode(enumVSModeemVSMode){m_emVSMode=emVSMode;}voidCChess::SetAIDepth(intemAIDepth){m_emAIDepth=emAIDepth;} 3.课程设计内容3.1概要设计游戏的操作方面主要以鼠标点击为主,鼠标点击方格里面进行落子操作。选择人人对战,人机对战(选择对战难度),五子连棋时就判断白方或者黑方胜利。3.1.1程序总体框架描述 3.1.2本项目主要有棋局绘制、棋局功能、机器AI三个类,主要源码文件如下图3.2主要技术1.界面的设置2.下棋处理函数;3.视图框架设置;4.机器AI算法。5.功能的设置。 3.3系统设计结果(界面截图、操作流程)1.界面截图:此为困难级别,白色为机器方。操作流程图 4.设计总结4.1遇到的问题及如何解决随着五子棋游戏的开发完成,本游戏中预期的主要功能也基本实现。本系统以Visualstudio2010作为前台开发工具,Visualstudio2010以简单、易用等优点成为开发本系统的首选工具。本论文阐述了五子棋游戏的分析与设计的全过程,并在论文中相应的位置插入了图片、流程图以及一些具有技巧性的程序代码,更加清晰的描述了该游戏是如何实现的。五子棋游戏是一款益智类游戏,该游戏与那些网络游戏和3D游戏相比,它有编写简单容易上手等特点,非常适合人们在完成工作的时候适当的娱乐要求。这些小游戏大都是以益智和娱乐为目的,不仅给紧张工作的人们以放松,还可以让人们的大脑得到开发。由于我学习Visualstudio2010和MFC的时间比较短,其中的很多知识还没有了解和掌握,当然出现了很多错误,在设计过程中出现鼠标不响应操作的现象,这是因为定义鼠标函数时出现了错误;在设计过程中对位图的设置不够了解,总是不能调用位图,通过XX,才知道缺少了一部分代码;对于分号、引号的符号出现了不少的错误,主要是中英文切换时没注意,导致编译出错;完成程序之后,对程序进行编译,系统总是提示链接出错,经过仔细检查没有找到语句或定义错误,后来发现是电脑问题,我在任务管理器中结束wkh.exe。再次链接,错误就消除了。4.2体会在五子棋游戏中有些功能还不够完善,例如在五子棋游戏中不能实现游戏的保存和声音的添加。希望在以后的工作和学习中不断的充实自己的知识结构,把扫雷游戏的功能进一步完善,使它成为一个更具有实用价值的游戏软件,同时也恳请老师给予批评指正。 5.源代码CChess::CChess(void){m_bTurnBlack=TRUE;m_emWin=FIGHTING;m_emVSMode=PERSON_VS_MACHINE;m_emAIDepth=AI_MIDDLE;m_ptCurrent=CPoint(-1,-1);//只要不在棋盘内的点都可以memset(m_iPositionPiece,0,sizeof(m_iPositionPiece));m_stcLastPos.iPieceNum=0;m_stcLastPos.ptBlack=CPoint(0,0);m_stcLastPos.ptWhite=CPoint(0,0);m_stcLastPos.ptLastCurPoint=CPoint(-1,-1);}CChess::~CChess(void){NewGame();}voidCChess::NewGame(){m_bTurnBlack=TRUE;m_emWin=FIGHTING;m_ptCurrent=CPoint(-1,-1);memset(m_iPositionPiece,0,sizeof(m_iPositionPiece));m_stcLastPos.iPieceNum=0;m_stcLastPos.ptBlack=CPoint(0,0);m_stcLastPos.ptWhite=CPoint(0,0);m_stcLastPos.ptLastCurPoint=CPoint(-1,-1);if(MACHINE_VS_MACHINE==m_emVSMode){CPointptFirst;srand(time(NULL));ptFirst.x=rand()%COLUMNS;ptFirst.y=rand()%ROWS;m_chessdraw.GetPointWithCoordinate(ptFirst,ptFirst.x,ptFirst.y);SetPiecePos(ptFirst);}}voidCChess::Init(CRectrect){m_chessdraw.InitBoard(rect,COLUMNS,ROWS,rect.Height()/ROWS,rect.Height()/ROWS/2-2);m_rcBoard=m_chessdraw.GetRectBoard();}CRectCChess::GetRectBoard(){returnm_rcBoard;}voidCChess::Draw(CDC*pDC){CMyMemDCmemDC(pDC);m_chessdraw.SetDC(memDC);m_chessdraw.DrawBackground();m_chessdraw.DrawBoard();//-----------------------重画整个棋局-----------------------if(FIGHTING==m_emWin)//没分胜负时才允许改变m_emWin的状态{m_emWin=PEACE;}for(inti=0;i{for(intj=0;j{if(NONE!=m_iPositionPiece[i][j]){m_chessdraw.DrawPiece(i,j,BLACK==m_iPositionPiece[i][j]);}elseif(PEACE==m_emWin){m_emWin=FIGHTING;//若有空位,则还可以继续,否则平局,即m_emWin=PEACE;}}}m_chessdraw.DrawPieceCur(m_ptCurrent.x,m_ptCurrent.y);//标记当前棋子}voidCChess::SetPiecePos(CPointptCurrent){if(FIGHTING!=m_emWin){return;//没分胜负时才允许改变m_ptCurrent的状态}UINTuiPosX,uiPosY;if(!m_chessdraw.GetCoordinateWithPoint(ptCurrent,&uiPosX,&uiPosY)){return;//不在棋盘内的位置不做处理}if(NONE!=m_iPositionPiece[uiPosX][uiPosY]){return;//已有棋子的位置不做处理} for(inti=0;i<2;i++){m_iPositionPiece[uiPosX][uiPosY]=m_bTurnBlack?BLACK:WHITE;//-----------------------------------判断输赢-----------------------------------if(IsWin(uiPosX,uiPosY,m_iPositionPiece[uiPosX][uiPosY])){m_ptCurrent=CPoint(uiPosX,uiPosY);return;//已分出胜负}//-----------------------------------记录上一次的棋子位置-----------------------------------if((PERSON_VS_PERSON==m_emVSMode)||(m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode))){m_stcLastPos.ptLastCurPoint=m_ptCurrent;}if(m_bTurnBlack){m_stcLastPos.ptBlack=CPoint(uiPosX,uiPosY);}else{m_stcLastPos.ptWhite=CPoint(uiPosX,uiPosY);}m_stcLastPos.iPieceNum++;m_ptCurrent=CPoint(uiPosX,uiPosY);//-----------------------------------轮到白方下棋-----------------------------------m_bTurnBlack=!m_bTurnBlack;if((!m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode))){if(!GetBestPosByAI(uiPosX,uiPosY,(!m_bTurnBlack)?BLACK:WHITE)){return;//已分出胜负}}if(PERSON_VS_PERSON==m_emVSMode){break;//如果是人人对战,则退出循环}}}enumWinFlagCChess::GetWinFlag(){returnm_emWin;}BOOLCChess::IsWin(UINTuiCol,UINTuiRow,enumChessColoremChessColor){intiSameColor[MA
if(NONE!
=m_iPositionPiece[i][j])
m_chessdraw.DrawPiece(i,j,BLACK==m_iPositionPiece[i][j]);
elseif(PEACE==m_emWin)
m_emWin=FIGHTING;//若有空位,则还可以继续,否则平局,即m_emWin=PEACE;
m_chessdraw.DrawPieceCur(m_ptCurrent.x,m_ptCurrent.y);//标记当前棋子
下棋函数:
SetPiecePos(CPointptCurrent)
if(FIGHTING!
=m_emWin)
return;//没分胜负时才允许改变m_ptCurrent的状态
UINTuiPosX,uiPosY;
if(!
m_chessdraw.GetCoordinateWithPoint(ptCurrent,&uiPosX,&uiPosY))
return;//不在棋盘内的位置不做处理
=m_iPositionPiece[uiPosX][uiPosY])
return;//已有棋子的位置不做处理
for(inti=0;i<2;i++)
m_iPositionPiece[uiPosX][uiPosY]=m_bTurnBlack?
BLACK:
WHITE;
//-----------------------------------判断输赢-----------------------------------
if(IsWin(uiPosX,uiPosY,m_iPositionPiece[uiPosX][uiPosY]))
m_ptCurrent=CPoint(uiPosX,uiPosY);
return;//已分出胜负
//-----------------------------------记录上一次的棋子位置-----------------------------------
if((PERSON_VS_PERSON==m_emVSMode)||(m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode)))
m_stcLastPos.ptLastCurPoint=m_ptCurrent;
if(m_bTurnBlack)
m_stcLastPos.ptBlack=CPoint(uiPosX,uiPosY);
else
m_stcLastPos.ptWhite=CPoint(uiPosX,uiPosY);
m_stcLastPos.iPieceNum++;
//-----------------------------------轮到白方下棋-----------------------------------
m_bTurnBlack=!
m_bTurnBlack;
if((!
m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode)))
GetBestPosByAI(uiPosX,uiPosY,(!
m_bTurnBlack)?
WHITE))
if(PERSON_VS_PERSON==m_emVSMode)
break;//如果是人人对战,则退出循环
enumWinFlagCChess:
GetWinFlag()
returnm_emWin;
悔棋函数:
OOLCChess:
Regret()
if((m_stcLastPos.iPieceNum>0)&&(FIGHTING==m_emWin))//如已分出胜负,则不再允许悔棋
m_stcLastPos.iPieceNum=0;//只允许悔一步
m_ptCurrent=m_stcLastPos.ptLastCurPoint;
if(PERSON_VS_MACHINE==m_emVSMode)
m_iPositionPiece[m_stcLastPos.ptBlack.x][m_stcLastPos.ptBlack.y]=NONE;
m_iPositionPiece[m_stcLastPos.ptWhite.x][m_stcLastPos.ptWhite.y]=NONE;
m_bTurnBlack)
returnTRUE;
returnFALSE;
设置对战模式:
SetVSMode(enumVSModeemVSMode)
m_emVSMode=emVSMode;
SetAIDepth(intemAIDepth)
m_emAIDepth=emAIDepth;
3.课程设计内容
3.1概要设计
游戏的操作方面主要以鼠标点击为主,鼠标点击方格里面进行落子操作。
选择人人对战,人机对战(选择对战难度),五子连棋时就判断白方或者黑方胜利。
3.1.1程序总体框架描述
3.1.2本项目主要有棋局绘制、棋局功能、机器AI三个类,主要源码文件如下图
3.2主要技术
1.界面的设置
2.下棋处理函数;
3.视图框架设置;
4.机器AI算法。
5.功能的设置。
3.3系统设计结果(界面截图、操作流程)
1.界面截图:
此为困难级别,白色为机器方。
操作流程图
4.设计总结
4.1遇到的问题及如何解决
随着五子棋游戏的开发完成,本游戏中预期的主要功能也基本实现。
本系统以Visualstudio2010作为前台开发工具,Visualstudio2010以简单、易用等优点成为开发本系统的首选工具。
本论文阐述了五子棋游戏的分析与设计的全过程,并在论文中相应的位置插入了图片、流程图以及一些具有技巧性的程序代码,更加清晰的描述了该游戏是如何实现的。
五子棋游戏是一款益智类游戏,该游戏与那些网络游戏和3D游戏相比,它有编写简单容易上手等特点,非常适合人们在完成工作的时候适当的娱乐要求。
这些小游戏大都是以益智和娱乐为目的,不仅给紧张工作的人们以放松,还可以让人们的大脑得到开发。
由于我学习Visualstudio2010和MFC的时间比较短,其中的很多知识还没有了解和掌握,当然出现了很多错误,
在设计过程中出现鼠标不响应操作的现象,这是因为定义鼠标函数时出现了错误;
在设计过程中对位图的设置不够了解,总是不能调用位图,通过XX,才知道缺少了一部分代码;
对于分号、引号的符号出现了不少的错误,主要是中英文切换时没注意,导致编译出错;
完成程序之后,对程序进行编译,系统总是提示链接出错,经过仔细检查没有找到语句或定义错误,后来发现是电脑问题,我在任务管理器中结束wkh.exe。
再次链接,错误就消除了。
4.2体会
在五子棋游戏中有些功能还不够完善,例如在五子棋游戏中不能实现游戏的保存和声音的添加。
希望在以后的工作和学习中不断的充实自己的知识结构,把扫雷游戏的功能进一步完善,使它成为一个更具有实用价值的游戏软件,同时也恳请老师给予批评指正。
5.源代码
~CChess(void)
NewGame();
NewGame()
m_ptCurrent=CPoint(-1,-1);
if(MACHINE_VS_MACHINE==m_emVSMode)
CPointptFirst;
srand(time(NULL));
ptFirst.x=rand()%COLUMNS;
ptFirst.y=rand()%ROWS;
m_chessdraw.GetPointWithCoordinate(ptFirst,ptFirst.x,ptFirst.y);
SetPiecePos(ptFirst);
Init(CRectrect)
m_chessdraw.InitBoard(rect,COLUMNS,ROWS,rect.Height()/ROWS,rect.Height()/ROWS/2-2);
m_rcBoard=m_chessdraw.GetRectBoard();
CRectCChess:
GetRectBoard()
returnm_rcBoard;
for(inti=0;i{for(intj=0;j{if(NONE!=m_iPositionPiece[i][j]){m_chessdraw.DrawPiece(i,j,BLACK==m_iPositionPiece[i][j]);}elseif(PEACE==m_emWin){m_emWin=FIGHTING;//若有空位,则还可以继续,否则平局,即m_emWin=PEACE;}}}m_chessdraw.DrawPieceCur(m_ptCurrent.x,m_ptCurrent.y);//标记当前棋子}voidCChess::SetPiecePos(CPointptCurrent){if(FIGHTING!=m_emWin){return;//没分胜负时才允许改变m_ptCurrent的状态}UINTuiPosX,uiPosY;if(!m_chessdraw.GetCoordinateWithPoint(ptCurrent,&uiPosX,&uiPosY)){return;//不在棋盘内的位置不做处理}if(NONE!=m_iPositionPiece[uiPosX][uiPosY]){return;//已有棋子的位置不做处理} for(inti=0;i<2;i++){m_iPositionPiece[uiPosX][uiPosY]=m_bTurnBlack?BLACK:WHITE;//-----------------------------------判断输赢-----------------------------------if(IsWin(uiPosX,uiPosY,m_iPositionPiece[uiPosX][uiPosY])){m_ptCurrent=CPoint(uiPosX,uiPosY);return;//已分出胜负}//-----------------------------------记录上一次的棋子位置-----------------------------------if((PERSON_VS_PERSON==m_emVSMode)||(m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode))){m_stcLastPos.ptLastCurPoint=m_ptCurrent;}if(m_bTurnBlack){m_stcLastPos.ptBlack=CPoint(uiPosX,uiPosY);}else{m_stcLastPos.ptWhite=CPoint(uiPosX,uiPosY);}m_stcLastPos.iPieceNum++;m_ptCurrent=CPoint(uiPosX,uiPosY);//-----------------------------------轮到白方下棋-----------------------------------m_bTurnBlack=!m_bTurnBlack;if((!m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode))){if(!GetBestPosByAI(uiPosX,uiPosY,(!m_bTurnBlack)?BLACK:WHITE)){return;//已分出胜负}}if(PERSON_VS_PERSON==m_emVSMode){break;//如果是人人对战,则退出循环}}}enumWinFlagCChess::GetWinFlag(){returnm_emWin;}BOOLCChess::IsWin(UINTuiCol,UINTuiRow,enumChessColoremChessColor){intiSameColor[MA
for(intj=0;j{if(NONE!=m_iPositionPiece[i][j]){m_chessdraw.DrawPiece(i,j,BLACK==m_iPositionPiece[i][j]);}elseif(PEACE==m_emWin){m_emWin=FIGHTING;//若有空位,则还可以继续,否则平局,即m_emWin=PEACE;}}}m_chessdraw.DrawPieceCur(m_ptCurrent.x,m_ptCurrent.y);//标记当前棋子}voidCChess::SetPiecePos(CPointptCurrent){if(FIGHTING!=m_emWin){return;//没分胜负时才允许改变m_ptCurrent的状态}UINTuiPosX,uiPosY;if(!m_chessdraw.GetCoordinateWithPoint(ptCurrent,&uiPosX,&uiPosY)){return;//不在棋盘内的位置不做处理}if(NONE!=m_iPositionPiece[uiPosX][uiPosY]){return;//已有棋子的位置不做处理} for(inti=0;i<2;i++){m_iPositionPiece[uiPosX][uiPosY]=m_bTurnBlack?BLACK:WHITE;//-----------------------------------判断输赢-----------------------------------if(IsWin(uiPosX,uiPosY,m_iPositionPiece[uiPosX][uiPosY])){m_ptCurrent=CPoint(uiPosX,uiPosY);return;//已分出胜负}//-----------------------------------记录上一次的棋子位置-----------------------------------if((PERSON_VS_PERSON==m_emVSMode)||(m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode))){m_stcLastPos.ptLastCurPoint=m_ptCurrent;}if(m_bTurnBlack){m_stcLastPos.ptBlack=CPoint(uiPosX,uiPosY);}else{m_stcLastPos.ptWhite=CPoint(uiPosX,uiPosY);}m_stcLastPos.iPieceNum++;m_ptCurrent=CPoint(uiPosX,uiPosY);//-----------------------------------轮到白方下棋-----------------------------------m_bTurnBlack=!m_bTurnBlack;if((!m_bTurnBlack&&(PERSON_VS_MACHINE==m_emVSMode))){if(!GetBestPosByAI(uiPosX,uiPosY,(!m_bTurnBlack)?BLACK:WHITE)){return;//已分出胜负}}if(PERSON_VS_PERSON==m_emVSMode){break;//如果是人人对战,则退出循环}}}enumWinFlagCChess::GetWinFlag(){returnm_emWin;}BOOLCChess::IsWin(UINTuiCol,UINTuiRow,enumChessColoremChessColor){intiSameColor[MA
BOOLCChess:
IsWin(UINTuiCol,UINTuiRow,enumChessColoremChessColor)
intiSameColor[MA
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1