毕业设计(论文)-拈游戏的设计.doc

上传人:爱问知识人 文档编号:3284863 上传时间:2019-08-08 格式:DOC 页数:34 大小:245.52KB
返回 下载 相关 举报
毕业设计(论文)-拈游戏的设计.doc_第1页
第1页 / 共34页
毕业设计(论文)-拈游戏的设计.doc_第2页
第2页 / 共34页
毕业设计(论文)-拈游戏的设计.doc_第3页
第3页 / 共34页
毕业设计(论文)-拈游戏的设计.doc_第4页
第4页 / 共34页
毕业设计(论文)-拈游戏的设计.doc_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《毕业设计(论文)-拈游戏的设计.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)-拈游戏的设计.doc(34页珍藏版)》请在三一文库上搜索。

1、中北大学2011届毕业设计说明书1 引言1.1 开发背景据说,拈游戏起源于中国,英文名字叫做“NIM”,是由广东话“拈”(取物之意)音译而来,经由当年到美洲打工的华人流传出去,这个游戏一个常见的变种是将十二枚硬币分三列排成3,4,5再开始玩,我们这里讨论的是一般意义上的“拈”游戏。另外一种形式也称为取石子游戏,取石子问题是个家喻户晓的游戏。它的问题是这样的:“有一堆小石子共100颗,甲乙两人轮流取,每次可取1至10颗,取完的人为胜者,若甲先取乙后取,谁能获胜?”天下的游戏五花八门,必胜策略成为人们眼中的救星。而对必胜策略是否存在的具体阐述是在博弈论当中。博弈论是研究竞争中参加者为争取最大利益应

2、当如何做出决策的数学方法1。博弈论又被称为对策论,是研究具有斗争或竞争性质现象的理论和方法,它既是现代数学的一个新分支,也是运筹学的一个重要学科。博弈要素:(1) 局中人:在一场竞赛或博弈中,每一个有决策权的参与者成为一个局中人。只有两个局中人的博弈现象称为“两人博弈”,而多于两个局中人的博弈称为“多人博弈”;(2) 策略:一局博弈中,每个局中人都有选择实际可行的完整的行动方案,即方案不是某阶段的行动方案,而是指导整个行动的一个方案,一个局中人的一个可行的自始至终全局筹划的一个行动方案,称为这个局中人的一个策略。如果在一个博弈中局中人都总共有有限个策略,则称为“有限博弈”,否则称为“无限博弈”

3、; (3) 得失:一局博弈结局时的结果称为得失。每个局中人在一局博弈结束时的得失,不仅与该局中人自身所选择的策略有关,而且与全局中人所取定的一组策略有关。所以,一局博弈结束时每个局中人的“得失”是全体局中人所取定的一组策略的函数,通常称为支付函数;(4) 博弈涉及到均衡:均衡是平衡的意思,在经济学中,均衡意即相关量处于稳定值。在供求关系中,某一商品市场如果在某一价格下,想以此价格买此商品的人均能买到,而想卖的人均能卖出,此时我们就说,该商品的供求达到了均衡。所谓纳什均衡,它是一个稳定的博弈结果2。该课题主要是通过“拈游戏”的各种成功策略来对博弈论进行研究,针对“拈游戏”来研究几种博弈论的方法。

4、1.2 国内外发展状况在所有双人对局游戏中,拈游戏是极其古老且饶富兴趣的一个课题。据说,拈游戏源自中国,经由被贩卖到美洲的奴工们外传。辛苦的工人们,在工作闲暇之余,用石头玩游戏以排遣寂寞。流传到高级人士,则用便士 (Pennils),在酒吧柜台上玩。直到本世纪初,哈佛大学的数学教授Chales Leonard Bouton提出一篇极详尽的分析和证明,利用数的二进位表示法,在理论上解答了这个古老游戏的一般法则:对任意列数的铜板,每列有任意枚数,如何取得致胜之道3。二进制异或运算是不进位的加法运算:00=0,01=1,10=1,11=0。现定义:二进制数做不进位加法,和为0时,称为偶式;和不为0时

5、,称为奇式。容易发现,偶式各个加数相同位上1的个数都是偶数,奇式各个加数相同位上1的个数至少还有一个数奇数。任意一个二进制数的不进位加法有两个重要的性质:(1) 和为偶式时,在这些数中任取一个数,减去一个小于等于这个数的数,所得的差和其他各个数的不进位加法的和一定为奇式。(2) 和为奇式时,总可以在这些数中找到一个数,将它减去一个适当的数后,使所得的差与其他各个数的不进位加法的和一定为偶式。利用这两个性质,在游戏中能获胜时就必定能胜。原理是:石子取完后,各堆石子数都是0,不进位加法是偶式。甲要取胜,在每次取石子前,各堆石子数的不进位加法和应为奇式。取石子时,要选择堆和取的个数,使剩下的石子数的

6、不进位加法和为偶式。随后不管乙怎么取,取后剩下的石子数的不进位加法总是奇式。所以,取胜的诀窍就是:把偶式留给对方4。1.3 本课题的研究内容本课题研究的题目是:拈游戏的设计。Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG)。满足以下条件的游戏是ICG:(1) 有两名选手;(2) 两名选手交替对游戏进行移动(move),每次一步,选手可以在有限的合法移动集合中任选一种进行移动;(3) 对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的

7、任何操作、骰子的点数或者其它什么因素;(4) 如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是说此时无法进行移动),则这名选手负。根据这个定义,很多日常的游戏并非ICG。例如象棋就不满足条件(3),因为红方只能移动红子,黑方只能移动黑子,合法的移动集合取决于轮到哪名选手操作5。通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。本文主要的研究内容包括:(1) 完成人-机拈游戏的设计;(2) 游戏开始前设计必要参数:每堆石子个数

8、,堆的数目,人人方式,还是人机方式;(3) 生成石子堆;(4) 移动石子;(5) 判断结果。2 开发工具C+ Builder优化的32位原码(Native Code)编译器建立在Borland公司久经考验的编译技术基础之上,提供了高度安全性、可靠性、快速性的编译优化方法,完全编译出原始机器码而非中间码,软件执行速度大大提高。在编译和连接过程中,C+ Builder自动忽略未被修改的原代码和没有使用的函数,从而大大提高了编译和连接速度。C+ Builder的CPU透视工具包括五个独立的小面板,可以对正在运行程序从内部进行深层次的了解。另外C+ Builder还提供了一个专业开发环境所必需的命令行

9、工具,以帮助建立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的集成开发环

10、境(IDE)提供了可视化窗体设计器、对象观察器、控件板、工程管理器、集成编辑器和调试器等一系列可视化快速应用程序开发(RAD)工具,让程序员可以很轻松地建立和管理自己的程序和资源6-8。C+ Builder提供了方便的代码编辑功能。尽管你可以使用记事本、Word或其它任何文本编辑器来写代码,但除非特殊需要,否则那将是极为低效的方法。相反,现在的编程集成环境,都相当的智能,例如:代码自动功能,可以在很多情况下自动完成我们所需的代码,既准确又迅速。可视化的程序界面设计功能。你所要产生的窗口,在设计期间就真实地出现,包括字体、颜色和定位。比如:你不仅可以插入falsh的动画,而且无需运行,就直接可以

11、在你的界面上看到该动画的演播,这是别的编程环境不能做到的。3 系统分析3.1 需求描述3.1.1 系统需求本系统硬件环境:CPUAMD2800+,内存512M以上,硬盘80G以上。本系统软件环境:操作系统Windows XP,Borland C+Builder 5。3.1.2 系统设计思想及功能设置系统需求分析的目标就是明确系统开发的目标和用户的使用需求,提出新系统的逻辑方案。(1) 总体需求根据系统开发的要求,确定系统功能模块,并对其进行模块划分工作。如图3.1所示为系统模块设计图。拈游戏的设计游戏入口系统操作游戏配置堆数的选择每堆石子数对弈的方式演示区设置操作区设置结果的判定图3.1 系统

12、模块设计图(2) 功能设计分析1)参数配置界面需求参数配置界面需求分析,定制配置界面内容。配置界面主要是开始游戏前对游戏相关的参数配置,包括:拈游戏中堆的数目,每堆石子的数目以及对弈模式地选择等。2) 游戏操作界面需求游戏操作界面需求分析,定制演示界面内容。演示界面即游戏运行界面,该界面是游戏运行的动态界面,界面包括:演示区、操作区、状态显示区、结果的判定等。演示区是游戏动态运行的表现形式;操作区控制游戏进行演示;状态显示区即游戏运行时对弈双方的操作状态的显示,用于提示用户目前属于何种对弈状态;通过对次数和结果的判断掌握游戏规律。 3.2 可行性分析可行性分析包括两层含义:一是可能性,二是必要

13、性。通过可行性研究,可避免盲目投资,减少损失。下面从三方面来讨论9:(1)经济可行性:主要是只指估算一个新的游戏系统开发所需要的投资费用和运算费用。本系统所需的软硬件成本比较低、投资小、在经济上是可行的。(2)操作可行性:系统能够正常运行,并能执行相应的操作,按照相关的操作正常输出,合理的提供给用户使用。(3)技术可行性:系统设计一定要考虑到业务未来发展的需要,尽可能设计得简明,降低个功能模块的耦合度,并能够充分的考虑其兼容性,系统能够支持硬件、软件等多层面的可扩展性。4 系统设计本章主要详细说明系统设计方法以及开发过程。内容主要包括算法设计、游戏界面设计、功能模块的实现等。4.1 算法设计如

14、果石头的数目是偶数,就把它们分为两堆,每堆有同样多的数目。这样无论对手如何取,你只要保证你取石子之后是安全局面,你就能赢。如果石头数目是奇数个呢?我们做如下分析:当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。首先看整个游戏

15、过程,从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,

16、如此下去,己方必输。推广到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, M

17、n)= 0。 结论2当XOR(M1, M2, Mn)= 0时,对任何一个M值的改变(取走石头),都会让XOR(M1, M2, Mi, Mn)! = 0。 结论3有了这三个的结论,我们可以知道,当M为奇数时,无论怎样分堆,总是先动手的人赢。4.2 游戏界面设计游戏界面主要包括三个部分:游戏规则显示部分、参数配置部分、游戏操作部分。4.2.1 游戏规则显示的设计游戏规则显示界面是面向用户的游戏入口,友好的界面会使用户对游戏产生更大的兴趣。界面顶端是系统的标志,NIM即拈的意思;同时还可以显示在游戏操作的过程中显示游戏的对弈模式,这样的界面总体看起来简易美观,符合游戏的基本设计。 使用C+Build

18、er也可以使得界面更加的简洁直观,游戏的总体设计界面如图4.1所示。图4.1 游戏总体设计界面4.2.2 参数配置界面的设计参数配置界面为游戏可以顺利而进行必要参数配置13,点击“新游戏”按钮即可显示参数配置界面,如图4.2所示。图4.2 参数配置界面参数配置界面分为四个区域,分别为:游戏对弈方式的选择,选取堆的数目,每堆的石子数目,自动分堆的实现。下面分别介绍每个区域的设计原理。(1)游戏对弈方式的选择直接对游戏的模式进行选择,使得用户使用起来更加美观。(2)堆的数目石子堆数是游戏难度的一种表现方式,石子堆数越少,游戏设置最少为2堆,游戏的难度也就相对小。本系统共设计了四堆石子,符合一般用户

19、的接受难度水平。用户根据组合按钮选择石子堆数,并根据情况选择每堆石子的生成。这个区域有两个功能模块,分别为:1) 选择的堆数目,最多可选择四堆。2) 生成每堆石子数目有两种方式,分别为:随机生成和人工指定。(3)每堆的石子数目每堆石子最多为20个,生成的堆数与每堆的石子数相关联。当选择的相应的堆数时,进而选择每一堆石子的数目。石子的数目可以是随机生成的,也可以人工指定。以下代码是用来设置对石子进行人工指定以及每堆的石子数目14:void TFormMain:DrawStones(TImage *image, int num) / 初始化石头,使得石子由下到上排列,每堆最多20个石子 int c

20、ols = 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 _f

21、astcall 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 eNum

22、3-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; O

23、K = 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=Num1N

24、um1=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; /初始化为不安全状

25、态 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 = N

26、um1(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; t

27、aketag = 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 游戏操作界面的设计操作界面是游戏运行的界面,它将系统运行过程动态的表现出来。操作界面分为四部分,分别是:演示区、操作区

28、、状态显示区和结果判定区。(1) 演示区,如图4.4所示。图4.4 演示区演示区即游戏运行的动态演示区域,它能够把游戏的运行过程演示出来,目前系统最多能够进行4堆石子的演示,每堆石子最多为20个。演示区会根据操作区的相关操作来取掉相应堆石子的数目。直到取完最后一个石子时游戏结束,并对结果进行判定。(2) 操作区,如图4.5所示。图4.5 操作区操作区是对演示区进行操作的必要手段,演示区的石子数目随着操作区的提供的命令去执行,不断的减少石子,直到石子为空时,游戏结束。对应的取石子并实现动态移动石子的代码如下: void TFormMain:TakeStones(TImage *image, in

29、t 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 = cl

30、Green; 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

31、所示。图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

32、) 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;

33、if(result = 0) return(true); else return(false);该方法会判断当前的石子数目来取剩下的石子,并且是以游戏最优状态来取石子。所以用户要想获得胜利,那就要比机器更先一步取得最优方法。(3) 状态显示区状态显示区即游戏运行时对弈双方的操作状态的显示,用于提示用户目前属于何种对弈状态。状态显示区的界面如图4.7所示。图4.7 状态显示区(4) 结果判定区结果判定区可以在双方对弈结束之后,能够及时地将游戏的结果显示在“提示信息”栏中;同时,可以在游戏进行的过程中提示应该哪一方执行取石子操作,使得游戏的进行更加的明朗化。对于“提示信息”栏的功能实现代码如下:

34、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

35、= true; MemoInfo-Text = 电脑走了,该你走; ComputerTake(); else LabelActor-Caption = 玩家; else if(LabelActor-Caption = 甲方) LabelActor-Caption = 乙方; else LabelActor-Caption = 甲方; 4.3 功能模块的实现根据系统需求分析与界面设计,结合对算法的研究,对系统进行功能模块划分,主要分为两个功能模块,分别为:游戏参数配置模块和游戏操作界面模块。在经过对系统的分析之后,可以得到系统总体设计流程图,如图4.8所示。否设置相关参数执行参数返回操作界面开始

36、进入游戏界面开始游戏进入参数配置界面否是是生成石子用户或者机器取石子,取完为止判定游戏结果游戏结束图4.8 系统整体流程图首先,运行系统,进入游戏操作界面,游戏操作界面即可以完成系统运行所需的各项参数的表现形式以及操作状态和演示界面的实现。它提供给用户良好的直观可选的过程,使游戏每一项参数都一目了然,设置完参数后点击“确定”按钮即可。其次,系统会根据用户设置的参数提供相应的界面与命令执行结果。这时用户就可以开始进行游戏,这是一个斗智斗勇的游戏,讲究的是谁最先取的优先权,取的最优方式者将会是游戏的最终获胜者。比赛双方交替的的进行取石子,直到石子取完为止。最后,系统根据哪一方取掉最后一个石子来判断比赛胜负,这时游戏结束。4.3.1 游戏参数配置模块配置模块提供系统相关的参数配置,是系统运行的必要功能配置,它用于管理、监控和配置系统运行的整个过程,总共四个参数配置,缺一不可。如图4.9给出了配置界面的流程图,本节将结合配置界面流程图来分析配置模块的设计原理。对游戏参数的配置设定石子堆数设定石子的生成方式根据设定参数配置游戏点击“确定”进入游戏操作界面设定交互方式判定结果类型

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1