毕业设计说明书正文.docx
- 文档编号:11041815
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:38
- 大小:235.72KB
毕业设计说明书正文.docx
《毕业设计说明书正文.docx》由会员分享,可在线阅读,更多相关《毕业设计说明书正文.docx(38页珍藏版)》请在冰豆网上搜索。
毕业设计说明书正文
1引言
1.1开发背景
据说,拈游戏起源于中国,英文名字叫做“NIM”,是由话“拈”(取物之意)音译而来,经由当年到美洲打工的华人流传出去,这个游戏一个常见的变种是将十二枚硬币分三列排成[3,4,5]再开始玩,我们这里讨论的是一般意义上的“拈”游戏。
另外一种形式也称为取石子游戏,取石子问题是个家喻户晓的游戏。
它的问题是这样的:
“有一堆小石子共100颗,甲乙两人轮流取,每次可取1至10颗,取完的人为胜者,若甲先取乙后取,谁能获胜?
”
天下的游戏五花八门,必胜策略成为人们眼中的救星。
而对必胜策略是否存在的具体阐述是在博弈论当中。
博弈论是研究竞争中参加者为争取最大利益应当如何做出决策的数学方法[1]。
。
博弈论又被称为对策论,是研究具有斗争或竞争性质现象的理论和方法,它既是现代数学的一个新分支,也是运筹学的一个重要学科。
博弈要素:
(1)局中人:
在一场竞赛或博弈中,每一个有决策权的参与者成为一个局中人。
只有两个局中人的博弈现象称为“两人博弈”,而多于两个局中人的博弈称为“多人博弈”;
(2)策略:
一局博弈中,每个局中人都有选择实际可行的完整的行动方案,即方案不是某阶段的行动方案,而是指导整个行动的一个方案,一个局中人的一个可行的自始至终全局筹划的一个行动方案,称为这个局中人的一个策略。
如果在一个博弈中局中人都总共有有限个策略,则称为“有限博弈”,否则称为“无限博弈”;
(3)得失:
一局博弈结局时的结果称为得失。
每个局中人在一局博弈结束时的得失,不仅与该局中人自身所选择的策略有关,而且与全局中人所取定的一组策略有关。
所以,一局博弈结束时每个局中人的“得失”是全体局中人所取定的一组策略的函数,通常称为支付函数;
(4)博弈涉及到均衡:
均衡是平衡的意思,在经济学中,均衡意即相关量处于稳定值。
在供求关系中,某一商品市场如果在某一价格下,想以此价格买此商品的
人均能买到,而想卖的人均能卖出,此时我们就说,该商品的供求达到了均衡。
所谓纳什均衡,它是一个稳定的博弈结果[2]。
该课题主要是通过“拈游戏”的各种成功策略来对博弈论进行研究,针对“拈游戏”来研究几种博弈论的方法。
1.2国外发展状况
在所有双人对局游戏中,拈游戏是极其古老且饶富兴趣的一个课题。
据说,拈游戏源自中国,经由被贩卖到美洲的奴工们外传。
辛苦的工人们,在工作闲暇之余,用石头玩游戏以排遣寂寞。
流传到高级人士,则用便士(Pennils),在酒吧柜台上玩。
直到本世纪初,哈佛大学的数学教授ChalesLeonardBouton提出一篇极详尽的分析和证明,利用数的二进位表示法,在理论上解答了这个古老游戏的一般法则:
对任意列数的铜板,每列有任意枚数,如何取得致胜之道[3]。
二进制异或运算是不进位的加法运算:
0∧0=0,0∧1=1,1∧0=1,1∧1=0。
现定义:
二进制数做不进位加法,和为0时,称为偶式;和不为0时,称为奇式。
容易发现,偶式各个加数相同位上1的个数都是偶数,奇式各个加数相同位上1的个数至少还有一个数奇数。
任意一个二进制数的不进位加法有两个重要的性质:
(1)和为偶式时,在这些数中任取一个数,减去一个小于等于这个数的数,所得的差和其他各个数的不进位加法的和一定为奇式。
(2)和为奇式时,总可以在这些数中找到一个数,将它减去一个适当的数后,使所得的差与其他各个数的不进位加法的和一定为偶式。
利用这两个性质,在游戏中能获胜时就必定能胜。
原理是:
石子取完后,各堆石子数都是0,不进位加法是偶式。
甲要取胜,在每次取石子前,各堆石子数的不进位加法和应为奇式。
取石子时,要选择堆和取的个数,使剩下的石子数的不进位加法和为偶式。
随后不管乙怎么取,取后剩下的石子数的不进位加法总是奇式。
所以,取胜的诀窍就是:
把偶式留给对方[4]。
1.3本课题的研究容
本课题研究的题目是:
拈游戏的设计。
Nim游戏是组合游戏(CombinatorialGames)的一种,准确来说,属于“ImpartialCombinatorialGames”(以下简称ICG)。
满足以下条件的游戏是ICG:
(1)有两名选手;
(2)两名选手交替对游戏进行移动(move),每次一步,选手可以在有限的合法移动集合中任选一种进行移动;
(3)对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的任何操作、骰子的点数或者其它什么因素;
(4)如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是说此时无法进行移动),则这名选手负。
根据这个定义,很多日常的游戏并非ICG。
例如象棋就不满足条件(3),因为红方只能移动红子,黑方只能移动黑子,合法的移动集合取决于轮到哪名选手操作[5]。
通常的Nim游戏的定义是这样的:
有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。
本文主要的研究容包括:
(1)完成人-机拈游戏的设计;
(2)游戏开始前设计必要参数:
每堆石子个数,堆的数目,人人方式,还是人机方式;
(3)生成石子堆;
(4)移动石子;
(5)判断结果。
2开发工具
C++Builder优化的32位原码(NativeCode)编译器建立在Borland公司久经考验的编译技术基础之上,提供了高度安全性、可靠性、快速性的编译优化方法,完全编译出原始机器码而非中间码,软件执行速度大大提高。
在编译和连接过程中,C++Builder自动忽略未被修改的原代码和没有使用的函数,从而大大提高了编译和连接速度。
C++Builder的CPU透视工具包括五个独立的小面板,可以对正在运行程序从部进行深层次的了解。
另外C++Builder还提供了一个专业开发环境所必需的命令行工具,以帮助建立C++程序或者准备编译和连接的程序进行更精细的控制。
C++Builder可以编译所有符合ANSI/ISO标准的原代码,支持最新ANSIC++/C语言特征:
模板(Templates)、例外(Exceptions)、运行类型信息(RuntimeTypeInformation)、Namespaces等,另外它还可以使用标准C++库且支持标准模板库(STL),以前的所有C++/C原代码可以不经过修改,直接移植到C++Builder环境下来。
C++Builder完全支持32位长文件名、多线程程序设计,且允许程序员直接调用任何Win95和NTAPI函数。
C++Builder的集成开发环境(IDE)提供了可视化窗体设计器、对象观察器、控件板、工程管理器、集成编辑器和调试器等一系列可视化快速应用程序开发(RAD)工具,让程序员可以很轻松地建立和管理自己的程序和资源[6-8]。
C++Builder提供了方便的代码编辑功能。
尽管你可以使用记事本、Word或其它任何文本编辑器来写代码,但除非特殊需要,否则那将是极为低效的方法。
相反,现在的编程集成环境,都相当的智能,例如:
代码自动功能,可以在很多情况下自动完成我们所需的代码,既准确又迅速。
可视化的程序界面设计功能。
你所要产生的窗口,在设计期间就真实地出现,包括字体、颜色和定位。
比如:
你不仅可以插入falsh的动画,而且无需运行,就直接可以在你的界面上看到该动画的演播,这是别的编程环境不能做到的。
3系统分析
3.1需求描述
3.1.1系统需求
本系统硬件环境:
CPUAMD2800+,存512M以上,硬盘80G以上。
本系统软件环境:
操作系统WindowsXP,BorlandC++Builder5。
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]:
voidTFormMain:
:
DrawStones(TImage*image,intnum)
{
//初始化石头,使得石子由下到上排列,每堆最多20个石子
intcols=num/5;
image->Canvas->Pen->Color=clRed;
image->Canvas->Brush->Color=clGreen;
intx=20,y=180;
while(num>0)
{
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__fastcallTFormNewGame:
:
btnAutoGenClick(TObject*Sender)
{
intheapNum,Num1,Num2,Num3,Num4;
randomize();
heapNum=random(5);
if(heapNum<=1)heapNum=2;
eHeapNum->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__fastcallTFormNewGame:
:
BtnOkClick(TObject*Sender)
{
if(eNum1->Value<1||eNum2->Value<1||
(eHeapNum->Value>=3&&eNum3->Value<1)||
(eHeapNum->Value>=4&&eNum4->Value<1))
{
ShowMessage("请选择!
");
return;
}
else
{
if(eHeapNum->Value<4)eNum4->Value=0;
if(eHeapNum->Value<3)eNum3->Value=0;
OK=true;
Close();
}
}
(4)游戏模式的选择
游戏模式分为两种,分别为:
人机交互和人人交互。
人人交互方式执行取石子的程序流程图如图4.3所示。
图4.3“人人对战”功能程序流程图
如果在参数配置中选择的是“人机对战”的情况下,对应的人机交互的功能实现代码如下:
voidTFormMain:
:
ComputerTake()
{
intresult=1;//初始化为不安全状态
inttakenum=0;
inttaketag=0;
boolfound=false;
boolbanlance=false;
//电脑通过一堆一堆的查找,直到达到安全状态为止
if(!
found)
{
for(inti=1;i<=Num1;i++)
{
result=(Num1-i)^Num2^Num3^Num4;
banlance=(result==0);
if(banlance)
{
takenum=i;
taketag=1;
found=true;
break;
}
}
}
if(!
found)
{
for(inti=1;i<=Num2;i++)
{
result=Num1^(Num2-i)^Num3^Num4;
banlance=(result==0);
if(banlance)
{
takenum=i;
taketag=2;
found=true;
break;
}
}
}
if(!
found)
{
for(inti=1;i<=Num3;i++)
{
result=Num1^Num2^(Num3-i)^Num4;
banlance=(result==0);
if(banlance)
{
takenum=i;
taketag=3;
found=true;
break;
}
}
}
if(!
found)
{
for(inti=1;i<=Num4;i++)
{
result=Num1^Num2^Num3^(Num4-i);
banlance=(result==0);
if(banlance)
{
takenum=i;
taketag=4;
found=true;
break;
}
}
}
if(!
found)
{
//当无法实现安全状态的情况下,电脑会随机的在一堆石子中取走石子
boolhave=false;
if(!
have&&Num1>0)
{
takenum=1;
taketag=1;
have=true;
}
if(!
have&&Num2>0)
{
takenum=1;
taketag=2;
have=true;
}
if(!
have&&Num3>0)
{
takenum=1;
taketag=3;
have=true;
}
if(!
have&&Num4>0)
{
takenum=1;
taketag=4;
have=true;
}
}
TakeOpr(taketag,takenum);//电脑操作完毕,对方出手
}
4.2.3游戏操作界面的设计
操作界面是游戏运行的界面,它将系统运行过程动态的表现出来。
操作界面分为四部分,分别是:
演示区、操作区、状态显示区和结果判定区。
(1)演示区,如图4.4所示。
图4.4演示区
演示区即游戏运行的动态演示区域,它能够把游戏的运行过程演示出来,目前系统最多能够进行4堆石子的演示,每堆石子最多为20个。
演示区会根据操作区的相关操作来取掉相应堆石子的数目。
直到取完最后一个石子时游戏结束,并对结果进行判定。
(2)操作区,如图4.5所示。
图4.5操作区
操作区是对演示区进行操作的必要手段,演示区的石子数目随着操作区的提供的命令去执行,不断的减少石子,直到石子为空时,游戏结束。
对应的取石子并实现动态移动石子的代码如下:
voidTFormMain:
:
TakeStones(TImage*image,inttotal_num,inttake_num)
{
if(take_num<=0||total_num<=0)return;
intcol,row;
intdis;
for(inti=0;i { col=(total_num-1)/5; row=total_num-col*5; col=5-col; image->Canvas->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(dis>0) { dis=dis/10; for(intk=0;k { image->Canvas->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--; } } 取石子时,判断选择的堆,是否还有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业设计 说明书 正文