五子棋游戏双人对战版软件设计.docx
- 文档编号:8988972
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:21
- 大小:390.15KB
五子棋游戏双人对战版软件设计.docx
《五子棋游戏双人对战版软件设计.docx》由会员分享,可在线阅读,更多相关《五子棋游戏双人对战版软件设计.docx(21页珍藏版)》请在冰豆网上搜索。
五子棋游戏双人对战版软件设计
2012-2013学年第1学期“软件工程”课程设计报告
学院/系
信息工程学院计算机科学系
专业
计算机科学与技术
班级
项目名称
五子棋游戏(双人对战版)软件设计
组长
小组成员
主要负责完成软件的测试模块
主要负责完成界面设计以及源代码的编写与调试
主要负责完成数据结构设计以及源代码的编写与调试
主要负责完成的功能设计以及源代码的编写与调试
主要负责完成软件的问题描述和算法分析部分以及报告的整合
主要负责完成软件的需求分析模块
第一章五子棋双人对战版软件问题描述
1.1五子棋的相关介绍
1.1.1五子棋的简介
五子棋是一种两人对弈的纯策略型棋类游戏,棋具与围棋通用,是起源于中国古代的传统黑白棋种之一。
发展于日本,流行于欧美。
容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
1.1.2五子棋规则
无禁手玩法:
黑先白后,谁先连五谁胜。
禁手玩法:
黑先行棋,黑棋只能走冲四活三胜,黑双活三禁手双冲四禁手四三三禁手四四三禁手六连长连禁手;白后手,白棋无任何禁手,还可以抓黑棋的禁手点取胜。
职业规则玩法:
三手交换五手两打,黑棋有禁手,意思是下到第三手棋执白方有权选择交换下黑棋或者继续行棋,下到第五手时执黑方给出两个打点让执白方选择去掉一个打点下剩下的打点。
1.2五子棋双人对战版软件
1.2.1软件设计思想
人对人游戏,其实只是对游戏规则的实现,我们只是利用五子棋游戏的规则以及五子棋的经典算法来编程,这些规则和算法,我们将用相应的函数来实现。
一个优秀的游戏软件必须有一个正确的设计思想通过合理地选择数据结构、操作系统以及开发环境构成一个完善的体系结构才能充分发挥计算机应用的优势。
根据游戏玩家的实际需求本系统的设计按照下述原则进行:
实用性、先进性、高可靠性、可维护性、可扩展性及灵活性、智能性。
第二章五子棋双人对战实现的算法分析
2.1传统五子棋算法介绍及初步实现
2.1.1估值函数
不同的棋型,其优先级不同。
例如,四个棋子连成一线且还能继续落子的棋型(活四)显然要比只有三个棋子连成一线(活三或死三)好。
要使计算机正确地做出这种判断,就要把第一种棋型的估值设高。
事实上,对于每一种特定的棋型,都需要相应的估值来反映其优劣情况。
另外,由于搜索模块频繁地调用估值函数,为了尽可能地加快搜索速度,估值函数应设计的越仔细越好。
估值时,需要从四个方向上来考虑所下棋子对当前盘面的影响。
这个方向分别是以该棋子为出发点,水平、竖直和两条为45度角和135度角的线。
为方便分析棋盘上的格局,本文中约定以“A”代表黑子,“B”代表白子,“?
”代表棋盘上空位。
算法中关于棋子死活的规定如下:
一方落子后,它的落子连成的一条线有两条不损伤的出路,则称该棋型是活的。
否则称该棋型是死的。
比如关于活三的定义:
不论对手如何落子,仍然至少有一种方法可以冲四。
因此,B?
AAA?
B中的三个A,不能算是活三;B?
AAA?
?
B中的三A,也不是活三,尽管它有可能成为活四。
这样,棋型的估值设计才能比较细致。
本文算法对特定棋型的估值如表1所示。
表一:
特定棋型的估值
2.1.2Alpha–Beta搜索
在博弈问题中,每一个格局可供选择的行动方案都有很多,因此会生成十分庞大的博弈树。
一般地只生成一定深度的博弈树,然后进行极小极大搜索。
极大极小搜索是指:
在一棵博弈树中,当轮到甲走时,甲定会选择子节点值最大的走法;而轮到乙走时,乙则会选择子节点值最小的走法[3]。
使用估值函数对博弈树的每一个局面进行估值后,就可以通过极大极小搜索在博弈树中寻找最佳的合法走法。
在极大极小搜索的过程中,存在着一定程度的数据冗余。
如图1左半部所示的一棵极大极小树的片断。
其中节点下方数字为该节点的值,方形框节点代表计算机走,圆形框节点代表人走。
A节点表示计算机走,由于A是极大值点,根据极小极大搜索原理它要从B和C当中选最大的值。
假设目前已经通过估值得出B为18,当搜索C节点时,因为C是该人走,所以根据极小极大搜索原理要从D、E、F中选取最小的值。
此时如果估出D为16,那么C的值必小于或等于16。
又因为已经得出B的值为18,说明节点A的值为Max(B,C)=18,也就是说无须求出节点C的其他子节点如E、F的值就可以得出父节点A的值。
这种将节点D的后继兄弟节点剪去的方法称为Alpha剪枝。
同理,在图1右半部一棵极大极小树的片段中,将节点D的后继兄弟节
点剪去称为Beta剪枝。
图1Alpha-Beta剪枝
将Alpha剪枝和Beta剪枝加入极大极小搜索,就得到Alpha-Beta搜索算法,该算法描述如下:
intAlphaBeta(intdepth,intalpha,intbeta)
{
ifdepth为0,说明当前节点是叶子节点then返回对当前棋局的估值
else
while还存在可能的走法
{
走一步棋,从对手角度进行-AlphaBeta(depth-1,-beta,-alpha)的递归搜索,记录返回值为val
撤消刚才走的一步
若val大于等于beta,则返回beta的值
若val大于alpha,则修改alpha的值为val
}
endwhile
endif
返回alpha
}
其中depth记录搜索的深度,alpha记录搜索到的最好的值,beta记录对于对手来说最坏的值。
如果INFINITY表示无穷大,则AlphaBeta(3,-INFINITY,INFINITY)表示完成一次3层的搜索。
2.1.3胜负判断
在棋局的胜负是根据最后一个落子的情况来判断的。
此时需要查看四个方向,即以该棋子为出发点的水平,竖直和两条分别为45度角和135度角的线,看在这四个方向上的其它棋子是否能和最后落子构成连续五个棋子,如果能的话,则表示这盘棋局已经分出胜负。
实际上,我们可以提前若干步预判当前棋局的胜负情况。
本文算法采用了如下的规则对胜负进行预判,提高了算法的智能。
在甲和乙对弈的棋局中,某个时刻轮到甲下棋时几种可能获胜的情况:
甲已有任意组活四,或者甲已有任意组死四:
一步获胜
甲已有任意组活三,或者甲已有多于一组的死三:
两步获胜
甲已有一组死三和任意组的活二:
三步获胜
2.2五子棋算法的优化
到目前为止,我们使用传统的Alpha-Beta搜索结合估值函数的五子棋算法完成一个简单的五子棋对弈程序。
虽然估值尽力做到细致、全面,但由于Alpha-Beta搜索存在博弈树算法中普遍存在的一个缺点—随着搜索层数的增加,算法的效率大大下降。
所以搜索的效率还是不理想,五子棋程序的“智力”也不高。
因此,在上述基础上,我们继续研究,通过对Alpha-Beta搜索算法的优化与修正,针对五子棋本身的特点和规律,提出采取以下优化措施,显著地提高了五子棋程序对弈的水平和能力。
2.2.1减少搜索范围
五子棋棋盘大小为15×15,传统算法中计算机每走一步都要遍历整个棋盘,对于棋面上所有空位都进行试探性下子并估值,这样大大影响算法的效率。
其实在某个时刻,棋盘上很多的位置都是可以不用去考虑的。
2.2.2设置下棋风格
对一个落子估值的时候,首先在己方的角度对其进行评估,获得一个返估值Value_Me;随后在对手的角度再进行一次评估,获得一个估值Value_Enemy;通过Value=K1*Value_Me+K2*Value_Enemy而获得最终的估值结果。
其中K1和K2是一对关键系数,当K1/K2越大的时候,就表示计算机落子的攻击性更强,反之则表示计算机落子考虑较多的是阻断对方的落子,防守性更强些。
K1、K2的值可以由玩家设定,也可以由计算机根据当前棋面自己决定。
与传统算法相比,这样得到的五子棋程序更加智能。
2.2.3增大搜索层数
理想状态下,为了尽可能提高计算机下棋的“智力”,搜索层数应该越大越好。
实际上,由于博弈树异常庞大,搜索层数的增加将会导致算法的效率大大下降。
搜索层数。
根据已有的资源条件,最有效地进行搜索。
2.2.4使用置换表
在Alpha-Beta搜索过程中,为了避免重复搜索已经搜索过的节点,加快搜索速度,可以使用一张表格记录每一节点的搜索结果,对任意节点向下搜索之前先察看记录在表中的这些结果。
如果将要搜索的某个节点在表中已有记录,就直接利用记录下来的结果。
我们称这种方法为置换表(TranspositionTable,简称TT)。
2.2.5启发式搜索
五子棋游戏开局阶段有很多“定式”。
将“定式”的格局及其走法当成棋谱保存在数据库中,若发现当前格局存在于棋谱中,则我们不需要搜索,直接按照棋谱下棋,即利用棋谱进行启发式搜索,这样便加快了搜索的速度。
该方法的关键是棋谱的模糊匹配以及棋谱的存储结构。
第三章需求分析报告
3.1介绍
3.1.1目的
软件需求分析是软件开发周期的第一个阶段,也是关系到软件开发成败的关键一步。
对于任何一个软件而言,需求分析工作都是至关重要的一步。
只有通过软件需求分析,才能把软件的功能和性能由总体的概念性描述转化为具体的规格说明,进而建立软件开发的基础。
实践表明,需求分析工作进行得好坏,在很大程度上决定了软件开发的成败。
软件需求分析的任务是:
让用户和开发者共同明确将要开发的是一个什么样的软件。
具体而言,就是通过对问题及其环境的理解、分析和综合,建立逻辑模型,完成新软件的逻辑方案设计。
用户及其开发人员,管理人员通过阅读这份需求分析规格说明书能够了解本系统的开发目的,开发方法以及目前的硬件和软件的情况和开发所需资金和设备,概要设计说明书和完成后续设计与开发工作将在此基础上进一步提出。
3.1.2文档约定
此文档的书写大标题是二号加粗宋体,小标题是四号加粗宋体,正文是小四宋体,1.5倍行距。
画图为Visio画图。
3.1.3面向的读者和阅读建议
预期的读者相关开发人员,项目经理,营销人员,用户,测试人员,管理人员等。
建议序列读取文件,开始的概述部分,然后继续阅读每一类读者相关的部分或者关注的部分。
3.1.4参考文献
3.2整体描述
该课程设计在设计与实验过程中需要在windowsXP系统/windows2000以上系统中进行,程序设计要求在visualC++6.0平台中进行,完成代码的编写、编译、调试、测试等工作。
本游戏对计算机硬件和操作系统要求极低,所以在这里只是把自己的电脑硬件参数和系统参数列下:
操作系统:
windowsxp
软件环境:
安装VC++6.0
3.2.1功能需求
游戏说明:
游戏开始时,由红子开局,将一枚棋子落在棋盘一坐标上,然后由黑子落子,如此轮流下子,直到某一方首先在棋盘的竖、横或斜三方向上的五子连成线,则该方该局获胜;选择是否继续下一盘游戏,若继续则重复以上操作,若否则游戏结束。
1、功能列表如下:
a)输出棋盘;
b)显示用户行程;
c)判断每局游戏输赢。
d)判断是否进行下一局。
e)退出游戏。
用例图
2、功能描述
(1)棋盘是19*19的方格棋盘。
(2)红子先下,黑子后下,两者交替下子。
(3)出现五子相连时则该用户赢。
3.2.2性能需求
1、技术可行性
运用Windows2000/XP以上的操作系统,SQLSERVER2000的数据库技术,开发以WindowsXP为用户的操作平台,界面友善、功能齐全的《五子棋双人对战小游戏》。
2、经济可行性
一方面,新系统中棋盘界面和更强劲的功能支持,不仅增加了游戏的趣味性,而且使游戏者更尽兴;另一方面系统开发成本低,现有PC机即可提供该系统开发工作需要的所有硬件设备环境。
3、操作可行性
操作上是键盘的使用,主要凭借输入坐标确定棋子落子位置,方便简单。
使用前只要看明白游戏规则及其方法即可。
3.2.3数据流图
顶层数据流图2-1
3.3系统特点
3.3.1系统特点
系统必须满足条件
1、红子下完之后黑子才能下。
2、棋子下完后须立即判断是否出现五子相连的情况。
3.3.2系统功能
该五子棋程序基本上实现了五子棋的游戏功能,有双方下棋的界面及最终判定结果的界面。
同时该游戏明了易懂,方便玩家在游戏过程中的基本操作,使游戏更加简便。
在细节方面,该系统提供实时存储功能,随时记录为完成的游戏,使用户可以很好的处理意外中断的情况。
该游戏基本实现了游戏的一些要求和特征。
在游戏的源程序及文档方面,我们也严格遵守软件工程思想,立足实验要求,确定任务,需求分析,设计和编码,每个步骤力求清晰易懂。
原代码注释详尽,各功能模块功能分明,可移植性强。
3.4外部接口需求
3.4.1用户界面
界面的设计应本着简洁、漂亮、通俗易懂,操作简单,并具有一定的灵活性;尽可能采用开发工具构造界面,使需求定义和设计、编码相衔接;参考、比较成熟的软件的界面的风格,提取有用的设计方法。
3.4.2硬件接口
采用标准的键盘、鼠标控制接口。
3.4.3软件界面
软件组件包括操作系统、数据库、工具、库和集成的商业组建之间的连接,以及应用程序编程接口协议。
这里主要考虑软件与操作系统、数据库管理系统的接口以及局域网和互联网软件之间的数据交换。
考虑到文档处理时有可能需要较常用的办公软件。
例如Microsoft的Office系列所以应尽量实现它们之间的数据格式的自动转换。
3.5其他非功能需求
3.5.1系统交付日期
人人对战的DEMO必须在十二月十七号交付。
3.5.2系统需求
给游戏引入段位制;输入秘技获得额外的收获等。
3.6软件总流程图
第四章设计与实现
4.1基本设计概念和处理流程
本软件采用面向对象的设计方案,通过把对弈接口组件化,来实现界面设计与算法设计的完全分离。
图1总处理流程图
4.2结构
图2总体设计结构图
4.3功能设计
4.3.1软件的基本功能设计
1.显示一个十九行十九列的五子棋棋盘。
2.用鼠标点击棋盘上的交叉点处,则会准确地在该位置显示出棋子。
3.玩家为红方先下棋,可下在任意的地方。
4.可以自动判断游戏是否结束,是否黑方或者是红方已经胜利,并且跳出对话框来提示玩家。
5.在游戏棋盘上方会有一个游戏信息,这个游戏信息是用来提示当前是黑白双方的哪一方下子,玩家可以根据这个提示来下棋,而不会导致不清楚轮到哪一方下棋。
6.可以重新开始游戏,并且有悔棋功能,当某一玩家点击悔棋时会自动跳转到上一个状态,重新落子。
4.3.2软件的附加功能设计
1.给软件设计更换棋盘大小的功能,用户可自由选择。
2.给软件设计一个更换棋盘背景的功能。
3.给软件设计播放背景音乐的功能。
4.给软件设计排行榜的功能。
4.4接口设计
4.4.1用户接口
用户的所有操作全部通过鼠标或者热键来完成。
开始游戏、悔棋、认输和结束游戏这些操作通过点击按钮、右键菜单或使用热键来完成。
棋色和水平选择通过点击单选框或右键菜单来完成。
游戏中棋子状态将直接反映在棋盘上,其他反馈信息(比如棋盘当前局面、走棋时间、棋谱等信息)将在单独的反馈信息栏中显示。
4.4.2外部接口
本程序与其他比赛程序通过裁判程序(有比赛裁判委员会给出)来进行相互通讯,棋盘上落子通过鼠标事件的触发来完成,裁判程序将模拟这一鼠标事件。
裁判程序对棋盘状态的获取将直接根据棋盘颜色变化来检测。
4.4.3内部接口
TGobangAI组件定义了界面和算法的接口,TGobangAI中聚合了TSearchEngine类的实例FSearchEngine,而TSearchEngine中聚合了TEvaluator的实例FEvaluator。
通过这种
设计,提高了系统的松散耦合性。
4.5界面设计
4.5.1界面设计运用的主要方法
首先用MFC新建的单文档工程,然后用CClientDC画的。
进入界面:
初始化界面:
双发对弈界面:
4.6系统数据结构设计
4.6.1逻辑结构和物理结构设计要点
基本类型定义
//棋色类型
TStoneColor=(scRed,//红棋
scBlack);//黑棋
//落子点状态类型
TPointState=(psRed,//有红棋
psBlack,//有黑棋
psNone,//没有棋
psInvalid);//无效位置
//落子点组合类型
TPointCombi=(pcSTwo,//眠二
pcSThree,//眠三
pcSFour,//眠四(冲四)
pcTwo,//活二
pcThree,//活三
pcFour,//活四
pcFive);//连五
//棋盘上的扫描线类型
TScanLine=arrayofTPointState;
//棋子间状态描述类型
TStonesState=array[TStoneColor]ofarray[TPointCombi]ofInteger;
估值核心的棋盘数据结构设计
FScanLines:
array[0..95]ofTScanLine;//棋盘扫描线
FIsValidLine:
array[0..95]ofBoolean;//扫描线有效标志
FLinesState:
array[0..95]ofTStonesState;//每根扫描线上的棋子间状态
FBoardState:
TStonesState;//整个棋盘上的棋子间状态
FValidLineCount:
Integer;//棋盘上有效扫描线的数量
对于估值核心棋盘的表示,重点要考虑的是估值的速度,因此本棋盘采用将19×19的棋盘上的横纵斜行都转化为横行的方式来储存,除去斜行上不足5个落子点的行,横纵斜行共有96行,每一行上的棋子数目不同,因此采用动态数组FScanLines来存储。
虽然使用动态数组,但是只是在估值核心被初始化时才会分配动态数组的内存,其他情况下不改变此动态数组的内存分配,因此存取效率同静态数组几乎没有差别。
另外为了表示每一行上面的棋子组合状态(比如活三、冲四、连五等状态),又定义了96行的数组FLinesState来存贮这些状态,而FboardState汇总了整个棋盘上的棋子组合状态。
为了进一步提高棋局判断是否平局的效率,定义了96行的数组FIsValidLine和变量FvalidLineCount。
搜索引擎的走法数据结构设计
FBestMove:
TPoint;//记录最好的落子点
FEvaluator:
TEvaluator;//估值核心
FMove:
array[0..360]ofTPoint;//走法数组
FScore:
array[0..360]ofInteger;//走法得分数组
FHScore:
array[0..360]ofInteger;//历史得分数组
FLTPoint:
array[0..361]ofTPoint;//左上边界数组
FRBPoint:
array[0..361]ofTPoint;//右下边界数组
FCurMove:
Integer;//当前走法索引值
搜索引擎中棋盘的表示主要是靠调用估值核心FEvaluator的中的棋盘属性来实现的,搜索引擎中更关注的是走法的表示,19×19的棋盘上共有361个点,因此采用有361个元算的点类型数组来存贮走法是一种比较直观的方法,采用这种方法的好处是,这个数组被看作一个栈,FCurMove为栈指针,下标小于栈指针的点表示已经走过的点,它们按照所走棋谱的顺序储存,悔棋只需要按照顺序从棋盘上移去,并将FCurMove的值减小即可。
而大于等于FCurMove的点表示还未落子和待落子的点,它们将按照历史得分数组FHScore中的历史分数值从大到小进行排列,因为大部分搜索算法都是通过对搜索树进行剪枝来提高搜索速度的,而这种剪枝的效率同搜索节点的排列顺序是有很大关系的,通过历史启发方式来调整搜索节点顺序可以大大的提高搜索最佳落子点FbestMove的命中速度。
但是19×19的棋盘毕竟还是很大,仅通过调整节点顺序来进行剪枝还是很慢,所以根据五子棋的特点,将搜索范围限制在当前棋盘上所有棋子的最边界再向外延伸两个落子点的范围内就很有必要,因为根据五子棋的特点,超出这个范围,便不会有好的落子点,因此可以不再搜索。
通过增加FLTPoint和FBRPoint这两个数组便实现了这一范围的限制。
走法得分数组Fscore仅用于返回更有效的反馈信息,对于搜索效率没有提高的作用。
4.6.2数据结构与程序的关系
估值核心数据结构和程序的关系
为了提高估值核心的效率,估值的计算不是通过一次操作来完成的,而是分散到估值核心的多个操作中来完成的。
每次落子或悔棋时,都会重新分析落子点或提子点所影响的那四行(横行、纵行和两个斜行)上的棋子组合状态,然后更改整个棋盘的棋子组合状态,这样做就不必到返回估值时在对整个棋盘进行全部扫描,因此极大的提高了估值核心的效率。
搜索引擎数据结构和程序的关系
根据历史得分调整节点顺序是通过排序过程完成的,因为排序也需要时间,所以不宜把排序放到搜索算法中去,但是这样调整节点顺序的机会就少了很多,为了能够更好的调整节点顺序,采用迭代深化是一个好的方法,它将仅进行一次n层搜索转化为从1层到n层渐进的进行n次搜索,每次搜索前都根据上一次搜索得到的历史得分来调整节点顺序以便进行更深一层的搜索。
这样表面上看是进行了更多的搜索,而实际情况却是深层搜索比浅层搜索的节点多的多,多进行的那些浅层搜索对于深层的搜索可以忽略不计,而浅层搜索得到的历史得分更好的调整了节点的顺序,使得深层搜索的剪枝效率大大提高,因此实际搜索的节点数大大地减少了,搜索的速度也就提高了。
4.7系统出错处理设计
因为本软件设计比较精巧,在与用户的交互上不需要用户通过键盘键入信息,因此出错机会几乎为零,因为病毒或者操作系统重要文件损坏等所造成的错误不应归咎于本软件,本软件也没有义务去处理这些错误,因此本软件没有设计出错信息提示和出错处理。
4.8软件运行结果
点击游戏,进入界面:
点击开始下拉菜单中的新游戏按钮,显示大棋盘,小棋盘,中棋盘:
选择所需的棋盘大小进入游戏初始化界面:
点击鼠标左键进行游戏:
第五章测试
5.1黑盒测试
测试用例名称:
游戏操作
测试用例编号:
01
操作序号:
01
测试条件:
打开软件
测试输入:
双击软件图标
预期输出:
软件正确打开
实际输出:
同预期
测试用例名称:
游戏操作
测试用例编号:
02
操作序号:
02
测试条件:
开始游戏
测试输入:
点击开始按钮
预期输出:
出现下拉框选择新游戏
实际输出:
同预期
测试用例名称:
游戏操作
测试用例编号:
03
操作序号:
03
测试条件:
选择棋盘大小
测试输入:
在新游戏中选择小棋盘
预期输出:
开始游戏且棋盘为小棋盘
实际输出:
同预期
测试用例名称:
游戏操作
测试用例编号:
04
操作序号:
04
测试条件:
落子
测试输入:
鼠标点击棋盘,落子
预期输出:
落子实现
实际输出:
同预期
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 游戏 双人 软件设计