已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中北大学2011届毕业设计说明书1 引言1.1 开发背景据说,拈游戏起源于中国,英文名字叫做“NIM”,是由广东话“拈”(取物之意)音译而来,经由当年到美洲打工的华人流传出去,这个游戏一个常见的变种是将十二枚硬币分三列排成3,4,5再开始玩,我们这里讨论的是一般意义上的“拈”游戏。另外一种形式也称为取石子游戏,取石子问题是个家喻户晓的游戏。它的问题是这样的:“有一堆小石子共100颗,甲乙两人轮流取,每次可取1至10颗,取完的人为胜者,若甲先取乙后取,谁能获胜?”天下的游戏五花八门,必胜策略成为人们眼中的救星。而对必胜策略是否存在的具体阐述是在博弈论当中。博弈论是研究竞争中参加者为争取最大利益应当如何做出决策的数学方法1。博弈论又被称为对策论,是研究具有斗争或竞争性质现象的理论和方法,它既是现代数学的一个新分支,也是运筹学的一个重要学科。博弈要素:(1) 局中人:在一场竞赛或博弈中,每一个有决策权的参与者成为一个局中人。只有两个局中人的博弈现象称为“两人博弈”,而多于两个局中人的博弈称为“多人博弈”;(2) 策略:一局博弈中,每个局中人都有选择实际可行的完整的行动方案,即方案不是某阶段的行动方案,而是指导整个行动的一个方案,一个局中人的一个可行的自始至终全局筹划的一个行动方案,称为这个局中人的一个策略。如果在一个博弈中局中人都总共有有限个策略,则称为“有限博弈”,否则称为“无限博弈”; (3) 得失:一局博弈结局时的结果称为得失。每个局中人在一局博弈结束时的得失,不仅与该局中人自身所选择的策略有关,而且与全局中人所取定的一组策略有关。所以,一局博弈结束时每个局中人的“得失”是全体局中人所取定的一组策略的函数,通常称为支付函数;(4) 博弈涉及到均衡:均衡是平衡的意思,在经济学中,均衡意即相关量处于稳定值。在供求关系中,某一商品市场如果在某一价格下,想以此价格买此商品的人均能买到,而想卖的人均能卖出,此时我们就说,该商品的供求达到了均衡。所谓纳什均衡,它是一个稳定的博弈结果2。该课题主要是通过“拈游戏”的各种成功策略来对博弈论进行研究,针对“拈游戏”来研究几种博弈论的方法。1.2 国内外发展状况在所有双人对局游戏中,拈游戏是极其古老且饶富兴趣的一个课题。据说,拈游戏源自中国,经由被贩卖到美洲的奴工们外传。辛苦的工人们,在工作闲暇之余,用石头玩游戏以排遣寂寞。流传到高级人士,则用便士 (Pennils),在酒吧柜台上玩。直到本世纪初,哈佛大学的数学教授Chales Leonard Bouton提出一篇极详尽的分析和证明,利用数的二进位表示法,在理论上解答了这个古老游戏的一般法则:对任意列数的铜板,每列有任意枚数,如何取得致胜之道3。二进制异或运算是不进位的加法运算:00=0,01=1,10=1,11=0。现定义:二进制数做不进位加法,和为0时,称为偶式;和不为0时,称为奇式。容易发现,偶式各个加数相同位上1的个数都是偶数,奇式各个加数相同位上1的个数至少还有一个数奇数。任意一个二进制数的不进位加法有两个重要的性质:(1) 和为偶式时,在这些数中任取一个数,减去一个小于等于这个数的数,所得的差和其他各个数的不进位加法的和一定为奇式。(2) 和为奇式时,总可以在这些数中找到一个数,将它减去一个适当的数后,使所得的差与其他各个数的不进位加法的和一定为偶式。利用这两个性质,在游戏中能获胜时就必定能胜。原理是:石子取完后,各堆石子数都是0,不进位加法是偶式。甲要取胜,在每次取石子前,各堆石子数的不进位加法和应为奇式。取石子时,要选择堆和取的个数,使剩下的石子数的不进位加法和为偶式。随后不管乙怎么取,取后剩下的石子数的不进位加法总是奇式。所以,取胜的诀窍就是:把偶式留给对方4。1.3 本课题的研究内容本课题研究的题目是:拈游戏的设计。Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG)。满足以下条件的游戏是ICG:(1) 有两名选手;(2) 两名选手交替对游戏进行移动(move),每次一步,选手可以在有限的合法移动集合中任选一种进行移动;(3) 对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的任何操作、骰子的点数或者其它什么因素;(4) 如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是说此时无法进行移动),则这名选手负。根据这个定义,很多日常的游戏并非ICG。例如象棋就不满足条件(3),因为红方只能移动红子,黑方只能移动黑子,合法的移动集合取决于轮到哪名选手操作5。通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。本文主要的研究内容包括:(1) 完成人-机拈游戏的设计;(2) 游戏开始前设计必要参数:每堆石子个数,堆的数目,人人方式,还是人机方式;(3) 生成石子堆;(4) 移动石子;(5) 判断结果。2 开发工具C+ Builder优化的32位原码(Native Code)编译器建立在Borland公司久经考验的编译技术基础之上,提供了高度安全性、可靠性、快速性的编译优化方法,完全编译出原始机器码而非中间码,软件执行速度大大提高。在编译和连接过程中,C+ Builder自动忽略未被修改的原代码和没有使用的函数,从而大大提高了编译和连接速度。C+ Builder的CPU透视工具包括五个独立的小面板,可以对正在运行程序从内部进行深层次的了解。另外C+ Builder还提供了一个专业开发环境所必需的命令行工具,以帮助建立C+程序或者准备编译和连接的程序进行更精细的控制。 C+ Builder可以编译所有符合ANSI/ISO标准的原代码,支持最新ANSI C+/C语言特征:模板(Templates)、例外(Exceptions)、运行类型信息(Runtime Type Information)、Namespaces等,另外它还可以使用标准C+库且支持标准模板库(STL),以前的所有C+/C原代码可以不经过修改,直接移植到C+ Builder环境下来。C+ Builder完全支持32位长文件名、多线程程序设计,且允许程序员直接调用任何Win95和NT API函数。 C+ Builder的集成开发环境(IDE)提供了可视化窗体设计器、对象观察器、控件板、工程管理器、集成编辑器和调试器等一系列可视化快速应用程序开发(RAD)工具,让程序员可以很轻松地建立和管理自己的程序和资源6-8。C+ Builder提供了方便的代码编辑功能。尽管你可以使用记事本、Word或其它任何文本编辑器来写代码,但除非特殊需要,否则那将是极为低效的方法。相反,现在的编程集成环境,都相当的智能,例如:代码自动功能,可以在很多情况下自动完成我们所需的代码,既准确又迅速。可视化的程序界面设计功能。你所要产生的窗口,在设计期间就真实地出现,包括字体、颜色和定位。比如:你不仅可以插入falsh的动画,而且无需运行,就直接可以在你的界面上看到该动画的演播,这是别的编程环境不能做到的。3 系统分析3.1 需求描述3.1.1 系统需求本系统硬件环境:CPUAMD2800+,内存512M以上,硬盘80G以上。本系统软件环境:操作系统Windows XP,Borland C+Builder 5。3.1.2 系统设计思想及功能设置系统需求分析的目标就是明确系统开发的目标和用户的使用需求,提出新系统的逻辑方案。(1) 总体需求根据系统开发的要求,确定系统功能模块,并对其进行模块划分工作。如图3.1所示为系统模块设计图。拈游戏的设计游戏入口系统操作游戏配置堆数的选择每堆石子数对弈的方式演示区设置操作区设置结果的判定图3.1 系统模块设计图(2) 功能设计分析1)参数配置界面需求参数配置界面需求分析,定制配置界面内容。配置界面主要是开始游戏前对游戏相关的参数配置,包括:拈游戏中堆的数目,每堆石子的数目以及对弈模式地选择等。2) 游戏操作界面需求游戏操作界面需求分析,定制演示界面内容。演示界面即游戏运行界面,该界面是游戏运行的动态界面,界面包括:演示区、操作区、状态显示区、结果的判定等。演示区是游戏动态运行的表现形式;操作区控制游戏进行演示;状态显示区即游戏运行时对弈双方的操作状态的显示,用于提示用户目前属于何种对弈状态;通过对次数和结果的判断掌握游戏规律。 3.2 可行性分析可行性分析包括两层含义:一是可能性,二是必要性。通过可行性研究,可避免盲目投资,减少损失。下面从三方面来讨论9:(1)经济可行性:主要是只指估算一个新的游戏系统开发所需要的投资费用和运算费用。本系统所需的软硬件成本比较低、投资小、在经济上是可行的。(2)操作可行性:系统能够正常运行,并能执行相应的操作,按照相关的操作正常输出,合理的提供给用户使用。(3)技术可行性:系统设计一定要考虑到业务未来发展的需要,尽可能设计得简明,降低个功能模块的耦合度,并能够充分的考虑其兼容性,系统能够支持硬件、软件等多层面的可扩展性。4 系统设计本章主要详细说明系统设计方法以及开发过程。内容主要包括算法设计、游戏界面设计、功能模块的实现等。4.1 算法设计如果石头的数目是偶数,就把它们分为两堆,每堆有同样多的数目。这样无论对手如何取,你只要保证你取石子之后是安全局面,你就能赢。如果石头数目是奇数个呢?我们做如下分析:当M=3的时候,有两种情况,(2, 1)、(1, 1, 1),这两种情况都会是先拿者赢。当M=5的时候,和M=3类似。无论你怎么摆,都会是先拿者赢。若M=7呢?情况多起来了,也是先拿者赢。在对拈游戏进行设计时,用到了很重要的一个运算就是二进制异或运算(XOR),这个运算是解决拈游戏设计关键。异或运算规则如下10-11:XOR(0, 0)= 0;XOR(1, 0)= 1;XOR(0, 1)= 1;XOR(1, 1)= 0。首先看整个游戏过程,从N堆石头(M1, M2, , Mn)开始,双方斗智斗勇,石头一直递减到全部为零(0, 0, 0)。当M为偶数的时候,取胜策略是把M分成相同的两份,这样就能取胜。开始:(M1, M1),它们异或的结果是XOR(M1, M1)= 0。中途:(M1, M2),对手无论怎样从这堆石头中取,XOR(M1, M2)!= 0。己方:(M2, M2),己方还是把两堆变相等。XOR(M2, M2)= 0。最后:(M2, M2),己方取胜。类似的,若M为奇数,把石头分成(1, 1, ,1)奇数堆的时候,XOR(1, 1,1)奇数个 !=0。而这时候,对方可以取走一整堆,XOR(1, 1, 1)偶数个=0,如此下去,己方必输。推广到M为奇数,但是每堆石头的数目不限于1的情况,看看XOR值的规律:开始:(M1, M2, , Mn) XOR(M1, M2, , Mn)=?中途:(M1, M2, , Mn) XOR(M1, M2, , Mn)=?.最后:(0, 0, , 0) XOR(0,0,, 0)=0可以得出三个结论12:当有奇数个石头时,无论如何分堆,XOR(M1, M2, Mn)总是不等于0!因为必然会有奇数堆有奇数个石头(二进制表示最低位为1),异或的结果最低位肯定为1。 结论1当XOR(M1, M2, Mn)!= 0时,总是只需要改变一个Mi的值,就可以让XOR(M1, M2, Mi, Mn)= 0。 结论2当XOR(M1, M2, Mn)= 0时,对任何一个M值的改变(取走石头),都会让XOR(M1, M2, Mi, Mn)! = 0。 结论3有了这三个的结论,我们可以知道,当M为奇数时,无论怎样分堆,总是先动手的人赢。4.2 游戏界面设计游戏界面主要包括三个部分:游戏规则显示部分、参数配置部分、游戏操作部分。4.2.1 游戏规则显示的设计游戏规则显示界面是面向用户的游戏入口,友好的界面会使用户对游戏产生更大的兴趣。界面顶端是系统的标志,NIM即拈的意思;同时还可以显示在游戏操作的过程中显示游戏的对弈模式,这样的界面总体看起来简易美观,符合游戏的基本设计。 使用C+Builder也可以使得界面更加的简洁直观,游戏的总体设计界面如图4.1所示。图4.1 游戏总体设计界面4.2.2 参数配置界面的设计参数配置界面为游戏可以顺利而进行必要参数配置13,点击“新游戏”按钮即可显示参数配置界面,如图4.2所示。图4.2 参数配置界面参数配置界面分为四个区域,分别为:游戏对弈方式的选择,选取堆的数目,每堆的石子数目,自动分堆的实现。下面分别介绍每个区域的设计原理。(1)游戏对弈方式的选择直接对游戏的模式进行选择,使得用户使用起来更加美观。(2)堆的数目石子堆数是游戏难度的一种表现方式,石子堆数越少,游戏设置最少为2堆,游戏的难度也就相对小。本系统共设计了四堆石子,符合一般用户的接受难度水平。用户根据组合按钮选择石子堆数,并根据情况选择每堆石子的生成。这个区域有两个功能模块,分别为:1) 选择的堆数目,最多可选择四堆。2) 生成每堆石子数目有两种方式,分别为:随机生成和人工指定。(3)每堆的石子数目每堆石子最多为20个,生成的堆数与每堆的石子数相关联。当选择的相应的堆数时,进而选择每一堆石子的数目。石子的数目可以是随机生成的,也可以人工指定。以下代码是用来设置对石子进行人工指定以及每堆的石子数目14:void TFormMain:DrawStones(TImage *image, int num) / 初始化石头,使得石子由下到上排列,每堆最多20个石子 int cols = num/5; image-Canvas-Pen-Color = clRed; image-Canvas-Brush-Color = clGreen; int x=20, y=180; while(num0) image-Canvas-MoveTo(x, y); image-Canvas-Ellipse(x-16, y-16, x+16, y+16); x = x + 40; if(x = 200) if(cols = 0) break; x = 20; y = y - 40; cols-; num-; 如果选择“自动分堆”按钮,石子堆里的石子数目会随机生成,代码如下:void _fastcall TFormNewGame:btnAutoGenClick(TObject *Sender) int heapNum, Num1, Num2, Num3, Num4; randomize(); heapNum = random(5); if(heapNum Value = heapNum; Num1 = random(20)+1; eNum1-Value = Num1; Num2 = random(20)+1; eNum2-Value = Num2; if(heapNum =3) Num3 = random(20)+1; eNum3-Value = Num3; else eNum3-Value = 0; if(heapNum =4) Num4 = random(20)+1; eNum4-Value = Num4; else eNum4-Value = 0; 如果石子堆数为2的情况下,即使对第3堆和第4堆也进行了石子数目的设定,运行时也不会生成石子,功能实现代码如下:void _fastcall TFormNewGame:BtnOkClick(TObject *Sender) if(eNum1-ValueValueValue=3&eNum3-ValueValue=4&eNum4-ValueValueValue=0; if(eHeapNum-ValueValue=0; OK = true; Close(); (4)游戏模式的选择游戏模式分为两种,分别为:人机交互和人人交互。人人交互方式执行取石子的程序流程图如图4.3所示。Image=Image4;num=Num4开 始Timage*image;int numheapTagImage=Image1;num=Num1Image=Image2;num=Num2Image=Image3;num=Num3 Y Y Y YNtakeNumnumMemoInfo-Text=AnsiString(”石子数量不够”);returnbreakheapTagNum1=Num1-takeNum;eStoneNum-Max=Num1Num1=Num2-takeNum;eStoneNum-Max=Num2Num1=Num3-takeNum;eStoneNum-Max=Num3 YNum1=Num4-takeNum;eStoneNum-Max=Num4breakbreakN Y Y Y Y Ybreak结 束StoneNum= StoneNum-takeNumbreakbreakbreakbreakN Y图4.3 “人人对战”功能程序流程图如果在参数配置中选择的是“人机对战”的情况下,对应的人机交互的功能实现代码如下:void TFormMain:ComputerTake() int result = 1; /初始化为不安全状态 int takenum = 0; int taketag = 0; bool found = false; bool banlance = false;/电脑通过一堆一堆的查找,直到达到安全状态为止 if(!found) for(int i=1; i=Num1; i+) result = (Num1-i)Num2Num3Num4; banlance = (result = 0); if(banlance) takenum = i; taketag = 1; found = true; break; if(!found) for(int i=1; i=Num2; i+) result = Num1(Num2-i)Num3Num4; banlance = (result = 0); if(banlance) takenum = i; taketag = 2; found = true; break; if(!found) for(int i=1; i=Num3; i+) result = Num1Num2(Num3-i)Num4; banlance = (result = 0); if(banlance) takenum = i; taketag = 3; found = true; break; if(!found) for(int i=1; i0) takenum = 1; taketag = 1; have = true; if(!have & Num20) takenum = 1; taketag = 2; have = true; if(!have & Num30) takenum = 1; taketag = 3; have = true; if(!have & Num40) takenum = 1; taketag = 4; have = true; TakeOpr(taketag, takenum); /电脑操作完毕,对方出手4.2.3 游戏操作界面的设计操作界面是游戏运行的界面,它将系统运行过程动态的表现出来。操作界面分为四部分,分别是:演示区、操作区、状态显示区和结果判定区。(1) 演示区,如图4.4所示。图4.4 演示区演示区即游戏运行的动态演示区域,它能够把游戏的运行过程演示出来,目前系统最多能够进行4堆石子的演示,每堆石子最多为20个。演示区会根据操作区的相关操作来取掉相应堆石子的数目。直到取完最后一个石子时游戏结束,并对结果进行判定。(2) 操作区,如图4.5所示。图4.5 操作区操作区是对演示区进行操作的必要手段,演示区的石子数目随着操作区的提供的命令去执行,不断的减少石子,直到石子为空时,游戏结束。对应的取石子并实现动态移动石子的代码如下: void TFormMain:TakeStones(TImage *image, int total_num, int take_num) if(take_num =0 | total_num =0 ) return; int col, row; int dis; for(int i=0; iCanvas-Brush-Color = clWhite; image-Canvas-FillRect(Rect(40*row-20-16, 40*col-20-16, 40*row-20+16, 40*col-20+16); dis = (col*40-20)-20; if(dis0) dis = dis/10; for(int k=0; kCanvas-Brush-Color = clGreen; image-Canvas-Ellipse(40*row-20-16, 40*col-20-16-k*10, 40*row-20+16, 40*col-20+16-k*10); image-Update(); Sleep(30); image-Canvas-Brush-Color = clWhite; image-Canvas-FillRect(Rect(40*row-20-16, 40*col-20-16-k*10, 40*row-20+16, 40*col-20+16-k*10); total_num-; 取石子时,判断选择的堆,是否还有石子,如果石子为空,则提示用户如图4.6所示。图4.6 提示用户界面该功能的实现代码如下:void TFormMain:TakeOpr(int heapTag, int takeNum) TImage *image; int num; switch(heapTag) case 1: image = Image1; num = Num1; break; case 2: image = Image2; num = Num2; break; case 3: image = Image3; num = Num3; break; case 4: image = Image4; num = Num4; break; if(takeNum num) MemoInfo-Text = AnsiString(没有石子了); return; 用户取完石子后,需要执行异或运算的核心代码15,具体执行代码如下:/执行异或算法以求达到安全状态bool TFormMain:CalBanlance(int num1, int num2, int num3, int num4) int result = 1; if(num10) result = resultnum1; if(num20) result = resultnum2; if(num30) result = resultnum3; if(num40) result = resultnum4; if(result = 0) return(true); else return(false);该方法会判断当前的石子数目来取剩下的石子,并且是以游戏最优状态来取石子。所以用户要想获得胜利,那就要比机器更先一步取得最优方法。(3) 状态显示区状态显示区即游戏运行时对弈双方的操作状态的显示,用于提示用户目前属于何种对弈状态。状态显示区的界面如图4.7所示。图4.7 状态显示区(4) 结果判定区结果判定区可以在双方对弈结束之后,能够及时地将游戏的结果显示在“提示信息”栏中;同时,可以在游戏进行的过程中提示应该哪一方执行取石子操作,使得游戏的进行更加的明朗化。对于“提示信息”栏的功能实现代码如下: if(StoneNumText = 游戏结束!+LabelActor-Caption+赢了!; eHeapNo-Enabled = false; eStoneNum-Enabled = false; btnTake-Enabled = false; BtnNew-Enabled = true; else if(GameMode = 0) if(LabelActor-Caption = 玩家) LabelActor-Caption = 电脑; btnTake-Enabled = false; MemoInfo-Text = 电脑思考中.; Sleep(500); btnTake-Enabled = true; MemoInfo-Text = 电脑走了,该你走; ComputerTake(); else LabelActor-Caption = 玩家; else if(LabelActor-Caption = 甲方) LabelActor-Caption = 乙方; else LabelActor-Caption = 甲方; 4.3 功能模块的实现根据系统需求分析与界面设计,结合对算法的研究,对系统进行功能模块划分,主要分为两个功能模块,分别为:游戏参数配置模块和游戏操作界面模块。在经过对系统的分析之后,可以得到系统总体设计流程图,如图4.8所示。否设置相关参数执行参数返回操作界面开始进入游戏界面开始游戏进入参数配置界面否是是生成石子用户或者机器取石子,取完为止判定游戏结果游戏结束图4.8 系统整体流程图首先,运行系统,进入游戏操作界面,游戏操作界面即可以完成系统运行所需的各项参数的表现形式以及操作状态和演示界面的实现。它提供给用户良好的直观可选的过程,使游戏每一项参数都一目了然,设置完参数后点击“确定”按钮即可。其次,系统会根据用户设置的参数提供相应的界面与命令执行结果。这时用户就可以开始进行游戏,这是一个斗智斗勇的游戏,讲究的是谁最先取的优先权,取的最优方式者将会是游戏的最终获胜者。比赛双方交替的的进行取石子,直到石子取完为止。最后,系统根据哪一方取掉最后一个石子来判断比赛胜负,这时游戏结束。4.3.1 游戏参数配置模块配置模块提供系统相关的参数配置,是系统运行的必要功能配置,它用于管理、监控和配置系统运行的整个过程,总共四个参数配置,缺一不可。如图4.9给出了配置界面的流程图,本节将结合配置界面流程图来分析配置模块的设计原理。对游戏参数的配置设定石子堆数设定石子的生成方式根据设定参数配置游戏点击“确定”进入游戏操作界面设定交互方式判定结果类型 是 是 默认取最后一个赢默认为人人对弈 否 否 否是否配置结束是 图4.9 配置界面流程图如图4.10所示,配置界面分为四个区域,分别为:(1) 设定石子堆数(2) 设定每堆石子的生成方式(3) 设定每堆石子的个数(4) 设定游戏交互方式如果在用户设置参数后,如果有需要重新再设置的话,可以对“取消”按钮进行操作,就可以将已选的参数全部清空,对游戏重新设置参数,这样就可以增强游戏的可操作性,更加地方便快捷。图4.10 参数配置设定完相应参数后,点击“确定”按钮即可进入游戏操作界面。游戏设定完后系统会根据设定的参数提供相应的界面和命令。如图4.10所示:执行的是人工指定堆的操作,对应的“游戏模式”为“双人对战”,选择了“4”即四堆石子;第一堆为“8”,第二堆为“6”,第三堆为“9”,第四堆为“2”; 点击“确定”按钮即可进入游戏操作界面。结果如图4.11所示,并且进行的是人人对弈方式,即对弈双方交替的取石子,当一方取完最后一个石子时,系统提示甲方输或者是乙方赢得比赛。图4.11 实例演示图4.3.2 游戏操作模块游戏操作模块是游戏运行的表现形式,它将系统运行过程动态的表现出来,如图4.12所示。石子取完,判定结果游戏结束是否轮到机器点击“取石子”石子减少相应的数目石子是否取完交替取石子配置参数生成石子开始游戏操作 开始游戏取石子选择堆数和石子数否否是是图4.12 操作界面流程图新建一个游戏后,在配置界面设置了相关参数,确定后演示区会根据配置的参数内容显示堆数和石子的数量以及对游戏模式的设置。接着用户就可以在操作区对游戏进行操作,开始“取石子”操作。如果是人人交互方式就是两个人斗智斗勇的过程,用户可以随心所欲地去任意取石子的数目,并思考如何取石子才是最优的,才能获得比赛的胜利,知道取完石子,比赛结束,这样更赋予了游戏的多样性。如果是人机交互方式的话,那么机器就要赋予它人工智能,这样机器可以根据游戏当前的状态去取石子。人工智能越高,用户想赢得比赛就越难。假如游戏目前状态如图4.13所示。图4.13 显示石子状态图当用户执行如图4.14所示的操作,并且机器智能的执行了一个操作后,状态会由图4.14转变为图 4.15。从图上可以看出,机器从第三堆石子中取走了4个石子。图4.14 操作石子图4.15 操作后石子的显示游戏双方交替的取石子,直到取完石子系统判定输赢,甲方赢会如图4.16提示,乙方赢会如图4.17提示,电脑赢了会如图4.18提示。图4.16 甲方赢提示图4.17 乙方赢提示图4.18 电脑赢提示这时游戏结束,用户可以选择重新点击“新游戏”开始下一轮游戏,或者是退出游戏。5 系统测试5.1 测试目标任何开发平台所开发的系统,测试的目标都是确保所开发软件的功能符合用户的要求。具体表现在以下几个方面16:(1) 确保系统达到需求功能的说明;(2) 确保系统满足性能的需求;(3) 强度测试确认系统能够处理的负载;(4) 确保系统在要求的硬件和软件平台上工作正常。5.2 测试原理原则上讲,可以将软件测试方法分成两大类,即静态测试和动态测试。静态测试是对被测试程序进行特性分析的一些方法的总称,这种方法的主要特性是不利用计算机运行被测试的程序,而是采用其他手段达到检测的目的。动态测试是实际运行被测试程序,输入相应的测试用例,判定执行结果是否符合要求,从而检验程序的正确性,可靠性和有效性。5.3 功能测试本系统中做的测试如下:测试用例1:从游戏操作界面点击“新游戏”开始游戏的配置,配置项分别为三堆石子,石子生成方式为人工指定;第一堆为5个石子,第二堆为8个石子;第三堆6个石子;“游戏模式”为“双人对战”,接着点击“确定”按钮进入操作演示界面,执行取第二堆3个石子。结果:执行后,第二堆石子正常减少3个石子。测试用例2:当游戏正在进行的时候,每一堆最多的石子可取的数目会出现大于现在游戏堆里的石子数目的情况。解决方案:需要对石子的每一堆的操作数目设置为当前石子堆现有的最大石子数来进行操作,通过设置需要取石子的数目与每堆的最大数相对应的方法实现。代码实现如下:void _fastcall TFormMain:eHeapNoChange(TObject *Sender) int heapNo = eHeapNo-Value; eStoneNum-Min = 1; eStoneNum-Value = 1; switch(heapNo) case 1: eStoneNum-Max = Num1; break; case 2: eStoneNum-Max = Num2; break; case 3: eStoneNum-Max = Num3; break; case 4: eStoneNum-Max = Num4; break; 5.4 系统维护为了使软件满足用户的要求,维护软件的生命周期。那么,对软件的维护将必不可少。针对该系统,本系统采用的维护策略是:(1) 采用新的技术,例如软件开发环境(Windows XP),使用较高级的语言来提高程序的可靠性。(2) 采用结构化的技术,使程序易于理解和测试。采用防错性的程序设计,把自检能力引入程序,通过非正常状态的检查,提供审查跟踪。(3) 适应性维护,用户和数据处理人员在使用时常提出改进现有功能,增加新的功能,以及改善总体性能的要求。6 结束语6.1 心得本课题的功能已经基本实现。通过这次毕业设计,自己在C+ Builder这个软件的应用上又获得了新知。通过这次毕业设计,加深了对C+ Builder的了解,熟悉掌握了C+ Builder的使用方法,比较深入的了解了C+ Builder中各个控件的功能和使用方法。通过这次毕业设计,使我认识到光学习书本上的知识是不够的,还要经常进行实践。特别是对应用性很强的计算机专业的学生来说。这次毕业设计是我将理论知识用于实践的一个很好的机会。也通过实践,使我认识到自己对于C+ Builder很多方面的知识还比较匮乏,还应该努力加强理论的学习,只有理论与实践的结合,才能不断提高自己水平。以后我还要多多参加实践多编一些软件,多参加一些大型项目,加强自己对编程的认识和能力。6.2 存在的不足虽然自己完成了拈游戏的设计。但是,由于时间有限,系统设计中还存在许多的不足,在以后的工作中,主要从以下几个方面进行改进:(1) 功能的完善,例如:界面的动态实现可以再柔和,使得游戏更加的人性话;以及在游戏参数配置与算法的结合方面还有一定的不足。(2) 本系统在开发的过程中虽然经过自己的调试和别人使用以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 木地板表面造型处理工操作水平测试考核试卷含答案
- 普通磨料制造工安全生产能力考核试卷含答案
- 偏(均)三甲苯装置操作工安全文化水平考核试卷含答案
- 药物分离纯化工岗前技术水平考核试卷含答案
- 梳理针刺非织造布制作工安全生产基础知识强化考核试卷含答案
- 镀层工岗前进阶考核试卷含答案
- 吹奏乐器制作工安全技能测试考核试卷含答案
- 2026银行工作者面试题及答案
- 2026银行情景面试题及答案
- 2026银行总行遴选面试题及答案
- 临床护理实践指南手术室器械传递
- 2026年深圳网约车考试题库(含答案)
- 粮食仓库粉尘爆炸应急演练方案
- 内科疾病护理消化科
- 2026秋新教材粤教粤科版小学科学五年级上册(全册)教学设计(附目录p194)
- 提高透析充分性(spKt-V)全方位精细化管理策略
- (2026年)依诺肝素的正确注射方法及注意事项课件
- 康复护理评定的常用方法
- 2026新教材语文 统编版语文五年级上册 第六单元 《口语交际:父母之爱》教学课件
- 中国儿童严重过敏反应诊断与治疗建议课件
- 2026首创水务工程岗面试核心题库及专业参考答题答案
评论
0/150
提交评论