书接上回。时间间隔稍微有点远,但是我还是希望能够继续完结这一系列的文章。上一回我们已经建立了一个很标准的游戏框架,基于这个游戏框架我们只需稍加理解便可以完成这个五子棋软件的双人对战功能。
为什么要先讲解双人对战功能呢?因为其实AI vs. MAN的功能其实是MAN vs. MAN的一个子集,双人对战所完成的内容是包括游戏规则、游戏操作、胜负判定的一系列纯粹的游戏内容的实现,而加入AI只不过是将对战双方的其中一方的行棋改为了计算机自动计算。
在上一篇文章中我给出了一个类图,现在我再次给出。
类图
其中Game类是我们这次的核心任务,因为整个游戏将如何进行基本上是由Game类来完成的,于是我们首先需要分析整个游戏的流程,由于我们要将分析的结果转换为程序逻辑,所以这个分析是必须逐步求精的,那么请跟着我一步一步的来把游戏的流程梳理清楚:
1
这是一个很标准的博弈类游戏的游戏流程,通常人们第一想到的就是这样的,但是这样的流程如果直接挪用到我们的游戏设计中就显得有些冗余了,现在回到我们之前的类图,之前我并没有解释为什么Game类里会有这些属性及方法,其实他们并非是凭空产生的,没有基于现在的分析,是不会有那样的结果的。注意观察上面的流程图,你可以很容易的发现图中有三对相似度很大甚至于重复的部分:行棋、判断胜负和获胜提示,现在我们可以想办法让他们合并起来,而要实现这一点只需要添加一个属性:curUser。这个属性可以存储当前应当行棋的玩家编号,配合方法changeUser(),我们就可以将这个流程简化为:
2
这样整个流程就几乎是我们所要编写的程序了,流程每次都将在行棋之前进行等待,当一方玩家行棋之后便会自动继续这套流程,如果游戏并未结束那么就会转换行棋对象,等待另一个玩家的操作。
通过观察这一流程,很容易发现,isWin()这个方法是我们的核心,那么该如何实现它呢?
之前我提到了,由于时间紧任务重,在我所制作的程序中并不考虑“禁手”问题(其实在实现完AI部分之后你可以很容易的扩展出这一功能),所以这个游戏的规则就剩下了:

棋面上是否有五子连珠

通常的,我们会想到检查整个盘面是否存在五个相邻的同色棋子,这的确是一种办法,但是对于这种交替博弈的游戏而言,胜利是在一方下子之后才可能产生的,也就是说我们可以只检查玩家所放置的最后一颗棋子周围是否能构成五子连珠即可,算法非常简单,这里便也就不给出了。
那么至此,其实我们的双人对战的五子棋游戏就已经完成了,此时的你应该非常高兴,无论怎样,这都是一个完整的游戏了^_^。那么我将会尽可能快的更新下一篇文章,在下一篇中我将讲解五子棋人机博弈的基础部分——博弈树。

说点什么

1 评论 在 "五子棋游戏[2] – 双人对战"

提醒
排序:   最新 | 最旧 | 得票最多

可恶的阚京……