VC程序设计课程设计报告书设计题目:黑白棋游戏设计院系:班级:组别:学号:姓名:起止日期:指导教师:目录前言 (1)1. 课程设计计划 (2)2.需求分析 (3)3.概要设计 (4)4.详细设计 (5)5.编码与测试 (13)6.心得体会 (15)参考文献 (16)前言黑白棋,也称反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。
游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。
它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。
起初,黑白棋在西方和日本很流行,近年来,黑白棋正逐步为中国玩家所接受,并深受喜爱。
本次我们组选择这个题目做大作业,一方面是巩固和提高以前所学的VC++的知识;另一方面是因为这可能是我们中的大多数人第一次完成一个软件的系统设计,选择一个中等难度且相对成熟的软件来设计既易于实现又留有一定的上升空间,符合我们的实际情况。
我们所设计的这种黑白棋游戏有几个特点:程序短小精悍,简洁明了;游戏界面美观,容易操作;功能丰富,趣味性强。
1. 课程设计计划黑白棋游戏设计所完成的就是一个游戏软件系统。
其一般的功能包括:开始新局,对弈方式选择,先手选择,棋力设置,限时设置,计算机演示,保存棋局,载入棋局,导出走棋信息,重温棋局,英雄榜,悔棋,设置属性,帮助信息,关于黑白棋的介绍等,要求设计一个黑白棋游戏软件,通过计算机实现各个功能。
其具体设计要求为:1、位图的导入和棋盘的生成2、记录双方对弈时间的计时器与记录双方子数的计数器3、选择人机对战与人人对战的函数及控制堆栈难度的主函数4、实现悔棋功能的堆栈我们对项目期望能实现a 可以实现人机对弈。
b 棋力可调,分初级,中级,高级。
c 提示音功能,下错、下对有不同的提示音。
d 玩家遇到疑问,需要帮助时,给予一定的帮助e 界面色彩友好,给人以良好的视觉冲击。
f 操作方便,容易上手。
本课程设计工作进度计划为:表1 课程设计计划本课程设计任务的分工:陈涛涛完成人机对战中的实现保存棋局、载入棋局、重温棋局、英雄榜、悔棋功能。
本人完成人机对战中的实现开始,退出,帮助,难度设计,播放背景音乐功能。
2.需求分析开发背景:我国是棋文化的发祥地之一,上古的尧时代,围棋就在我国诞生了!在随后的几千年长河里,我国人民不断以自己的聪明才智创造出深受人们喜爱的棋类游戏,像中国象棋,五子棋,军棋等等一直是在民间很流行的棋类项目。
同时国外的棋类游戏也流传到中国,比如国际象棋,跳棋等,逐渐在国内盛行。
可以说棋类游戏一直是中国人民喜闻乐见的一种休闲方式,由于棋类游戏都是比较注重智力策略的,所以从中也可以折射出我国人民的智慧。
棋类游戏规则简单,对外部要求不高,人们可以随时随地进行对弈。
但是,真正能够精通棋类游戏的人却不是很多,主要是棋类游戏具有变化莫测的特点,人们经常得在棋局上深思熟虑才能找到克敌制胜的办法。
因此,各种棋类游戏都具有开发智力的效能。
在休闲中使自己得到真正的长进,这或许就是其倍受人们青睐的原因所在!黑白棋游戏,起源于古希腊,在日本和西方国家比较盛行,其独特的游戏规则,对人类智慧进行着不断地挑战和激励,因此人们一直乐此不疲!加上上世纪后期电脑的普及,使黑白棋在全球范围内风靡,人们通过电脑可以轻松地实现人机对弈或者双人对弈!但是,黑白棋在我国开展的比较晚,流行范围还不够广,很多人对它的规则还不是很了解。
为了配合国内黑白棋的普及活动,为广大的人民群众增添一种既能休闲又能益智的娱乐形式,使人们得到身心的全面发展,我们开发了这款PC版黑白棋游戏。
现阶段沉迷于网络游戏或者其他游戏的学生不少,作为国家即将的建设者和接班人决不能只是游戏中的高手,我们只有去磨练自己的思维,发挥创造性才能担当得起如此重任,所以我们更希望能将其在学生中加以推广,让我们学生找到真正适合自己的游戏!选题的意义:本次我们组选择这个题目做大作业,一方面是巩固和提高以前所学的VC++的知识;另一方面是因为我们是第一次完成一个软件的系统设计,选择一个中等难度且相对成熟的软件来设计既易于实现又留有一定的上升空间,符合我们的实际情况。
我们所设计的这种黑白棋游戏有几个特点:程序短小精悍,简洁明了;游戏界面美观,容易操作;功能丰富,趣味性强。
3.概要设计我们的程序从总体上说分为五个块,希望通过五个类来解决,分别为:(1)位图的导入与棋盘的生成(2)记录双方对弈时间的计时器与记录双方棋子数的计数器和每一步的走棋信息(3)选择人机对战与人人对战的函数及控制堆栈难度的函数(4)设置选项功能和开始退出等简单的实现(5)任务分工下的保存棋局、载入棋局、重温棋局、英雄榜、悔棋等功能模块的实现游戏的简单流程为:图1 游戏简单流程图4.详细设计这是一个基于vc++程序。
在这个黑白棋游戏中我们对其作了详细设计,程序没有涉及到数据库方面的知识,其实现的功能模块包括:CaboutDlg:关于对话框的类CAddSec:英雄榜加密功能的类CBestDlg:英雄榜对话框的类CBWChessApp:主应用程序类CBWChessDlg:主对话框类CConfirmSec:密码验证对话框的类CCreditStatic:自定义文本类CDemo:计算机对弈选项设置对话框的类CDigitalPlayer:播放音乐类CHowToDlg:帮助对话框类CHyperLink:超链接类CMemDC:内存DC,基于CDCCMessage1:自定义消息类1CMessage2:自定义消息类2CRecordDlg:设置英雄榜对话框类CSettingDlg:设置“设置”对话框类CSetupDlg:设置黑白棋新局开始类CUndo:设置悔棋功能类Stack:栈功能的实现静态设计:图2 静态设计图棋盘的信息保存为主窗口类COthelloDlg 类的成员变量,重要的几个成员变量与成员函数个数庞大,附在源码中指示。
在我负责的模块主要包括:游戏开始时对话框中新局和退出功能的设计,游戏难度(棋力)的设置,游戏开始后背景音乐的播放,以及帮助对话框的制作。
其他的功能我们从别人的例子中借鉴而实现。
主要有三个菜单和各自的子菜单:游戏(G):新局(N),计算机演示(M ),保存棋局(V),载入棋局(O ),导出走棋信息(D ),重温棋局(W ),英雄榜(B ),退出(X)。
选项(O):悔棋(U),提示(T ),查看可以下子的地方(C )设置(S )。
帮助(H ):黑白棋帮助(R ),关于黑白棋(A )。
每个子菜单都是通过在CBWChessDlg 下添加事件处理来实现其功能的。
在界面设计中,我们设计了十二个对话框模块。
分别用以实现各个功能的人机交互功能。
其中的部分模块是允许多个功能去调用实现的。
初始界面:图3 游戏界面菜单选项:刚打开程序,可对程序进行设置,设置菜单如下:图4 设置界面与新游戏界面设置:其中显示声音效果的添加与否。
可以选择声音效果,如果选择了声音效果,当你在游戏时,如果每次下对或者下错都会有不同的声音进行提醒。
在开始新局进行游戏时,会有黑白棋基础的游戏设置。
你可以根据自己的技术选择初级、中级、专家级进入游戏。
此时系统会根据游戏程序算法适应的做出对应处理对策。
图5 游戏提醒帮助的内容将显示在同一个界面,以方便玩家学习领会。
界面如:图6 帮助界面图7 帮助界面详图在对作者的辛勤工作后给与了系统消息的查看帮助和版权信息的声明,关于对话框的设置如:图8 关于对话框核心算法为最大最小搜索算法思路:在博弈中只有“敌我”两方,他们利益相对,其所赢的函数和为0:C1 + C2 = 0。
其中C1代表我方赢(利益);C2为敌方赢(利益)。
所以会出现三种情况:(1)我方胜利C1 〉0 ,则C2 = -C1 < 0;(2)敌方胜利C2 〉0 ,则C1 = -C2 < 0;(3)平局C1 = 0 ,则C2 = 0;算法分析:在程序设计过程中,采取“极大一极小(Min—Max)分析法”,即在博弈树的搜索过程中,估值函数E(x)反映双方赢得的大小,从我方出发,可取估值函数[2]为:E(x)=C1(x),C1>0得分,C1<0失分。
双方都根据“极大一极小”的原则,在按照博弈规则生成的博弈树中,选取最佳步[3],即:我方最佳棋步:取max[E(x)],在我方得分C1最大,扩展“或”节点;敌方最佳棋步:取min[E(x)],在我方得分Cl最小,扩展“与”节点。
极大-极小原则例:初始棋局假设有如图1布局所示图9 算法例子对应的图轮到电脑下棋。
现在它发现有这样三个地方可以下:e3,c3,c5。
这三种下法分别会形成三种局面:A、B、C。
如果是人在下棋,就会思考:那一种下法更好呢?比如A被别人占角,B没什么变化,C占了别人的角。
当然棋手会选择下C。
电脑也是如此,它会对每一种棋局评一个分,比如它判断,如果被别人占角,就减80分,相反占别人的角就加80分。
那么A=-80分,B=0分,C=80分。
电脑会选择下C。
电脑程序对棋局评分的部分,称为“估值函数”(Evaluation Function)。
真正的估值函数当然不会这么简单。
它会用到如行动力、潜在行动力、余裕手、边角判断、稳定子等综合因素来判断。
具体的估值函数网络上学习所以会有初始棋局(-1)------------------+------------------| | |e3 c3 c5(A) (B) (C)图10 初始棋局接下来,如果人就这么判断。
那么它顶多也就是个初学者。
为什么呢?因为它不会推理,碰到对手弃角之类的战术,如“边角判断”中示例的一些情况,就输得一塌糊涂了。
当然,可以告诉电脑,碰到“边角判断”中的几种情况,就如何如何下。
但是,真实的棋局是非常复杂的,电脑(也包括人脑)几乎不可能对动态的棋局给出静态的评估。
因为实际对局总会出现这样那样的情况,是无法预先估计的。
碰到这些情况,人就会向后推几步,看一看会是怎样的一个局面。
一些棋类大师往往可以推十几步甚至更深。
电脑也是如此。
现在设电脑我白棋,推理深度为2 ,那么形成的树就为:图11 树具体实现的伪算法类似于经典的八皇后问题。
最大最小搜索:varDepthMax: Integer; //最大搜索深度max: Double; //最佳估值max_x, max_y: Integer; //最佳值所在位置的x和y坐标function MiniMax(Depth: Integer; Board: TBoard): Double;varI, J: Integer;Value, t: Double;beginif Depth = 0 then //根节点depth=DepthMax;叶子节点depth=0; beginResult := 估值; //叶子结点估值返回Exit;end;if 电脑下棋then //电脑下棋的节点Value := -MaxInt //节点赋初值,初始化为一个不可能达到的最小值else //对手下棋的节点Value := MaxInt; //节点赋初值,初始化为一个不可能达到的最大值对于每一个合法的可下棋的位置(i,j) dobegin保存棋局;下棋;t := MiniMax(depth - 1, Board); //递归调用if 电脑下棋and (value < t) then //选择节点中最大或是最小的值Value := telse if Value > t thenValue := t;if (depth = DepthMax) and (Value > max) then //如果值大于根节点值则赋值beginmax := value;max_x := i; //x坐标max_y := j; //y坐标end;5.编码与测试//设置黑白棋新局开始class CSetupDlg : public CDialog//退出黑白棋游戏{void CBWChessDlg::OnExit()//提示void CHowToDlg::OnHhint(){LoadHelp(IDS_HHINT0,IDS_HHINT1); }//载入棋局void CHowToDlg::OnHopen(){LoadHelp(IDS_HOPEN0,IDS_HOPEN1); }//保存棋局void CHowToDlg::OnHsave(){LoadHelp(IDS_HSA VE0,IDS_HSA VE1); }//导出棋局信息void CHowToDlg::OnHsaveinfo()//悔棋void CHowToDlg::OnHundo(){LoadHelp(IDS_HUNDO0,IDS_HUNDO1); }//英雄榜void CHowToDlg::OnHhero(){LoadHelp(IDS_HHERO0,IDS_HHERO1); }//限时void CHowToDlg::OnHlimit()//加/解密void CHowToDlg::OnHsec()//计算机演示void CHowToDlg::OnHdemo()//动态显示信息TCHAR *pArrCredit = {_T("黑白棋\t|"……"|您的意见对我很重要!" )};6.心得体会这次课程设计是我迄今为止所做过的最大的一个项目,充分锻炼了我们的各项能力。