MFC课程设计五子棋汇编Word文件下载.docx
《MFC课程设计五子棋汇编Word文件下载.docx》由会员分享,可在线阅读,更多相关《MFC课程设计五子棋汇编Word文件下载.docx(44页珍藏版)》请在冰点文库上搜索。
![MFC课程设计五子棋汇编Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/faca91f3-ed2d-48f8-b235-e2d273537b84/faca91f3-ed2d-48f8-b235-e2d273537b841.gif)
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<
COLUMNS;
i++)
for(intj=0;
j<
ROWS;
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);
//标记当前棋子
下棋函数:
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])
//已有棋子的位置不做处理
2;
{
m_iPositionPiece[uiPosX][uiPosY]=m_bTurnBlack?
BLACK:
WHITE;
//-----------------------------------判断输赢-----------------------------------
if(IsWin(uiPosX,uiPosY,m_iPositionPiece[uiPosX][uiPosY]))
m_ptCurrent=CPoint(uiPosX,uiPosY);
//已分出胜负
}
//-----------------------------------记录上一次的棋子位置-----------------------------------
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&
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_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)
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()
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;
BOOLCChess:
IsWin(UINTuiCol,UINTuiRow,enumChessColoremChessColor)
{
intiSameColor[MA