APP下载

基于.NET的五子棋游戏的设计与实现

2015-12-15沈桂芳王海云

巢湖学院学报 2015年6期
关键词:五子棋棋盘棋子

沈桂芳 王海云

(安徽新华学院信息工程学院,安徽 合肥 230088)

基于.NET的五子棋游戏的设计与实现

沈桂芳 王海云

(安徽新华学院信息工程学院,安徽 合肥 230088)

基于对五子棋游戏规则的分析,设计了该游戏的算法,并选择Visual Studio 2008作为该软件的开发平台,实现了五子棋的多种对战模式,既可人与人对战,也可人与电脑对战,更增加了多人对战,多人机对战功能。还实现了无限步悔棋,自定义棋盘行列数,自动保存残局的功能。经测试,本游戏系统功能齐全,能平稳运行,具有较强的使用价值。

五子棋;思考算法;多人对战;人机对战

1 引言

五子棋游戏不仅能增强思维能力,提高记忆力,而且富含哲理,有助于修身养性。既有“场”的概念,亦有“点”的连接;是中西文化的交流点,是古今哲理的结晶。

.NET[1]框架是一个多语言组建开发和执行环境,它提供了一个跨语言的统一编程环境。从层次结构来看,.NET框架包括三个主要组成部分:(1)公共语言运行时(CLR:Common Language Runtime)、(2)服务框架(Services Framework)和上层的两类应用模板——传统的Windows应用程序模板(Win Forms)和基于ASP.NET[1]的面向Web的网络应用程序模板 (Web Forms和Web Services)[2]。

因此,基于.NET平台开发一款五子棋游戏[3]软件非常有实用价值。

2 基于.NET的五子棋游戏的设计

本游戏程序功能分为游戏模块和设置模块两部分。其中,游戏模块分为棋盘栏和控制栏两个模块。棋盘栏主要实现绘制棋盘、棋子和标记;控制栏的功能如图1所示的功能。

其中,设置模块的具体功能如图2所示。

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

棋盘栏的实现通过图像绘制实现,相对较为简单。而控制栏,用于实现对游戏流程的控制、棋盘信息的显示。控制栏是本项目的关键、也是最有难度的实现环节。

在实现控制栏的功能之前,首先需要实现棋盘信息的表示和存储。

定义了一个棋盘类型如下所示。

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

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

3.2.1 棋型的定义

对于棋盘中的各处坐标,在落下一些棋子之后,会由于所处的位置不同,在各个位置再落下棋子会达到不同的棋型。对于棋型的定义,大体上有三类:活棋、冲棋、死棋。

活棋,是指同时拥有两个或两个以上落棋位置的棋型,且这两个落棋位置都要求可以达到更大棋型,在被堵住一个之后仍有一个更大棋型位置。如下图3所示;冲棋,仅有一个更大落棋位置,在被其他玩家堵住后,成为死棋。如下图4所示。

死棋,即使落棋也无法达到五子相连的棋型。如下图5所示;其实,上述棋型的定义还并不完全精确,还需要对其进行补充定义,如下图6所示的棋型:

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

于是,对于棋型的补充定义是:在棋型周边的某个位置落入棋子后下一步可达到的最大棋型类型,为当前棋型的类型。如上面的棋型,在落入棋子后可达到冲4,故当前的棋型为冲3。

如图7所示的棋型:对于这样的棋型,当在中间位置放入红棋后可成为活棋,故为活3,而当在两边放入红棋是为冲棋,故为冲3。那么到底算哪一种棋型呢?这样的补充定义是否自相矛盾呢?

以最大的棋型为准,为活3;这样的定义也并不矛盾,当在中间的位置放入棋子它为活4,故该位置在未放入棋子时,为活3位置。而两边的位置若放入棋子为冲4,未放入棋子时为冲3位置。

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

3.2.2 棋型的表示、存储和更新

定义棋型是为了能够根据棋型,进行更优落棋位置的判定。表示的棋型,更优棋型应当有更大的权值。

对于更优棋型有:相同棋子数时,活棋>冲棋>死棋。相同棋型时,棋子多的棋型更优。具体有,五子>活4>冲4>活3>冲3>活2>冲2>活1>冲1>死棋。

以棋型的棋子数为十位,以0、1、2分别代表死棋、冲棋、活棋作为个位,构成代表各种棋型的权值50>42>41>32>31>22>21>12>11>0(死棋时棋子数视作0)。这样就可以实现各种棋型的表示了。

对于棋型的存储,从棋子周边的空位置开始,判断该空位置周边,五颗棋子范围以内,各玩家的最大棋型,分别存储到玩家对应棋型数组style[,,]中。而对于已经落入棋子的位置,不再判断它周边的棋型。

此时,若在该棋子左边的空位置处落入棋子可达到活4,故该空位置为活3点。若在该棋子右侧落入棋子可达冲4,故该空位置为冲3点。于是在红棋对应的棋型数组中,对应于这两个空位置的棋型位置,分别存入代表棋型的权值32和31。对于该棋子周边的其它空位置,也进行同样的判断和棋型存储。

由棋型的存储知道,是从棋子周边的空位置处开始进行棋型判断、并存储到各玩家对应的棋型数组中的,并且5颗棋子范围以外的空位置,棋型不受影响。基于这些,只需在落下新的棋子时,更新该棋子周边空位置的棋型即可。具体的更新的算法实现,这里不做详细描述,参见棋盘类中棋型更新函数refreshStyle()。

棋型的一般识别过程如下图8所示。

若在1处落入棋子,可达到冲4,则1处为冲3位置;同样的2处为活。

对于任意一个未下棋子的空位置,都有8个方向,定义从0度到315度,间隔为45度,共8个方向分别为方向1、2……8。

则需从1和5、2和6、3和7、4和8这四组方向分别判断玩家的最大棋型,该棋型即为玩家在该位置的最大棋型。

对于棋子在棋盘中的前台绘制过程,定义了putChess()函数的来实现,在绘制棋子之前,先行判断该位置是否已经落有棋子,如果已经有棋子,则不再落棋。否则落入棋子,棋盘绘制棋子,后台存储棋子。后台棋子的存储和棋型刷新是由棋盘类型中的put()实现的。另外,还需判断该位置是否存在5子连珠。若已构成5子,则提示胜出,退出游戏、重玩或悔棋。

对于游戏胜负的判定,当有一方获胜时,最后一颗棋子的落棋处,必然存在5子相连的棋型。只需在各棋子落下时,以该棋子为中心位置,判断该棋子五子相邻的位置是否存在五子相连即可。若某次落棋后存在则该方获胜。

在棋型不同时有,五子>活4>冲4>活3>冲3>活2>冲2>活1>冲1>死棋;在棋型相同时,己方棋型的优先级大于其他玩家的棋型。本项目获取更优落棋位置,大体上是从最大棋型向最小棋型,依次进行判断。判优流程如下图9所示。

首先,从棋盘中所有棋型位置中,获取各玩家的最大棋型。如果当前玩家或者其他玩家的最大棋型大于活3,则直接返回该最大棋型空位置。因为,如果当前玩家棋型大于活3,则为冲4或活4,再落入一颗棋子后可以成棋。若是其他玩家棋型大于活3,则当前玩家应将其堵住,否则其他玩家则会成棋。

其次,如果当前玩家的棋型达到活3,则返回该棋型位置,若是其他玩家的棋型达到活3,则先判断当前玩家是否存在某条大于活3的成棋路径,如果存在则返回该成棋路径的第一颗落子位置。若不存在,则需堵住其他玩家的活3棋型,在堵棋时也存在更优堵棋位置的判定。

然后,是冲3棋型的判断。如果当前玩家达到冲3,则先判断当前玩家是否存在大于活3的成棋路径,如果存在则返回该位置。如果是其他玩家达到冲3,则要先判断该玩家是否有大于活3的成棋路径,如果有,那么当前玩家需在该位置堵棋。否则,继续向下判断。

接着,继续对活2棋型进行判断。在达到活2棋型时,先判断是否存在某条活3成棋路径。若存在,则返回该路径的第一个落棋点,若不存在,则进行小一阶活棋位置的判定。

最后,在己方所有相同棋型的落棋位置中,选择更优的落棋位置。对于己方相同棋型位置,根据各位置玩家棋型的排序数进行更优落棋位置判断,取最大排序数位置。

4 结论

本项目基于.NET开发平台,在棋形识别和判优算法上提出创新算法并实现,各个功能模块经测试运行平稳。实现界面如图10所示。游戏的智能算法仍然有待改进的地方,将在今后进一步优化改进。

[1]夏敏捷.Visual Basic.NET程序设计教程[M].北京:清华大学出版社,2014∶28-296.

[2]夏敏捷.Visual C#.NET原理与实务[M].北京:中国电力出版社,2010∶10-315.

[3]坂田吾朗.五子棋弈理例解[M].孙涤非,刘德新,译.北京:北京体育大学出版社,2002∶25-265.

[4]那威,殷立成.五子棋布局技巧[M].北京:金盾出版社,2011∶45-288.

THE DESIGN AND IMPLEMENTATION OF NET-BASED GOBANG GAMES

SHEN Gui-fang WANG Hai-yun
(School of Information Engineering,Anhui XinHua University,Hefei Anhui 230088)

This paper designs algorithms of gobang based on the analysis of rules of the game.And Visual Studio 2008 is selected as the development platform of the software to achieve various battle modes of gobang,including man-man games and mancomputer games.What is more,functions like multiplayer and many man-machines against mode are added.Also,unlimited undo steps,customizing the number of row and column,and auto-saving of the mess are realized.After testing,the game system is fully functional,and operates smoothly with a strong use value.

gobang;thinking algorithm;multiplayer games;man-machine mode

TP311.1

A

1672-2868(2015)06-0033-06

责任编辑:陈 侃

2015-10-12

国家大学生创新项目(项目编号:201412216024)

沈桂芳(1979-),女,安徽贵池人。安徽新华学院信息工程学院,讲师。研究方向:软件工程、智能计算。

猜你喜欢

五子棋棋盘棋子
棋子多少颗
摆棋子
有趣的棋子
Sim Sim
90后罗运生:五子棋是我生命的一部分
棋盘人生
财政部长吴波的“五子棋局”
棋盘里的天文数字
棋盘疑案
夏日五子棋