连的魅力(2)──经典游戏《五子棋》编程指南

软件世界

  前言:在第41期《电脑报》的编程魔方版曾为大家介绍了热门小游戏《连连看》的制作,其实通过纵横相连来展现连的魅力的游戏又何止《连连看》一款。如果说《连连看》是热门的,那么相信《五子棋》则是连的魅力的经典之作了。在本文里,我们将继续通过为大家讲解游戏制作的思路来介绍《五子棋》的制作。

  一、游戏的玩法

  记得上中学的时候,课间那短短的10分钟,常能看到一伙男生窝在一张桌子前,一支笔,一张纸,就摆开战场,几个人轮流对杀五子棋。

  五子棋可以说是老少皆宜的游戏。不过现在要找个棋盘确实麻烦,那么是否有兴趣在电脑上做个两人对下的五子棋游戏,让电脑来做我们的裁判。既然要电脑做裁判,那么在动手前先要来了解电脑如何判断哪方获胜。

  游戏规则

  五子棋的最基本的规则就是: 黑白两方轮流在棋盘上布子,如果哪方的棋子在横竖斜方向能首先连续排列达到5个,就能获得胜利。而由于执黑子的一方通常先布第一个子,有先手的优势,因此在稍微专业点的五子棋较量中会加入一个双三禁手规则。即:执黑子的一方不能同时双活三(如图黑子的情况)。

  编程前的准备

  把五子棋棋盘上纵横交错的每个结点的集合看成是一个点阵,每个点上无子时该点在点阵中对应的值为2,放下白子的点的值为0,黑子的则为1。在每次发生落子后判断哪方胜出。但关键是如何来判断哪方胜出呢?下面就这个问题做详细的解释。

  二、步步前行讲思路

  (1)最朴素的思路

  落子后,由于要判断所下子是否胜出,需要在棋盘的点阵中找到是否有符合横竖斜方向上5个相同子连续排列的情况。最直接的方法是对棋盘上所有的点进行遍历,从左上角的点开始,判断每一点在右方、右下方、下方、左下方四个方向上是否存在连续四个值相同的点,若存在,则该点所代表的一方胜出。

  优点:这样的做法对于编程的写法非常简单,只要在循环里加入四行条件判断语句,分别判断四个方向上的情况就可以了。这种方法比较适合初学者,不容易在编程中出错。

  缺点:这种方法局限性很大,只能进行5子是否连通的判断,不方便添加类似双三禁手等新的规则,缺乏扩展性。而且全部遍历所要进行的运算量很大。

  (2)用“米”字来改进

  在数落了它的缺点以后,再来看看一个较复杂的算法:

  我们知道,只有落子后才会存在判断落子方是否胜出的情况,因此,只要围绕落子的点来做研究即可,而不用遍历整个棋盘上的点。以落子为原点,按“米”字型的八个方向进行判断。落子这个原点即为“米”字的中心点,而判断落子连续的路径可以由“米”字的中心点向8个方向展开。对于“米”字中的同一条直线上的路径,记录连续相同点的个数。当某条线上的值大于或等于5, 落子方即胜出。

  缺点:这个算法在具体编程中会遇到比较复杂的判断,而且同一条直线上的判断由于要从原点出发向相反的两个方向取点,在计算所选点的点阵坐标的时候需要一些经验和技巧。此方法对初学者比较难。

  更大的优点:这个方法的优点在于对游戏规则的扩展性强。由于是以落点为基点,因此,能够对基点周围的点的情况有个比较好的了解。比如说,由于在这个算法中能够比较好地收集到基点周围出现连续相同点的个数,因此我们可以轻松地加入双三禁手的规则。

  双三规则的引入:

  在判断通过“米”字中心点某条直线上的连续点只有3个的时候,再来判断这3个连续点的外侧是否都是空点。如果是,将一个标志双三的变量自加1。如程序中的tree++;当这个初值为0的tree的值为2时,即表示出现双活三的情况,这个时候再判断双活三的一方是不是黑子(即中心点在点阵中的值是否为1),如果这些条件都满足,则判断黑方输了。

                     游戏程序效果图

  三、小结

  在本文中,对于初学者,使用方法一,在编程时写出具体判断哪几个点,代码容易让人看懂,写起来也相对容易完成。但随着编程水平的提高,就需要考虑更多的内容。有些功能在用户看来可能实现是简单而必要的,但可能需要程序员编写更多的代码,这些都需要在编程初期规划好,加大程序的扩展性。

  本期程序的源代码及可执行文件的下载地址:http://www.cpcw.com/45/rec.rar。

  所谓“连的魅力”,除了游戏中的纵横相连外,更多地还体现在游戏“背后”的故事──游戏中的“连”是怎样实现的。在《连连看》中,我们为读者强调的是寻找路径的方法;在《五子棋》中,我们更多地是考虑相连算法的简捷和程序规则的可扩展性。

  虽然重点不同,但数据结构中的遍历、数组等都需要大家熟练掌握,才能顺利编制程序,从这里也可以再次看到数据结构的重要性。当大家了解了游戏运作的原理后,再玩的时候是不是也有不一样的感觉呢?