井字棋课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

软件工程

课程设计报告

题目:井字棋游戏

班级:2013软件工程

学号:*****************

姓名:***

二○一四年十二月一日

课程设计题目说明书

第一章可行性研究

1.1引言

1.1.1可行性研究目的

在课程设计项目中,井字棋游戏设计作为初学者的我们来说,是个比较适合和有研究意义的题目。“井字棋”游戏(又叫“三子棋”),或是一字棋,是一款十分经典的益智小游戏,想必很多玩家都有玩过。“井字棋”的棋盘很简单,是一个3×3的格子,很像中国文字中的“井”字,所以得名“井字棋”。“井字棋”游戏的规则与“五子棋”十分类似,“五子棋”的规则是一方首先五子连成一线就胜利;“井字棋”是一方首先三子连成一线就胜利。虽然这只是个很简单的小游戏,但作为初学者的我们认识项目设计的技巧与结构及其概念的理解,封装性、继承派生、多肽的理解及实现,是比较好的课题。对我们以后的大型程序的设计奠定了基础。所以作为我们这次的课程设计项目来说,我们认为是个很好的、有可研究性的设计项目。

1.1.2背景(说明井字棋设计背景,开发目的等)

对于21世纪的人们来说,游戏日益成为我们生活中必不可少的休闲娱乐工具。为了满足人们的需要,现在越来越多的人们把游戏作为一种商品对待,就比如中国,像盛大、网易、滕讯等大型的游戏开发公司更把游戏的研究看作是一棵摇钱树,所以游戏程序设计人员在未来是不可多得的人才。对于学软件工程的我们来说,一个优秀的程序员也许是我们学习的优秀目标,所以在出始阶段我们就注重项目设计的理念,而且喜欢游戏的我们更希望自己在将来能够做出一个自己很满意且适合市场的游戏来,所以我们这次以这个为题目就是想熟悉游戏编程的最基础的设计思想和实现手段的了解,为我们以后打下基础。虽然井字棋是个很简单的小游戏,基本上人们都不玩了,但是作为一种我们的设计项目,我们都觉得是个很好的且适合的项目。

1.2可行性研究的前提

1.2.1要求(说明井字棋的预期要求)

功能:屏幕输出棋盘和棋子(可用特殊符号代替);

实现:用户与电脑下棋(可选)功能和修改。

难点:判断输赢的算法及简单的人工智能实现。

1.2.2目标

首先:能做出棋盘的基本样式。

最后:能实现玩家与电脑的对弈,最好能做到电脑的智能化。

1.2.3评价尺度

第一:实现电脑的智能化;

第二:做到界面美观易懂;

第三:达到娱乐的最低水平。

第二章需求分析

2.1 任务概述

该软件的设计主要是实现简单的三字棋,能做到玩家与玩家之间的对弈或者玩家与电脑之间的对弈,可考虑怎样实现电脑的智能化。其次,从程序的设计过程中理解实现程序的方法和理念,学会怎么样做到面向对象设计,理解面向对象的概念及结构的封装性和实用性,能为以后的设计奠定一些良好的基础。

2.2对性能的规定

此节说明软件的性能要求:

精度:本程序中按照系统给出的提示,输入数字,实现程序的功能。应该注意,输入的一定只能是数字,若输入字母或其他,则出错。

时间特性:由于本程序并不是很庞大,故响应时间短,显示结果迅速。

故障处理要求:只有在非法输入是,出现死循环,此时应该退出程序,重新输入。运行环境规定运行的软件环境:

windows 7、windowsXP、

运行该软件所需要的硬设备:PC机一台。

第三章概要设计

3.1 总体设计

3.1.1 基本设计概念和处理流程

人机对弈的难点在于当人走一步棋之后,计算机如何走下一步,即计算机如何找出最合适的位置去走棋。这就需要一定的算法,或者叫做计算机的AI。对于井字棋、五子棋等两方较量的游戏来说,Minimax算法(极小极大算法)是最基本也是最常用的。算法的原理不在这里解释了,我们直接看该算法在井字棋中的应用。

井字棋中,假设使用“X”的是人,使用“O”的是计算机。“X”方先走,设定X方的最大利益为正无穷(程序使用常量+INFINITY表示),O方的最大利益为负无穷(程序中使用-INFINITY表示),即X方和O方走的每步棋都要力图使自己的利益最大化,而使对方的利益最小化。这样我们称X方为MAX(因为他总是追求更大的值),O方为MIN(它总是追求更小的值),各自都为争取自己的最大获益而努力。现在举例说明,比如图4所示的棋局树:

图1棋局形成的树

X方先走,有三种选择,如图4中第二层所示。假设X方选择最左边的走法,那么O方接下来将有5种走法,O方会选择最小化的走法,即值为-1的走法,因为它的最大利益是负无穷;同理,X方的另外两种走法会分别得到O方的最小值1和-2。这样,对于X方来说,三种走法会导致O方最小化值分别为-1、1、-2,X方的最佳策略则是选择其中最大的,即第二层中间的走法,因为它的最大利益是正无穷,这就是极小极大算法的体现——X方的选择总是极大化,O方的选择总是极小化。

对于其中那些值的是如何计算的,我们举例说明,比如对于第三层最左边的棋局,在这种状态下,如果把棋局空白处都填上X,则X共有6中3连子情况,即获胜情况;如果把空白处都填上O,则O共有5种3连子情况,所以结果是二者相减等于1。

在具体走起过程中,MAX面对MIN最大获利中的最小值时,会选择其中最

大的,比如图4第二层小括号内的值都是第三层中能使MIN最大获利的最小值,这时候MAX选择其中最大的,这对MAX最为有利,所以MAX方选择图4第二层中间的走法最好。同样道理,MIN也会一样,选择对自己最有利的,即MAX 有可能获得的最大值。这时候,MIN在走棋时会考虑MAX方占据哪个位置对MAX最有利,然后MIN把这个位置先占了。有点难理解,其实就是抢先把对对手有利的位置抢占了。

简单说,X方或者MAX方的走棋时由人来控制的,我们不仔细说了。对于O方或者MIN方,它走棋时要考虑哪个位置对X方最有利,然后把该位置占据,即O的最佳走棋就是X的最佳走棋。所以O在走棋之前,先站在X的角度寻找最佳走棋位置。后文中minimax方法就是站在X角度来考虑极小极大算法,找到X的最佳走棋位置,然后由O方来占据该位置。

2、极小极大算法

整个算法包括如下几个部分:

首先要有一个评估方法gameState,对每走一步棋后的棋局进行评估,估值为WIN常量说明X方,即MAX方获胜;估值为LOSE则O方,即MIN方获胜;估值DRAW为平局;估值为INPROGRESS,说明棋未走完;估值为DOUBLE_LINK,说明棋局中有两连子情况

然后用一个minimax方法寻找在当前棋局状态下X方的最佳位置,X方的最佳位置就是当X走该位置后,O方所有走法中最小值里的最大值,比如图4中第二层X 的位置选择。当找到该位置后,由O方来抢先占据该位置。

最后用两个递归方法min和max来遍历所有的棋局。min方法负责找出O 方的最小值,比如图1第二层最左边的棋局会导致5中O方的走法,min方法就是找出这5种走法中的最小值。同理,max方法负责找出X方的最大值,比如图1第二层三种棋局中的中间棋局。

3.1.2功能需求与程序的关系

1.计算机为一方,人为一方,交替下棋,谁先连成一条直线谁胜;允许人选择先下还是后下。

2.界面要求:初始状态——显示棋盘,并显示玩家的操作键;游戏进行状态——动态显示棋盘不同玩家的棋子用不同符号显示,屏幕上显示当前玩家号,结束时显示赢家号。

3.提示计算机自动下棋的规则:计算机下时,应考虑所有空位,并按行、列、对角线计算每个空位的分值,若在某行(列、对角线)上,(设计算机画X,人画O)

已有XX 加50分

已有OO 加25分

已有X空加10分

已有O空加8分

都是空加4分然后选分值最高的位置画X。

相关文档
最新文档