MFC课程设计五子棋汇编.docx

上传人:b****5 文档编号:11739769 上传时间:2023-03-31 格式:DOCX 页数:44 大小:56.54KB
下载 相关 举报
MFC课程设计五子棋汇编.docx_第1页
第1页 / 共44页
MFC课程设计五子棋汇编.docx_第2页
第2页 / 共44页
MFC课程设计五子棋汇编.docx_第3页
第3页 / 共44页
MFC课程设计五子棋汇编.docx_第4页
第4页 / 共44页
MFC课程设计五子棋汇编.docx_第5页
第5页 / 共44页
点击查看更多>>
下载资源
资源描述

MFC课程设计五子棋汇编.docx

《MFC课程设计五子棋汇编.docx》由会员分享,可在线阅读,更多相关《MFC课程设计五子棋汇编.docx(44页珍藏版)》请在冰豆网上搜索。

MFC课程设计五子棋汇编.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1