五子棋 单机版Word文件下载.docx

上传人:b****5 文档编号:16772526 上传时间:2022-11-26 格式:DOCX 页数:94 大小:2MB
下载 相关 举报
五子棋 单机版Word文件下载.docx_第1页
第1页 / 共94页
五子棋 单机版Word文件下载.docx_第2页
第2页 / 共94页
五子棋 单机版Word文件下载.docx_第3页
第3页 / 共94页
五子棋 单机版Word文件下载.docx_第4页
第4页 / 共94页
五子棋 单机版Word文件下载.docx_第5页
第5页 / 共94页
点击查看更多>>
下载资源
资源描述

五子棋 单机版Word文件下载.docx

《五子棋 单机版Word文件下载.docx》由会员分享,可在线阅读,更多相关《五子棋 单机版Word文件下载.docx(94页珍藏版)》请在冰豆网上搜索。

五子棋 单机版Word文件下载.docx

五子棋;

思考算法;

多人对战;

人机对战;

DesignandImplementation.NET-basedbackgammongame

Abstract

Backgammongamecannotonlyenhancethinkingskills,improvememory,andrichinphilosophy,tohelpself-cultivation.Boththeconceptof"

field"

thereare"

point"

connections,isthecrystallizationofancientandmodernphilosophy.Therefore,thedevelopmentofasimpleandpracticalstand-aloneversionofbackgammonsoftwaremakessense.

Thispaperanalyzesthebackgammongamerulesofthegame,thegamedesignalgorithms,andselectVisualStudio2008asthesoftwaredevelopmentplatformtoachieveavarietyofBattleModebackgammon,eitheragainstpeople,butalsopleasantandplayagainstthecomputer,addsmultiplayer,multiplayerwarmachinefunctions.Alsoimplementsunlimitedundosteps,customchessboardranksnumber,auto-savefunctionofthemess.

Thispaperwillinstallthedevelopmentenvironment,tobackgammonfunctionalanalysisanddesign,toachievethefunctionalmodules,toshowyoustepbystepimplementationprocessbackgammon.Aftertesting,thegamesystemfullyfunctional,smoothoperation,withastrongvalue.

KeyWords:

Backgammon;

thinkingalgorithm;

multiplayer;

man-machinewar;

目录

1绪论1

1.1起源与发展1

1.2研究目的和意义1

2.NET平台简介与开发环境安装2

2.1平台简介2

2.2开发环境安装2

3.NET的五子棋游戏的设计4

3.1游戏模块4

3.1.1棋盘栏4

3.1.2控制栏4

3.2设置模块5

3.2.1界面设置5

3.2.2游戏记录恢复6

3.2.3帮助页7

4.NET的五子棋游戏的功能实现8

4.1棋盘栏的实现8

4.1.1棋盘的绘制8

4.1.2棋子的绘制9

4.1.2.1棋盘坐标的获取9

4.1.2.2棋盘坐标处绘制棋子9

4.1.3棋子标记的绘制与擦除10

4.1.4棋子的擦除10

4.1.2.1用背景擦除棋子10

4.1.2.2棋盘线的补充绘制10

4.2控制栏控制功能的实现11

4.2.1棋盘信息的表示与存储12

4.2.2棋型的定义、表示、存储、刷新12

4.2.2.1棋型的定义13

4.2.2.2棋型的表示14

4.2.2.3棋型的存储14

4.2.2.4棋型的更新15

4.2.3棋型的识别15

4.2.3.1己方有效坐标17

4.2.3.2己方最大棋子数17

4.2.3.3连续棋子数18

4.2.4棋子的前台显示与后台存储流程18

4.2.5悔棋19

4.2.6让子20

4.2.7托管21

4.2.8对战21

4.2.9重玩21

4.2.10设置按钮功能的实现21

4.3后台棋盘数据分析22

4.3.1游戏胜负的判定22

4.3.2更优落棋位置的获取22

4.3.2.1基本判优思想23

4.3.2.2活3思考思想24

4.3.2.3冲4延续思想25

4.3.2.4双活棋位置思想26

4.3.2.5变式双活棋位置思想27

4.3.2.6两组双活棋位置思想27

4.3.2.7更优堵棋位置思想28

4.3.2.8排序数择优思想29

4.4设置栏功能的实现30

4.4.1界面设置的实现30

4.4.2棋盘信息记录功能的实现31

4.4.3帮助的实现31

5.测试32

致谢36

参考文献37

附录38

代码1——五子棋单机版窗体Form138

代码2——五子棋单机版QiPan48

代码3——五子棋单机版C_Num64

代码4——五子棋单机版SiteQueue65

1绪论

1.1起源与发展

相传中华民族的祖先轩辕黄帝无意之中画下了十七条横线十条竖线,这无意中的发明造就出了五子棋。

早在公元595年古人就烧制瓷质五子棋盘了。

千百年来,人们用各种材质来制造围棋的棋子,如:

玻璃、瓷器、玉、玛瑙、铜等等。

古代五子棋棋盘与围棋棋盘是通用的,汉魏时为十七路(17×

17)棋盘,至南北朝时即已流行十九路(19×

19)棋盘,直至1931年,才出现所谓五子棋专用棋盘。

据日本史料文献记载,中国古代的五子棋先由中国传到高丽(今朝鲜),然后于公元1688年至1704年日本的元禄时代再从高丽传到日本,最初在皇宫和贵族大家庭中流行,到元禄末期,开始在民间盛行。

1899年,对传统五子棋进行规则改良后,经过公开征名,“联珠”这一名称才被正式确定下来。

取意于《汉书·

律历志上》中“日月如合璧,五星如联珠”一句,现写做“连珠”。

20世纪初传统五子棋及连珠从日本传入欧洲,五子棋英译为“FiveInARow”(缩写为FIR)。

1958年以及1979年,瑞典和前苏联分别成立了连珠联盟。

1988年,日本、前苏联以及瑞典三个国家的连珠组织在瑞典成立国际连珠联盟(RenjuInternationalFederation,简称RIF)

1.2研究目的和意义

既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;

五子棋游戏的文化源渊流长,具有东方的神秘和西方的直观,既有“场”的概念,亦有“点”的连接;

是中西文化的交流点,是古今哲理的结晶。

五子棋游戏不但容易上手,而且它区别于别的游戏,它不但能使人娱乐,而且能使人的头脑变得更加聪明。

2.NET平台简介与开发环境安装

2.1平台简介

.NET[18]的目的是通过基于web服务器提供的分布式服务平台,可以实现在不用考虑使用何种操作系统、设备或编程语言的情况下,能够在任何地点,把所有信息、设备、系统和人有机的联系起来,让人们可以随时随地的进行通信和信息交互。

.NET框架是一个多语言组建开发和执行环境,它提供了一个跨语言的统一编程环境[3]。

.NET框架的目的是便于开发人员更容易地建立Web应用程序和Web服务,使得Internet上的各应用程序之间,可以使用Web服务进行沟通。

从层次结构来看,.NET框架又包括三个主要组成部分:

(1)公共语言运行时(CLR:

CommonLanguageRuntime)、

(2)服务框架(ServicesFramework)和上层的两类应用模板——传统的Windows应用程序模板(WinForms)和基于ASP.NET[1]的面向Web的网络应用程序模板[13][14](WebForms和WebServices)。

2.2开发环境安装

首先,在网上下载VisualStudio2008软件[5],然后点击安装VisualStudio2008,如图2.1所示。

图2.1安装

然后,等待安装组件加载完成,如图2.2所示。

图2.2加载等待

接着,单击下一步,接受条款,如图2.3所示。

图2.3接受条款

选择默认值,点击安装,等待完成,如图2.4所示。

图2.4默认安装

最后,在安装完成后,首次启动时,选择C#作为默认开发环境即可。

3.NET的五子棋游戏的设计

本项目中五子棋主要包含两大主要模块[6],如下图3.1所示。

第一个模块为主要模块,用于实现五子棋的游戏功能。

第二个模块为辅助模块,用于实现五子棋的相关辅助设置。

图3.1主要模块

3.1游戏模块

该模块实现游戏的主要功能,共包含两个小模块,如下图3.2所示。

第一个模块为棋盘栏,实现游戏玩家点击下棋的功能。

第二个小模块为控制栏,对下棋的过程进行功能控制。

图3.2游戏模块

3.1.1棋盘栏

实现棋盘的绘制[7],和玩家棋子的绘制,并在最后一颗棋子上绘制标记。

初始时,根据给定的行列数绘制棋盘,玩家单击棋盘时,在单机对应的棋盘位置绘制棋子。

图3.3游戏模块图3.4棋盘栏效果图

3.1.2控制栏

控制栏,主要实现游戏过程中的各种控制功能、棋盘信息显示功能,如图3.5所示。

控制功能有悔棋、让子、托管、对战、重玩、设置。

棋盘信息显示功能有提示下一位玩家、显示鼠标处对应的棋盘坐标、显示鼠标处玩家最大棋型、显示棋盘中各玩家的最大棋型、其他信息。

图3.5控制栏模块图3.6控制栏效果

3.2设置模块

设置模块设置三个子页面,如图3.7所示。

界面,进行棋盘界面信息的设置。

记录,记录以前的游戏信息与恢复。

帮助,软件的帮助信息。

图3.7设置模块

3.2.1界面设置

界面设置主要实现棋盘界面显示样式的设置,如图3.8所示,具体有棋盘的行、列数、棋盘颜色、棋盘背景、棋盘格大小、玩家数目、游戏等级、音效、隐藏边框、侧边栏。

图3.8界面设置

图3.9界面设置效果图

3.2.2游戏记录恢复

该栏目就是实现对先前的棋局的恢复功能,该栏有一个日历控件,游戏玩家通过选择曾经的游戏日期查看曾经的游戏记录,双击对应的游戏记录[15][16][19],恢复上次退出时的棋局,记录界面效果如图3.10所示。

图3.10棋型记录界面

3.2.3帮助页

该栏目为玩家提供一些游戏帮助,展示该软件的一些其他信息,如图3.11所示。

图3.11帮助页

4.NET的五子棋游戏的功能实现

4.1棋盘栏的实现

棋盘栏,实现的功能是对棋盘的绘制,点击棋盘后棋子的绘制,以及最后一颗棋子上标记的绘制,如图4.1所示。

图4.1棋盘栏

4.1.1棋盘的绘制

对于棋盘的绘制,我们可以在窗体中放入一个PictureBox控件,在该控件上创建一个System.Drawing中的Graphics对象,使用Graphics对象的DrawRectangle()绘制棋盘外边框、使用DrawLine()实现其它棋盘线的绘制。

语法如下图4.2所示:

图4.2棋盘绘制

具体的棋盘绘制的算法,在本项目中是由drawQipan()这个函数来实现的。

效果如下图4.3所示,背景图像可从PictureBox控件的属性中进行添加。

图4.3棋盘

4.1.2棋子的绘制

对于棋子的绘制,使用的是Graphics对象的DrawImage()函数来实现。

语法如下图4.4所示:

图4.4棋子绘制

下棋时,我们使用鼠标单击棋盘,要求绘制的棋子在对应的棋盘格交点处。

对于这个过程我们可分两步来加以实现。

第一步获取棋盘坐标,第二步绘制棋子。

4.1.2.1棋盘坐标的获取

棋盘是我们按照一定的方格大小进行绘制的,那么当我们在棋盘上单击鼠标时,对于每一个单击位置,都有一个唯一对应棋盘坐标。

它们之间存在如下的转化关系,我们从PictureBox控件被鼠标单击的事件中获得鼠标的像素位置并转化为棋盘坐标。

图4.5获取棋盘坐标

4.1.2.2棋盘坐标处绘制棋子

为了能够在指定棋盘坐标处进行棋子绘制,我们需从棋盘坐标计算出棋子图像的绘制起点,使得棋子中心正好为棋盘线的交点。

然后从该点开始绘制棋子即可。

实现算法如下图4.6所示:

图4.6坐标处棋子绘制

在本项目中,为了方便对所有玩家的棋子进行绘制,定义了一个Image[]数组image存储各玩家的棋子图像,并自定义drawpic()函数实现棋子的绘制。

4.1.3棋子标记的绘制与擦除

棋子标记的功能就是标记最后一次所下的棋子,方便当前玩家查看前一个玩家的落棋位置。

棋子标记的绘制过程与棋子的绘制完全相同,我们只需要再制作一个,大小和棋子相同、包含标记的背景透明的图像,然后绘制到最后一颗棋子的坐标处即可。

当我们再次落下新的棋子时,对于前一颗棋子上的标记我们需要将之擦除。

那么我们如何将之擦除呢?

我们只需重新绘制前一颗棋子即可。

4.1.4棋子的擦除

在游戏过程中,由于种种原因,我们经常会使用到悔棋功能,而悔棋在前台用户界面的表现形式则为棋子的擦除。

棋子的擦除过程与标记的擦除相类似,也是对棋子所在位置的棋子大小的区域进行重新绘制。

不同的是,棋子在擦除时,重新绘制所使用的图像不是棋子,而是该棋子所在区域的背景图像。

另外,还需重新绘制该棋子所在区域的棋盘线。

4.1.2.1用背景擦除棋子

在用背景擦除棋子时,我们使用Graphics对象DrawImage()函数的另一种重载形式来实现。

使用背景图像中棋子所对应的背景区域,来重画要擦除的棋子所在的棋盘区域。

具体的算法实现如下:

图4.7棋子擦除

4.1.2.2棋盘线的补充绘制

因为棋盘是使用Graphics对象[10]绘制出来的,在使用背景图像擦除棋子后,棋子是被擦除了,但却会出现一些其它问题,如下图所示:

图4.8棋子擦除前图4.9棋子擦除后

棋子成功擦除了,但该棋子区域的棋盘线却需要重新绘制。

对于棋盘线的补充绘制,在不同的坐标处会有不同的绘制需要。

具体要求有:

在棋盘边界处,我们要求绘制的棋盘线宽度为2。

而内部的棋盘线,我们要求绘制的棋盘线宽度为1。

另外,在棋盘边界处补充绘制棋盘线时,要求垂直于边界方向的棋盘线绘制宽度为棋子图片宽度的一半,并且绘制方向是从棋盘边界向棋盘内进行绘制。

对于棋盘内部的棋盘线绘制宽度则为棋子的宽度。

基于以上的要求,我们定义一个函数来实现指定棋盘坐标处,棋盘线的补充绘制,具体算法如下图4.10所示:

图4.10棋盘线的补充绘制

4.2控制栏控制功能的实现

控制栏,用于实现对游戏流程的控制、棋盘信息的显示。

控制栏是本项目的关键、也是最有难度的实现环节,界面效果如下图4.12所示。

4.2.1棋盘信息的表示与存储

在实现控制栏的功能之前,我们首先需要实现的就是对棋盘信息的表示和存储,这是实现其他各项功能的基础。

那么对于五子棋的棋盘它可以包含那些信息呢?

首先,棋盘有它特定的行、列数。

其次,还有下棋玩家的数目,通常为两人,但也存在多人的情况。

再有,就是各玩家所下的棋子以及棋子对应的棋盘坐标。

在记录坐标的过程中,我们还可以统计各个玩家的棋子和所有玩家棋子数。

最后,是棋盘的一个非常重要的信息,随着我们在棋盘中不断的落下棋子,各个棋盘位置的棋型也在不断的变化,我们需要根据棋型信息来选择下一步的落棋位置。

于是,我们定义了一个棋盘类型[2][4]如下图4.11所示:

图4.11棋盘类型图4.12控制栏

我们使用X[num]和Y[num]记录第num颗棋子在棋盘中的落棋位置,用player[X[num],Y[num]]标记该棋子为哪个玩家所下,用style[num,,]存储第num位玩家在棋盘中所有位置的棋型信息。

4.2.2棋型的定义、表示、存储、刷新

定义好棋盘的信息之后,我们需要对棋盘各处的棋子信息进行整理、分析,以便提取出有用的棋型信息,为我们提供指引,做出有效的落棋决断。

那么棋盘中的棋型信息该如何定义,又要如何才能识别它们呢?

4.2.2.1棋型的定义

对于棋盘中的各处坐标,在落下一些棋子之后,会由于所处的位置不同,在各个位置再落下棋子会达到不同的棋型。

对于棋型的定义,大体上有三类:

活棋、冲棋、死棋。

那么它们之间有什么区别呢?

在我查看的一些相关资料中,是这样定义它们的:

活棋,是指同时拥有两个或两个以上落棋位置的棋型,且这两个落棋位置都要求可以达到更大棋型,在被堵住一个之后仍有一个更大棋型位置。

如下图4.13所示:

图4.13活3

冲棋,仅有一个更大落棋位置,在被其他玩家堵住后,成为死棋。

如下图4.14所示:

图4.14冲3

死棋,即使落棋也无法达到五子相连的棋型。

如下图4.15所示:

图4.15死3

其实,上述棋型的定义还并不完全精确,我们还需要对其进行补充定义,如下图4.16所示的棋型:

图4.16棋型1

对于这样的棋型,我们看到它们中间有两个更大棋型落棋位置,但它却并不属于活棋,因为当我们在一处位置放入棋子,其他玩家可在剩下的另一处放入棋子,而此时红方的棋型为冲3并没有增大,故对于这样的棋型,将之定义为冲棋,更为合适。

于是,我们对于棋型的补充定义是:

在棋型周边的某个位置落入棋子后下一步可达到的最大棋型类型,为当前棋型的类型。

如上面的棋型,在落入棋子后可达到冲4,故当前的棋型为冲3。

又如,下图4.17所示的棋型:

图4.17棋型2

对于这样的棋型,当我们在中间位置放入红棋后可成为活棋,故为活3,而当我们在两边放入红棋是为冲棋,故为冲3。

那么到底算哪一种棋型呢?

这样的补充定义是否自相矛盾呢?

我们以最大的棋型为准,为活3;

这样的定义也并不矛盾,当我们在中间的位置放入棋子它为活4,故该位置在未放入棋子时,为活3位置。

而两边的位置若放入棋子为冲4,未放入棋子时为冲3位置。

同理,对于1、2、4颗棋子时也分别都有活、冲、死三种棋型[9]

4.2.2.2棋型的表示

有了棋型的定义,那么棋型应当如何表示呢?

我们定义棋型是为了能够根据棋型,进行更优落棋位置的判定。

那么我们表示的棋型,更优棋型应当有更大的权值。

对于更优棋型我们有:

相同棋子数时,活棋>

冲棋>

死棋。

相同棋型时,棋子多的棋型更优。

具体有,五子>

活4>

冲4>

活3>

冲3>

活2>

冲2>

活1>

冲1>

于是,我们以棋型的棋子数为十位,以0、1、2分别代表死棋、冲棋、活棋作为个位,构成代表各种棋型的权值50>

42>

41>

32>

31>

22>

21>

12>

11>

0(死棋时棋子数视作0)。

这样就可以实现各种棋型的表示了。

4.2.2.3棋型的存储

在我们能够使用特定的权值,表示对应的棋型之后。

我们如何在后台的棋盘中存储棋型呢?

对于棋型的存储,一种很容易想到的方式,就是图的遍历,从各个棋子处开始,进行图的遍历,判断该棋子周边最大棋型,存储到棋子对应的棋型数组style[,,]中。

然而,图的遍历算法较为复杂,执行效率也会随着棋盘中棋子数目的增多,而不断下降。

故,这种较容易想到的方式,并不是一种较为理想的解决方式。

我们转变一下思维,从棋子周边的空位置开始,判断该空位置周边,五颗棋子范围以内,各玩家的最大棋型,分别存储到玩家对应棋型数组style[,,]中。

而对于已经落入棋子的位置,我们不再判断它周边的棋型。

如下图4.18所示的棋型:

图4.18棋型2

此时,我们若在该棋子左边的空位置处落入棋子可达到活4,故该空位置为活3点。

若在该棋子右侧落入棋子可达冲4,故该空位置为冲3点。

于是我们在红棋对应的棋型数组中,对应于这两个空位置的棋型位置,分别存入代表棋型的权值32和31。

对于该棋子周边的其它空位置,也进行同样的判断和棋型存储。

从棋子周边的空位置,进行最大棋型的判断存储有几个优势。

首先,我们可以动态的刷新棋型数组中的值,而不必遍历整张棋盘。

因为当我们落棋时,落下的棋子改变的仅仅是该位置周边,5颗棋子范围以内的棋型,更远距离的棋型不会受到影响,故不需要对它们进行更新。

其次,我们更新棋型的操作,是分散到每一步落棋的执行过程之中的,而一颗棋子周边5颗棋子范围内的空位置有限。

故执行效率并不会随着棋子数的增多而下降。

相反,随着棋子数增多,某个空位置落入棋子后,其周边的空位置减少,进行棋型判断的次数减少,效率还可能提升。

4.2.2.4棋型的更新

由棋型的存储我们知道,我们是从棋子周边的空位置处开始进行棋型判断、并存储到各玩家对应的棋型数组中的,并且5颗棋子范围以外的空位置,棋型不受影响。

基于这些,我们只需在落下新的棋子时,更新该棋子周边空位置的棋型即可。

具体的更新的算法实现,这里不做详细描述,参见棋盘类中棋型更新函数refreshStyle()。

4.2.3棋型的识别

棋型的识别,是实现人机对战的基础,也是棋型信息提示的实现基础。

那么如何实现棋型的识别,将棋盘中的棋型转化为棋型对应的权值表示形式呢?

我们先看一个示例,如下图4.19所示:

图4.19棋型

3位置,3处为冲3位置,4处为冲2位置。

在方向1和其反方向5,我们可以摸索出棋型的一般识别过程如下图4.20所示。

图4.20棋型识别

若我们在1处落入棋子,可达到冲4,则1处为冲3位置;

同样的2处为活

对于任意一个未下棋子的空位置,都有8个

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

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1