基于VC的五子棋游戏软件的设计与开发毕业设计Word文件下载.docx
《基于VC的五子棋游戏软件的设计与开发毕业设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于VC的五子棋游戏软件的设计与开发毕业设计Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
本文以五子棋为入口,设计了一个五子棋人机对弈系统,以实现人和计算机的博弈,最终的目的是为了建立一个有具体规则的五子棋平台。
人机对弈程序的要点,至少应具备以下4个部分:
(1)状态表示:
某种在机器中表示棋局的方法,能够让程序知道博弈的状态。
(2)走法产生:
产生合法走法的规则,以使博弈公正地进行,并可判断对手是否乱走。
(3)搜索技术:
从所有合法的走法中选择最佳的走法技术。
(4)对弈界面。
本系统主要研究使用MicrosoftVisualC++以Windows窗体程序对五子棋游戏进行开发与设计,让大家了解用MicrosoftVisualC++开发WINDOWS小游戏的过程。
2开发工具和应用平台
2.1MicrosoftVisualC++的介绍
C语言是一种高效率的计算机程序设计语言,而VisualC++则是在它的基础上开发出的一套功能强大的程序设计工具。
对于游戏程序,VisualC++可以说是最佳的开发工具。
第一,VisualC++具有优异的运行速度。
第二,VisualC++可以直接访问内存。
VisualC++自诞生以来,一直是Windows环境下最主要的应用开发系统之一。
VisualC++不仅是C++语言的集成开发环境,而且与Win32紧密相连,所以,利用VisualC++开发系统可以完成各种各样的应用程序的开发,从底层软件直到上层直接面向用户的软件。
而且,VisualC++强大的调试功能也为大型复杂软件的开发提供了有效的排错手段。
VisualC++是一个很好的可视化编程工具,使用VisualC++环境来开发基于Windows的应用程序大大缩短了开发时间,而且它的界面更友好,便于程序员操作。
开发环境是程序员同VisualC++的交互界面,通过它程序员可以访问C++源代码编辑器、资源编辑器,使用内部调试器,还可以创建项目文件。
所谓API就是应用程序编程接口(ApplicationProgrammingInterface),WindowsAPI是Windows系统和Windows应用程序间的标准程序接口。
API为应用程序提供系统的各种特殊函数及数据结构定义,Windows应用程序可以利用上千个标准API函数调用系统功能。
在VisualC++中使用WindowsAPI是相当容易的,只要在项目中设定所要使用的函数库并引用正确的头文件,就可以使用WindowsAPI中的函数与数据类型。
根据WindowsAPI函数完成的功能,可将其分为三类。
(1)窗口管理函数:
实现窗口函数的创建、移动和修改功能。
(2)图形设备函数(GDI):
实现与设备无关的图形操作功能。
(3)系统服务函数:
实现与操作系统有关的多种功能。
用WindowsAPI函数来编写应用程序的顺序结构为:
调用WinMain函数开始执行→定义窗口类→初始化窗口类→窗口的实例化→通过消息循环获取消息并将消息发送给消息处理函数做出相应的操作。
2.2Windows编程的特点
所有的Windows程序都具有类似的结构和相同的“外观”,所以用户不用花很多的时间来学习新程序的用法。
具有这种一致的用户界面是使用Windows内部子模序来创建的。
所有的菜单、对话框、滚动条等都具有同样的键盘的鼠标接口,Windows自己处理这项工作,而不是交给应用程序完成。
Windows编程有以下几个特点:
(1)事件驱动的程序设计
(2)消息循环与输入
(3)图形输出
(4)用户界面对象
(5)资源共享
编写一个典型的Windows应用程序,一般需要:
(1)C,
CPP源程序文件
(2)H,HPP头文件
(3)资源文件
包含了应用程序所使用的全部资源定义,通常以
.RC
为后缀名。
资源是应用程序所能够使用的一类预定义工具中的一个对象,包括:
字符串资源、加速键表、对话框、菜单、位图、光标、工具条、图标、版本信息和用户自定义资源等。
Windows消息机制:
Windows是一个消息驱动的操作系统。
一个消息由一个消息名称(UINT类型)和两个参数(WPARAM,LPARAM)构成。
当用户进行了输入或者是窗口的状态发生改变时,系统会发送消息到某一个窗口。
例如,当鼠标左键单击之后会有WM_LBUTTONDOWN消息发送。
用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。
一个消息必须由一个窗口接收。
在窗口的消息处理函数中可以对消息进行分析,对自己感兴趣的消息进行处理。
如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。
为了应付那些没有被响应的消息,Windows为窗口编写了默认的窗口消息处理函数,窗口过程将负责处理那些程序中没有处理的消息。
正因为有了这个默认窗口过程,程序员才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。
提到消息就必须说到窗口句柄,系统通过窗口句柄在整个操作系统中唯一标识一个窗口。
发送消息时必须指定一个窗口句柄表明该消息由那个窗口接收。
而每个窗口都会有自己的窗口消息处理函数,用户的输入会被正确的处理。
在Windows操作系统中维护着一个或者多个消息队列,所有产生的消息都会被放入到队列中。
系统在队列中每次取出一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的消息循环。
每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。
窗口函数定义了应用程序对接收到的不同消息的响应,其中包括了应用程序对各种可能接收到的消息的处理过程,是消息处理分支控制语句的集合。
通常窗口函数由一个或多个switch语句组成。
每条case语句对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活并执行相应的响应程序模块。
窗口函数是应用程序处理接收到的消息的函数。
其中包含了应用程序对各种可能接收到的消息的处理过程。
在本系统中一共用到了WM_PAINT、WM_LBUTTONDOWN、WM_LBUTTONUP、WM_DESTROY四种消息:
LRESULTCALLBACKWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam)
switch(iMessage)
{
caseWM_PAINT:
…………
break;
caseWM_LBUTTONDOWN:
case、WM_LBUTTONUP:
caseWM_DESTROY:
…………
default:
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
WM_LBUTTONDOWN是在玩家在鼠标单击左键后产生的,这时通过GetCursorPos(&
pt)函数来判断鼠标是否处在落棋的合法点(包括按钮上),如果是合法的落棋点,就返回棋子状态数据等参数,这时WM_PAINT函数在收到这些消息后就开始按照得到的参数来重绘棋盘,用户在松开鼠标后又产生WM_LBUTTONUP消息,电脑在通过选择最佳落棋点之后,又返回给WM_PAINT,这样就产生了消息循环,直到接收到WM_QUIT消息才退出程序,PostQuitMessage函数的作用就是向应用程序发出WM_QUIT消息,请求退出。
DefWindowProc函数是系统默认的处理过程,以保证所有发送到该窗口的消息均得以处理。
3系统需求分析
3.1系统需求
五子棋作为一款休闲益智游戏,它最大的优点在于游戏规则家喻户晓,简单,上手快,趣味性强,所以受广大用户青睐,在各大提供棋牌类游戏的平台都可以看到玩五子棋游戏的人很多。
休闲益智游戏中等级并不是最重要的追求目标,通过对游戏规则的熟悉,能很快上手掌握其操作方式,也更适合男女老幼全家共同娱乐,花费时间简短,速战速决,在短时间内感受到游戏的乐趣,完全享受气氛轻松活跃的游戏过程。
此种娱乐方式既不耽误时间也能轻松调剂娱乐,充分适合现代人们的娱乐需求。
更主要的是开发了人的智力,成为年轻一代最流行的游戏,据统计,五子棋游戏的玩家中,学生占了接近三分之一的比例,对学生的智力健康成长起一定作用,正所谓休闲娱乐两不误。
3.2功能需求
要求系统界面简洁,操作方便,把五子棋游戏规则中最基本的规则体现出来,比如“和棋”、“重新开局”等。
五子棋还有一大特点就是速战速决,电脑应在很短时间内就应做出判断,并能提供一定的帮助,违反游戏规则的时候应立即指出。
在正规五子棋比赛中,都设置了“禁手”这一规则,但广大玩家之所以喜爱五子棋游戏,就是因为五子棋游戏规则简单,“禁手”这一规则很复杂,所以在本系统中,采用“无禁手”的规则,让规则简单化。
3.3系统运行环境
Win9X/WinME/WinNT/Win2000/WinXP/Win2003/
4五子棋算法分析
4.1五子棋的发展
五子棋是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为“连珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(FiveinaRow的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。
它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;
它的棋文化源渊流长,具有东方的神秘和西方的直观;
既有“场”的概念,亦有“点”的连接。
它是中西文化的交流点,是古今哲理的结晶。
五子棋起源于古代中国,发展于日本,风靡于欧洲。
对于它与围棋的关系有两种说法,一说早于围棋,早在“尧造围棋”之前,民间就已有五子棋游戏;
一说源于围棋,是围棋发展的一个分支。
在中国的文化里,倍受人们的青睐。
古代的五子棋的棋具与围棋相同,纵横各十七道。
五子棋大约随围棋一起在我国南北朝时先后传入朝鲜、日本等地。
据日本史料文献介绍,中国古代的五子棋是经由高丽(朝鲜),于1688年至1704年的日本元禄时代传到日本的。
到日本明治32年(公元1899年),经过公开征名,“连珠”这一名称才被正式确定下来,取意于“日月如合壁,五星如连珠”。
从此,连珠活动经过了不断的改良,主要是规则的变化(即对执黑棋一方的限制),例如,1899年规定,禁止黑白双方走“双三”;
1903年规定,只禁止黑方走“双三”;
1912年规定,黑方被迫走“双三”亦算输;
1916年规定,黑方不许走“长连”;
1918年规定,黑方不许走“四、三、三”;
1931年规定,黑方不许走“双四”,并规定将19×
19的围棋盘改为15×
15的连珠专用棋盘。
本世纪初五子棋传入欧洲并迅速风靡全欧。
通过一系列的变化,使五子棋这一简单的游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为一种国际比赛棋。
简单介绍一下文章中会遇到的一些关于五子棋最基本的术语
(1)先手:
进攻的着法,也指对弈双方执黑棋先在棋盘上落子的一方;
(2)四三:
指同时具备两个先手,其中一个四,另一个是活三;
(3)活三(包括连三和跳三):
①连三:
紧紧相连的同色三子②跳三:
中间间隔一子的活三
;
(4)四四:
一子落下同时形成两个“四”的棋形
(5)三三:
一子落下形成了两个活三的棋形;
(6)长连:
相同颜色的连续六子或六子以上;
(7)禁手:
对局中禁止使用的战术或被判为负的行棋手段;
(8)胜局:
对局的一方获胜,称为“胜局”。
包括:
①一方首先在棋盘的直线或横线或斜线上形成连续的五子或五子以上(特指白方)。
②对方表示认输。
③对方超过比赛规定的时限。
④当黑方禁手形成未能同时形成五连,白方立即指出禁手后,判定为白方胜局。
⑤对方迟到超过容许时间。
⑥对方严重犯规而被判负;
(9)和棋:
不分胜负的对局或双方同意平局。
4.2五子棋的规则
五子棋游戏的一个特点是先行的一方优势很大,因此在职业比赛中对黑方做了种种限制,以利公平竞争。
五子棋的比赛规则如下:
(1)黑棋先手、白棋后手,从天元开始相互顺序落子;
(2)最先在棋盘横向、纵向或斜向形成连续的同色五个棋子的一方为胜;
(3)黑棋禁手判负、白棋无禁手。
黑棋禁手有“三、三”、“四、四”和“长连”,包括“四、三、三”和“四、四、三”。
黑棋只能以“四、三”取胜;
(4)如分不出胜负,则到为平局;
(5)五连与禁手同时形成,判胜;
(6)黑方禁手形成时,白方应立即指出。
若白方未发现或发现后不立即指出,反而继续落子,则禁手失效,不再判黑方负。
五子棋是黑白双方或两个人之间的竞技活动,由于对黑白双方规则不同,黑棋必须先行。
一般采用猜先的方法来决定谁执黑先行,即双方各抓一种颜色的几枚棋子,大数减小数,单数双方交换,偶数不换;
黑方在落下关键的第五子即形成五连的同时,如又形成禁手,此时因黑方已经成五,而“五”在五子棋中是至高无上的,故禁手失效,黑方胜;
所谓黑方形成禁手,是指黑方落下一子同时形成两个或两个以上的活三、冲四及长连等。
此时白方应立即指出,自然而胜。
专业连珠五子棋虽然对黑棋采取了种种限制,但是黑棋先行的优势依然很大。
因此,在高段位的专业比赛中,又出现了三种特殊的规定:
(1)“指定打法”:
指比赛双方按照约定好的开局进行对弈。
例如“斜月局”、“长星局”等。
(2)“三手可交换”:
指黑棋下第二手棋〔盘面第三手棋〕之后,白方如感觉黑方棋形不利于己方,可提出交换,即执白棋一方变为执黑棋一方〔此方法不适用于指定开局打法,而用于随意开局〕。
采用此规定以后,黑棋就不会再使用诸如“浦月”、“花月”之类的必胜开局了。
(3)“五手两打”:
指黑棋在下盘面上关键的第五手棋时,必须下两步棋,让白方在这两步棋中任选一步,然后再继续下。
采用这一系列规定以后,黑棋先行就再无优势可言。
4.3具体算法分析
4.3.1棋盘局势状态表示
要让计算机学会下棋,首先就要把下棋问题表示成计算机可理解的形式,即把五子棋问题形式化,存在计算机中,并能让搜索算法对这些数据进行操作。
需要在计算机中表示的主要问题有棋盘局势状态及落子的顺序等。
棋盘表示主要探讨的是是什么数据结构来表示棋盘上的信息。
一般说来,这与具体的棋类知识密切相关。
通常,用来描述棋盘及其上棋子信息的是一个二维数组。
要让计算机知道棋盘局势状态,就是要它记住棋盘中哪个位置有黑子,哪个位置有白子以及哪个位置是空点。
因为五子棋的棋盘是15行,15列,因此可以将棋盘状态的描述用一个15×
15的二维数组表示。
本程序的数据将用如下所示的数据表示:
intp[15][15]=
{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
其中,
(1)棋盘状态数据由一个15×
(2)用数字“1”和“2”来表示不同的棋子,黑色棋子用“2”表示,白色棋子用“1”表示。
(3)没有棋子的格子用“0”表示。
4.3.2棋盘中下棋的顺序表示
棋局中下棋的顺序也很重要,应该是黑白双方交替下棋。
本程序用t来判断黑白又方下棋顺序,t为“0”时由红方下棋,t为“1”时由黑方下棋,由于五子棋规则中黑棋先手,所以初始值t=1,即玩家执黑先手。
每次落棋后,都应改变t的值,t在整个对弈过程中都只能为1或者为2,即在任意时刻,都有一方可以落棋,也只能有一方落棋。
4.3.3具体算法
电脑要选择有利于它的最佳下法,就要能判断哪种形势对它最有利。
但往往对一个形势的判断是很难做到准确的,特别是一盘棋刚开始的时候,棋盘的形势不明朗,即使是专家也不能做出准确的判断。
为了判断哪种下法最有利,我们往往需要向后面计算几步,看看在走了几步棋之后,局面的形势如何。
这被称为“多算胜”,也就是说,谁看得越深远,谁就可以获胜。
这种思维方式被用到了计算机上。
向后面计算的步数越多,系统开销就越大,本系统只向后计算一步,根据威胁的优先级来选择落棋的最佳点。
轮到电脑下棋时,电脑先向棋盘搜索合法的落棋点,即棋盘的空白点。
然后再利用下面的算法先择最佳落棋点。
在每个空白点,都有四个方向需要考虑,即—、|、﹨、∕四个方向。
以下就用○表示电脑所执的黑棋,用□表示玩家所执的白棋,用×
表示棋盘的空白点。
在设计的时候,尽可能把所有情况全面考虑,设置为搜索一个最佳落棋点位置的时候,需要保证左右展开后碰壁,之间的空间距离至少要有六格(而不是五子),否则就是死子。
算法流程是:
顺序向下搜索,每次有符合要求的点时,视为最佳落棋点,并在该点落棋,同时将t赋值为1,退出搜索并判断是否有一方获胜,然后等待玩家落棋,再重复这一过程,直到有一方获胜。
图1算法流程图
一,电脑搜索棋盘里红棋是否有一步获胜的棋,即在同一条线路上有连续五个位置上,有四颗为红棋,另外一颗为空,这时就不用考虑玩家的棋局,直接就可以获胜。
能直接获胜的棋型有×
○○○○×
、□○○○○×
,还包括通过四三来形成的活四,包括有○○×
○○、○○○×
○、○×
○○○。
二,电脑搜索棋盘里黑棋是否有一步获胜的棋,这时就应该让玩家的“活四”变“死四”,这是红棋威胁级别最高的,应立即做出反应。
有直接威胁的棋型有□×
□□□、×
□□□□×
、□□□×
□、×
。
对于×
这种棋型,其实玩家已经获胜。
三,电脑搜索棋盘里红棋是否有可形成活四的棋型,进一步冲四,这时就应该主动进攻,这种棋型包括×
○○○×
×
、×
○○×
○×
这样的棋只需两步方可获胜,威胁级别仅次于上面两种。
四,电脑搜索棋盘里黑棋是否有可形成活四的棋型,若有,就有阻止冲四,让玩家的“活三”变死三,这时就体现了电脑的防守策略,这种棋型包括:
□□□×
□×
□□×
其中×
在封堵后还具有威胁性,所以在电脑没有进攻机会时,也应该考虑这样的棋型的威胁性,因为可以利用这种棋型来造四三来获胜。
五,电脑搜索棋盘里红棋是否有可形成活三的棋型,这是获胜的过渡棋,在整个棋局中非常重要,这样的棋型越多,红棋造活三的机会就越多,是获胜的关键。
这种棋型包括:
,由于需要三步获胜,所以优先级比较低。
表1是获胜情况分析表,优先级是按所需步数和落棋的顺序来决定的,在获胜所需步数相同的情况下,电脑所执的红棋优先级高于黑棋。
表1获胜情况分析表
棋盘上的情况:
获胜所需步数
优先级
电脑已有任意组活四或已有任意组死四
一
1
玩家已有任意组活四或已有任意组死四
2
电脑已有任意组活三或已有多于一组的死三
二
3
玩家已有一组死三和任意组的活二
三
4
玩家已有任意组活三或已有多于一组的死三
5
6
5系统流程
五子棋的规则如下:
(1)棋盘:
采用15×
15的棋