MFC课程设计五子棋.docx
- 文档编号:4292450
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:36
- 大小:54.11KB
MFC课程设计五子棋.docx
《MFC课程设计五子棋.docx》由会员分享,可在线阅读,更多相关《MFC课程设计五子棋.docx(36页珍藏版)》请在冰豆网上搜索。
MFC课程设计五子棋
Windows程序设计
课程考核报告
班级:
学号:
姓名:
得分:
2016年6月25日
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[MAXCREASE]; GetSameColor(uiCol,uiRow,emChessColor,iSameColor,m_iPositionPiece); for(intm=0;m if(iSameColor[m]>MAXCREASE) { m_emWin=(BLACK==emChessColor)? BLACK_WIN: WHITE_WI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 课程设计 五子棋