井字棋课程设计报告_第1页
井字棋课程设计报告_第2页
井字棋课程设计报告_第3页
井字棋课程设计报告_第4页
井字棋课程设计报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c语言贪吃蛇游戏设计总结报告软件工程课程设计报告题目: 井字棋游戏 二 一四 年 十二 月一 日1课程设计题目说明书课程设计题目:井字棋游戏设计要求:“井字棋”游戏(又叫“三子棋”),或是一字棋,是一款十分经典的益智小游戏,想必很多玩家都有玩过。“井字棋”的棋盘很简单,是一个33的格子,很像中国文字中的“井”字,所以得名“井字棋”。“井字棋”游戏的规则与“五子棋”十分类似,“五子棋”的规则是一方首先五子连成一线就胜利;“井字棋”是一方首先三子连成一线就胜利。要求:屏幕输出棋盘和棋子(可用特殊符号代替),实现:用户与电脑下棋难点:判断输赢的算法及简单的人工智能实现工作量:(根据项目实际情况选择,

2、在所作的工作后打) 具体工作量分为几个部分:1 可行性研究分析和可行性研究报告的撰写工作。2 软件需求的调查和软件需求说明书的撰写;3 软件的概要设计和概要设计说明书的撰写;4 软件的详细设计和详细设计说明书的撰写;5 软件的实现工作,包括代码的实现和实现过程中的具体要求工作;6 测试的准备工作和测试计划报告的撰写;7 整个软件试运行、软件测试、测试报告的撰写和用户手册的撰写工作;8 项目文档和代码的规范化整合;10整个项目的总结和课程设计总结报告的撰写。 工作计划安排: 11月26日: 确定研究课题,进行可行性研究。 11月26日: 做好内容安排。 11月26日11月28日: 完成概要设计、

3、完成详细设计。 11月27日11月28日: 完成代码的编写。 11月28日: 进行测试和维护。 11月28日: 对整个设计进行补充和检查。第一章 可行性研究1.1 引言1.1.1 可行性研究目的 在课程设计项目中,井字棋游戏设计作为初学者的我们来说,是个比较适合和有研究意义的题目。 “井字棋”游戏(又叫“三子棋”),或是一字棋,是一款十分经典的益智小游戏,想必很多玩家都有玩过。“井字棋”的棋盘很简单,是一个33的格子,很像中国文字中的“井”字,所以得名“井字棋”。“井字棋”游戏的规则与“五子棋”十分类似,“五子棋”的规则是一方首先五子连成一线就胜利;“井字棋”是一方首先三子连成一线就胜利。虽然

4、这只是个很简单的小游戏,但作为初学者的我们认识项目设计的技巧与结构及其概念的理解,封装性、继承派生、多肽的理解及实现,是比较好的课题。对我们以后的大型程序的设计奠定了基础。所以作为我们这次的课程设计项目来说,我们认为是个很好的、有可研究性的设计项目。1.1.2 背景(说明井字棋设计背景,开发目的等)对于21世纪的人们来说,游戏日益成为我们生活中必不可少的休闲娱乐工具。为了满足人们的需要,现在越来越多的人们把游戏作为一种商品对待,就比如中国,像盛大、网易、滕讯等大型的游戏开发公司更把游戏的研究看作是一棵摇钱树,所以游戏程序设计人员在未来是不可多得的人才。对于学软件工程的我们来说,一个优秀的程序员

5、也许是我们学习的优秀目标,所以在出始阶段我们就注重项目设计的理念,而且喜欢游戏的我们更希望自己在将来能够做出一个自己很满意且适合市场的游戏来,所以我们这次以这个为题目就是想熟悉游戏编程的最基础的设计思想和实现手段的了解,为我们以后打下基础。虽然井字棋是个很简单的小游戏,基本上人们都不玩了,但是作为一种我们的设计项目,我们都觉得是个很好的且适合的项目。1.2 可行性研究的前提1.2.1 要求(说明井字棋的预期要求)功能:屏幕输出棋盘和棋子(可用特殊符号代替);实现:用户与电脑下棋(可选)功能和修改。难点:判断输赢的算法及简单的人工智能实现。1.2.2 目标首先:能做出棋盘的基本样式。最后:能实现

6、玩家与电脑的对弈,最好能做到电脑的智能化。1.2.3 评价尺度 第一:实现电脑的智能化;第二:做到界面美观易懂;第三:达到娱乐的最低水平。第二章 需求分析2.1 任务概述该软件的设计主要是实现简单的三字棋,能做到玩家与玩家之间的对弈或者玩家与电脑之间的对弈,可考虑怎样实现电脑的智能化。其次,从程序的设计过程中理解实现程序的方法和理念,学会怎么样做到面向对象设计,理解面向对象的概念及结构的封装性和实用性,能为以后的设计奠定一些良好的基础。2.2对性能的规定 此节说明软件的性能要求:精度: 本程序中按照系统给出的提示,输入数字,实现程序的功能。应该注意,输入的一定只能是数字,若输入字母或其他,则出

7、错。时间特性:由于本程序并不是很庞大,故响应时间短,显示结果迅速。故障处理要求:只有在非法输入是,出现死循环,此时应该退出程序,重新输入。运行环境规定运行的软件环境 :windows 7、windowsxp、运行该软件所需要的硬设备: pc机一台。第三章 概要设计3.1 总体设计3.1.1 基本设计概念和处理流程人机对弈的难点在于当人走一步棋之后,计算机如何走下一步,即计算机如何找出最合适的位置去走棋。这就需要一定的算法,或者叫做计算机的ai。对于井字棋、五子棋等两方较量的游戏来说,minimax算法(极小极大算法)是最基本也是最常用的。算法的原理不在这里解释了,我们直接看该算法在井字棋中的应

8、用。井字棋中,假设使用“x”的是人,使用“o”的是计算机。“x”方先走,设定x方的最大利益为正无穷(程序使用常量+infinity表示),o方的最大利益为负无穷(程序中使用-infinity表示),即x方和o方走的每步棋都要力图使自己的利益最大化,而使对方的利益最小化。这样我们称x方为max(因为他总是追求更大的值),o方为min(它总是追求更小的值),各自都为争取自己的最大获益而努力。现在举例说明,比如图4所示的棋局树:图1棋局形成的树x方先走,有三种选择,如图4中第二层所示。假设x方选择最左边的走法,那么o方接下来将有5种走法,o方会选择最小化的走法,即值为-1的走法,因为它的最大利益是负

9、无穷;同理,x方的另外两种走法会分别得到o方的最小值1和-2。这样,对于x方来说,三种走法会导致o方最小化值分别为-1、1、-2,x方的最佳策略则是选择其中最大的,即第二层中间的走法,因为它的最大利益是正无穷,这就是极小极大算法的体现x方的选择总是极大化,o方的选择总是极小化。对于其中那些值的是如何计算的,我们举例说明,比如对于第三层最左边的棋局,在这种状态下,如果把棋局空白处都填上x,则x共有6中3连子情况,即获胜情况;如果把空白处都填上o,则o共有5种3连子情况,所以结果是二者相减等于1。在具体走起过程中,max面对min最大获利中的最小值时,会选择其中最大的,比如图4第二层小括号内的值都

10、是第三层中能使min最大获利的最小值,这时候max选择其中最大的,这对max最为有利,所以max方选择图4第二层中间的走法最好。同样道理,min也会一样,选择对自己最有利的,即max有可能获得的最大值。这时候,min在走棋时会考虑max方占据哪个位置对max最有利,然后min把这个位置先占了。有点难理解,其实就是抢先把对对手有利的位置抢占了。简单说,x方或者max方的走棋时由人来控制的,我们不仔细说了。对于o方或者min方,它走棋时要考虑哪个位置对x方最有利,然后把该位置占据,即o的最佳走棋就是x的最佳走棋。所以o在走棋之前,先站在x的角度寻找最佳走棋位置。后文中minimax方法就是站在x角

11、度来考虑极小极大算法,找到x的最佳走棋位置,然后由o方来占据该位置。2、极小极大算法整个算法包括如下几个部分:首先要有一个评估方法gamestate,对每走一步棋后的棋局进行评估,估值为win常量说明x方,即max方获胜;估值为lose则o方,即min方获胜;估值draw为平局;估值为inprogress,说明棋未走完;估值为double_link,说明棋局中有两连子情况然后用一个minimax方法寻找在当前棋局状态下x方的最佳位置, x方的最佳位置就是当x走该位置后,o方所有走法中最小值里的最大值,比如图4中第二层x 的位置选择。当找到该位置后,由o方来抢先占据该位置。最后用两个递归方法mi

12、n和max来遍历所有的棋局。min方法负责找出o方的最小值,比如图1第二层最左边的棋局会导致5中o方的走法,min方法就是找出这5种走法中的最小值。同理,max方法负责找出x方的最大值,比如图1第二层三种棋局中的中间棋局。3.1.2功能需求与程序的关系计算机为一方,人为一方,交替下棋,谁先连成一条直线谁胜;允许人选择先下还是后下。 2界面要求:初始状态显示棋盘,并显示玩家的操作键;游戏进行状态动态显示棋盘不同玩家的棋子用不同符号显示,屏幕上显示当前玩家号,结束时显示赢家号。 3提示计算机自动下棋的规则:计算机下时,应考虑所有空位,并按行、列、对角线计算每个空位的分值,若在某行(列、对角线)上,

13、(设计算机画x,人画o) 已有xx 加50分 已有oo 加25分 已有x空 加10分 已有o空 加8分 都是空 加4分 然后选分值最高的位置画x。3.2 系统出错处理设计(1)违规输入字符,程序可能会出现死循环或者直接结束程序。(2)规则里面所定义的若有错误输入,则会根据程序的提示重新输入。3.3 性能1程序耗费电脑内存和cpu开销很小。2玩家与电脑对战时al的智能很高。3可以选择电脑难度,适合各种水平的玩家。4游戏界面比较美观,亲近,方便大众接受。3.4 程序设计:/ 按钮的监听事件private class jbclick implements actionlistener / 当单击按钮

14、时public void actionperformed(actionevent e) for (int i = 0; i 9; i+) if (e.getsource() = jbi) jbi.settext(x); / 被单击的按钮走“x”jbi.setenabled(false); /置为不可用int gamestate = gamestate(jb); / 获取棋盘状态/ 如果棋局未结束,则计算机走下一步if (!(gamestate = win | gamestate = lose | gamestate = draw) int nextpos = getnextmove(jb);

15、/ 获取下一步走棋位置jbnextpos.settext(o); / 走棋“o”jbnextpos.setenabled(false);gamestate = gamestate(jb); / 获取最新的棋盘状态/ 输出棋局胜负switch (gamestate) case win: joptionpane.showmessagedialog(null, x方获胜, 提示,joptionpane.default_option); break;case lose:joptionpane.showmessagedialog(null, o方获胜, 提示,joptionpane.default_op

16、tion);break;case draw: joptionpane.showmessagedialog(null, 平局, 提示,joptionpane.default_option);break;/ 如果结束,则提示if (gamestate = win | gamestate = lose | gamestate = draw) int over = joptionpane.showconfirmdialog(null, 是否再来一局?, 提示, joptionpane.yes_no_option, joptionpane.question_message);if (over = jop

17、tionpane.yes_option) / 再来一局for (int i = 0; i 9; i+) jbi.settext( );jbi.setenabled(true); else system.exit(0); / 退出游戏然后,获取棋局状态的方法加入寻找两连子的代码,如下:/ 获取棋盘当前状态public int gamestate(jbutton jb) int result = inprogress;boolean isfull = true;/ 判断棋盘是否已满for (int pos = 0; pos 9; pos+) char chess = jbpos.gettext()

18、.charat(0);if (empty = chess) isfull = false;/ 寻找三连子情况for (int status : win_status) / 遍历8中棋局获胜状态/ 得到某个获胜棋局状态的第一个索引的字符char chess = jbstatus0.gettext().charat(0);/ 如果为空,说明此处未下棋子,跳出循环,找下一个状态if (chess = empty) continue;int i;for (i = 1; i status.length; i+) / 查看其余两个字符if (jbstatusi.gettext().charat(0) !=

19、 chess) / 不与第一个索引字符一致break; / 表明未三子连线,跳出if (i = status.length) / 三子连线result = chess = x ? win : lose;break;/ 寻找两连子情况if (result != win & result != lose) if (isfull) result = draw;/不输不赢且棋盘满则为平 else int finds = new int2;/ 存放x或o的两连子情况for (int status : win_status) char chess = empty;boolean hasempty = fa

20、lse;int count = 0;/ 计数for (int i = 0; i 1) if (chess = x) finds0+; else finds1+;/ 两连子情况if (finds1 0) / o的两连子result = -double_link; else if (finds0 0) / x的两连子result = double_link;return result;/ 记录了胜负平或者两连子情况o方走棋时,要得到走棋位置,我们用一个方法来获取该位置,如下:public int getnextmove(jbutton board) int nextpos = minimax(bo

21、ard, 3);return nextpos;上面方法中调用了极小极大算法minimax,如下:/以x的角度来考虑的极小极大算法public int minimax(jbutton board, int depth) int bestmoves = new int9;/存放最佳走棋位置int index = 0;int bestvalue = -infinity;/ 搜索所有空位,试探填上x,然后选其中最小值的for (int pos = 0; pos bestvalue) / 选择最小值里最大的bestvalue = value;index = 0;bestmovesindex = pos;

22、 else if (value = bestvalue) index+;bestmovesindex = pos;boardpos.settext( );return bestmovesindex;最后,两个递归方法min和max如下:/对于o,估值越小对其越有利public int min(jbutton board, int depth) int evalvalue = gamestate(board);boolean isgameover = (evalvalue = win | evalvalue = lose | evalvalue = draw);if (depth = 0 | i

23、sgameover) return evalvalue;int bestvalue = infinity;for (int pos = 0; pos 9; pos+) if (boardpos.gettext().charat(0) = empty) boardpos.settext(o);/ 选择最小值bestvalue = math.min(bestvalue, max(board, depth - 1);boardpos.settext( );return evalvalue;/对于x,估值越大对其越有利public int max(jbutton board, int depth) i

24、nt evalvalue = gamestate(board);boolean isgameover = (evalvalue = win | evalvalue = lose | evalvalue = draw);if (depth = 0 | isgameover) return evalvalue;int bestvalue = -infinity;for (int pos = 0; pos 9; pos+) if (boardpos.gettext().charat(0) = empty) boardpos.settext(x);/ 选择最大值bestvalue = math.max(bestvalue, min(board, depth - 1)boardpos.settext( );return evalvalue;第五章 测试分析 本程序的功能非常明显:#字棋。本程序提供1种对战模式:玩家vs电脑。玩家和电脑对战时选择难度和谁先手,玩家很容易赢

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论