五子棋游戏的设计与实现文档格式.docx

上传人:b****3 文档编号:16410520 上传时间:2022-11-23 格式:DOCX 页数:14 大小:406.78KB
下载 相关 举报
五子棋游戏的设计与实现文档格式.docx_第1页
第1页 / 共14页
五子棋游戏的设计与实现文档格式.docx_第2页
第2页 / 共14页
五子棋游戏的设计与实现文档格式.docx_第3页
第3页 / 共14页
五子棋游戏的设计与实现文档格式.docx_第4页
第4页 / 共14页
五子棋游戏的设计与实现文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

五子棋游戏的设计与实现文档格式.docx

《五子棋游戏的设计与实现文档格式.docx》由会员分享,可在线阅读,更多相关《五子棋游戏的设计与实现文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

五子棋游戏的设计与实现文档格式.docx

1.1概述

MicrosoftVisualC++是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。

它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。

它以拥有“语法高亮”,IntelliSense(自动编译功能)以及高级除错功能而著称。

比如,它允许用户进行远程调试,单步执行等。

还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。

其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。

这些特征明显缩短程式编辑、编译及连结的时间花费,在大型软件计划上尤其显著。

1.2开发平台

1.2.1开发环境

MicrosoftvisualC++(简称VisualC++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。

VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(WIndowsAPI)、三维动画DirectXAPI,Microsoft.NET框架。

1.2.2运行环境

能够正常使用的WindowsXP或Windows7,对系统配置的要求不是很高,中等的电脑配置都可以很好的运行了,当然高配置效果会更好。

安装了MicrosoftvisualC++编程环境,并能正常使用,就能够正常运行。

2开发设计

2.1概要设计

2.1.1流程图

图2-1设计流程图

2.1.2功能分析

程序设计简洁得体,布局合理,五子棋游戏的基本功能齐全。

根据窗口菜单中的文字提示,用户可以很容易的开始五子棋游戏。

游戏模式为人机对弈。

进入该模式后默认的为电脑先下,后玩家在落棋子。

游戏中人机对弈中电脑能够实现每一步都通过计算最佳落子位置,然后做出相应的操作,玩家要赢有难度!

程序有很好的退出关闭功能。

程序编程规范,具有良好的编程风格。

2.2详细设计

(1)程序中创建了一个CMyChessDlg类,通过OnInitDiog函数来实现对棋盘的初始化,建立一个[15*15]的棋盘。

该棋盘的界面通过调用已经存入程序中图片来设置一个友好的游戏界面,通过VC++程序实现对游戏界面的合理调整绘制,得到如图所示的界面如图2-2所示。

图2-2棋盘界面

具体实现代码如下:

BOOLCMyChessDlg:

:

OnInitDialog()

{CDialog:

OnInitDialog();

ASSERT((IDM_ABOUTBOX&

0xFFF0)==IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX<

0xF000);

CMenu*pSysMenu=GetSystemMenu(FALSE);

if(pSysMenu!

=NULL)

{CStringstrAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

}

if(!

strAboutMenu.IsEmpty())

{pSysMenu->

AppendMenu(MF_SEPARATOR);

pSysMenu->

AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);

}

SetIcon(m_hIcon,TRUE);

SetIcon(m_hIcon,FALSE);

fivechess.m_board.LoadBitmap(IDB_CHESSBOARD);

/四幅图的设置

fivechess.m_blackchess.LoadBitmap(IDB_BLACKCHESS);

fivechess.m_whitechess.LoadBitmap(IDB_WHITECHESS);

fivechess.m_black.LoadBitmap(IDB_BLACK);

//四幅图的设置

fivechess.Reset();

returnTRUE;

}

⑵第二步再实现如何设置白棋(电脑)和黑棋(玩家)的下法,默认的为电脑先落子,玩家再落子,已经有棋子的地方是不能重复落子的。

玩家点击下棋的位置选择,代码如下:

if(fivechess.m_begin==false)//如果已经需要落子的地方已经有棋子,则返回

return;

if(fivechess.m_winner!

=0)//如果已经有玩家赢了,则返回

return;

if(point.x>

=5&

&

point.x<

=529&

point.y>

point.y<

=529)//判断落子的位置

{x=(int)(point.x-23)/35;

y=(int)(point.y-23)/35;

if(point.x-23-x*35>

=17)

x++;

if(point.y-23-y*35>

y++;

if(fivechess.m_currBoard[x][y]==0)//如果该位置无落子

{if(fivechess.m_chess==-1)

fivechess.GetInput(x,y);

else

{MessageBox("

请从新输入棋子!

"

);

return;

Reflesh();

电脑后通过准确的判定,是四子相连、三子相连、两子相连还是一个棋子,得出最佳落子位置,再执行落子操作!

判断棋子个数的关键代码如下:

for(step=1;

step<

=5;

step++)

{switch(searchtype)

{case0:

xstep=step;

ystep=0;

break;

//横向搜索

case1:

xstep=0,ystep=-step;

//竖向搜索

case2:

xstep=-step;

ystep=-step;

//从左上右下方向搜索

case3:

//从右上左下方向搜索

if(x+xstep<

=15&

y+ystep>

=0)//如果落子超出范围

{if(b[x+xstep][y+ystep]==-chess)

{bounHead=step;

break;

}

elseif(b[x+xstep][y+ystep]==chess&

break1==false)

{contiNum1++;

chessNum++;

elseif(b[x+xstep][y+ystep]==chess)

else

break1=true;

else

{bounHead++;

break;

通过对玩家落子情况的统计,得到危险等级数并给分,最后判定下棋位置,判断危险等级及给分的代码实现如下:

longFiveChess:

MarkOne(intchess,intx,inty,intb[][LINES])

{longmark=0;

//分数

//对当前下子点对棋盘b造成的影响进行评分

//横向扫描得到评分

mark+=(Search(chess,x,y,b,3)+Search(-chess,x,y,b,0))/10;

//竖向扫描得到评分

mark+=(Search(chess,x,y,b,3)+Search(-chess,x,y,b,1))/10;

//左上到右下方向扫描得到评分

mark+=(Search(chess,x,y,b,3)+Search(-chess,x,y,b,2))/10;

//从右上到左下方向描得到评分

mark+=(Search(chess,x,y,b,3)+Search(-chess,x,y,b,3))/10;

while(m_step!

=1)

{inttempboard[LINES][LINES];

for(intx=0;

x<

LINES;

x++)

for(inty=0;

y<

y++)

{if(b[x][y]==0)

{CopyBoard(tempboard,b);

tempboard[x][y]=-chess;

mark-=MarkOne(-chess,x,y,tempboard);

}

m_step++;

returnmark;

GiveScore(inttype,intcontiNum,intchessNum)

{switch(contiNum)

{case1:

return5*type+chessNum*1;

//活1,单活1给5分,双活1给10分

case2:

return50*type+chessNum*10;

//活2,单活2给50分,双活2给100分

case3:

return500*type+chessNum*100;

//活3,单活3给500分,双活3给1000分case4:

return5000*type+chessNum*1000;

//活4,单活4给5000分,双活4给10000default:

return5000000;

//活5以上。

(4)得到危险等级及其根据得分情况,电脑决定落子位置,具体实现落子代码如下:

voidFiveChess:

ComputerPlay(intchess)

{intx,y;

inttempboard[LINES][LINES];

for(x=0;

for(y=0;

if(m_currBoard[x][y]==0)

{m_step=1;

CopyBoard(tempboard,m_currBoard);

m_markboard[x][y]=MarkOne(chess,x,y,tempboard);

longimaxMark;

boolbfirstMark=false;

for(x=0;

{for(y=0;

{if(m_currBoard[x][y]==0)

{if(bfirstMark==false)

{imaxMark=m_markboard[x][y];

bfirstMark=true;

}

elseif(imaxMark<

m_markboard[x][y])

m_xbest=x;

m_ybest=y;

}

m_xlast2=m_xbest;

m_ylast2=m_ybest;

m_currBoard[m_xbest][m_ybest]=chess;

⑸下棋后在FiveChess类中通过WhoWin函数实现输赢判断,只有相同颜色的棋子横竖斜连起来为5个才结束,再通过判断棋子的颜色可确定谁赢谁输,具体实现代码如下:

intFiveChess:

WhoWin()

{inttemplateboard[LINES][LINES];

CopyBoard(templateboard,m_currBoard);

for(inti=0;

i<

i++)

for(intj=0;

j<

j++)

if(templateboard[i][j]==m_chess)

for(intsearchtype=0;

searchtype<

4;

searchtype++)

{if(Search(m_chess,i,j,templateboard,searchtype)==5000000)

if(m_chess==-1)

return1;

else

return2;

return0;

if(fivechess.m_winner==1)

MessageBox("

恭喜你!

下次可就没这么好运气了!

if(fivechess.m_winner==2)

不要泄气,需要努力呀!

(6)然后根据主函数的要求一步步实现游戏,游戏玩完后,可以按ESc退出即可。

3功能测试及运行效果

3.1游戏主页面

图3-1空棋盘

进入游戏界面的空棋盘如图3-1所示。

点击最左上角菜单中“游戏”,选中“开始”,就开始人机对弈的五子棋游戏,默认的为计算机先落子,计算机使用白色棋子。

得到的界面如图3-2所示。

开始下棋后,计算机和玩家先后落子,只有当颜色相同的棋子横竖斜联成五个时才结束,最后根据棋子的颜色判断谁输谁赢,图3-3就是玩家与计算机对弈的一种情况。

图3-2计算机先落白子

图3-3与计算机对弈

结束时根据棋子的颜色判断输赢情况,得到相应的输出的对话框,如下图3-4所示。

图3-4计算机对游戏结果的提示

3.2结论

程序运行正常,各项功能正常,整个系统达到预期目的。

不足之处:

程序计算落子边界控制做得不够好,有待改善。

3.3几点补充说明

1)考虑到程序的执行效率,人机对弈算法只对玩家的棋子进行了一步的推测。

2)计算机在落子时选取的是最佳的落子位置,所以如果玩家需要开动脑筋考虑清楚该在哪里落子,不然难有机会获胜!

3)人机对弈这个算法的开销很大,每一步落子都会考虑棋盘布局,又考虑对手的落子,从而达到步步为营的目的。

4)程序还有很多地方需要完善,例如:

人机对弈边界处理不是很好,有待完善;

还可以开发为网络对战游戏及完善游戏相关功能。

4总结

作为一名学生,特别是网络工程专业的程序编程学生,在系统的学习了一些编程语言之后,更加觉得自己应该多动手编程,做实训项目。

不进行实际的操作,很难在编写程序上有进步!

编写自己的软件,即使是小程序,你也会向前迈进一大步。

我个人比较喜欢VC++,可以说我通过这次设计,把所学的各项技能很好的整合在一起。

又一次感受到了编程的乐趣,从中也学到了不少知识技巧,向前迈进了一大步!

通过编写这个程序,我体会最为深刻的一点是系统架构和设计模式的重要性。

即使是对于一个再小的程序,你已经做过但忘了的,再做一次又何妨,代码的组织和系统架构都是非常重要的,还因为这关系到日后的维护以及扩展。

设计这个程序之后,我感觉自己不仅实际动手能力有所提高,更重要的是进一步激发了我对专业知识的兴趣,是理论与实际得到一次很好的结合,并能够结合实际存在的问题在专业领域内进行更深入的学习。

对于我们计算机专业的学生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。

只有通过企业式的实训,才会了解工作需要什么,自己要学什么。

通过这次程序设计,使我了解自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,从而走上程序开发的专业道路。

致谢

这次毕业设计的开发过程中,我特别感谢我的指导老师吴俊华和我的同学好友对我的支持鼓励和好心帮助。

在这次开发过程中,我了解了许多有关程序员应该具备相关专业知识,使我了解自身状况与实际需要的差距,知道自己要学的知识,清楚地认识到自己努力的方向。

我再次感谢你们!

参考文献

[1]谭浩强,C程序设计.3版.北京:

清华大学出版社.2005.

[2]谭浩强,C++程序设计.北京:

清华大学出版社,2004.

[3]郑阿奇、丁有和,VisualC++应用教程.北京:

人民邮电出版社,2008.10.

[4]潘爱民:

《Microsoft®

VisualC++.NET技术内幕(第6版)》,清华大学出版社,1999年10月。

[5]汪晓平、钟军:

《VisualC++网络通信协议分析与应用实现》,人民邮电出版社,2001年1月。

[6]刘宗田、邢大红、孙慧杰:

《C++编程思想》,机械工业出版社,2002年10月。

[7]JesseLiberty著:

《21天学通C++》,人民邮电出版社,2003年5月。

[8]侯捷、孟岩:

《C++标准程序库》,华中科技大学出版社,2006年11月。

[9]CharlesPetzold:

《Windows程序设计》,北京大学出版社,2002年1月。

[10]易君:

《VisualC++.NET网络编程》,中国铁道出版社,2003年5月。

[11]李英军:

《深入浅出MFC(第2版)》,机械工程出版社,2001年2月。

[12]王咏刚:

《MSDNforVisualStudio6.0》,电子工业出版社,2003年6月

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

当前位置:首页 > 法律文书 > 判决书

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

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