山东大学项目实训——简易微信小游戏(五)
本篇对cocos creator五子棋项目进行补充,例如输赢判定、悔棋的实现。由于在上一篇将该项目的核心:人机对战的“评分表法”进行了分析与实现 山东大学项目实训——简易微信小游戏(四),因此这里相对容易些。
一、输赢判定及实现
五子棋只要有一方“五子连珠”则证明该方获胜,那么计算机如何知道棋盘上出现“五子连珠”呢?显然机器只能知道玩家鼠标点击的位置坐标或者是机器通过“评分表法”得到的最大分数位置坐标,因此最简单粗暴的方式就是遍历该位置的同一方向(水平、垂直、正斜、反斜)上是否有紧挨连续的棋子且多于4个(加上自身下的1个)形成“五子连珠”。

如上图,假设机器(白棋)通过“评分表法”得到最大分数位置在图中叉号位置,那么水平方向(红圈部分)如何判定输赢?遍历其左边所有位置,并统计白棋数,直到出现空位置或者黑棋则停止计数。以此类推计算右边所有位置,最后将两边统计出来的白棋数相加判断是否大于等于4即可。
代码实现 :


全局函数isWin传递4个参数:chessX(下棋位置x矩阵坐标)、chessY(下棋位置y矩阵坐标)、owner(区分黑棋、白棋、空位置)、chessArray(棋盘二维数组 记录某位置是黑棋还是白棋还是空位置)。这里只需关注“左侧”“右侧”部分的代码实现,对于“左侧”,假设黑棋下棋位置坐标为(3,3),那么我们需要顺序遍历(2,3)(1,3)(0,3)位置,如果(2,3)是黑棋,则sum+1。接着看(1,3),若不是黑棋则退出遍历,看右侧。最后将sum也就是棋数统计判断大于等于4即可,sum置零。继续判断垂直方向(分上、下侧)以及正斜方向(右上侧、左下侧)、反斜方向(左上侧、右下侧),每判断一个大方向后,sum置零。这里剩下3大方向的实现就不给出,请需要的读者根据水平方向自行思考。
问题 :为什么sum的判断是大于等于4而不是等于4?

如上图,只看水平方向。假设红点位置均下了白棋,白棋方下一步要在叉号位置下白棋,很明显如果下了这一步,白棋获胜。然而,若上述代码sum的判断条件是=4的话,此时sum=5不满足条件,无法判定获胜,与逻辑违背。因此sum的判断就是>=4。
二、悔棋及实现
之前的代码均是用chessX、chessY这样类似int类型的变量进行实现,没有存储的功能,因此需要一维数组来记录这些坐标。如果想要悔棋,实际上就是将最近的节点删除并且将坐标从一维数组中删除以及坐标所处的状态(黑棋、白棋)置为空即可。
代码实现 :

因为玩家下完黑棋后,机器会根据“评分表法”自动下白棋。因此悔棋不光光要悔玩家的最近一步,还要悔机器的最近一步。利用push和pop函数,对数组中元素末尾进行添加和删除。
三、总结
cocos creator五子棋项目到这里已经基本分析完成,实际上就是在编写js代码。只不过可以通过cocos creator这个工具方便游戏开发,例如界面的可视化、控件的添加、控件的监听事件等。在这里就不再赘述,基本的操作在之前的文章中已经介绍。一个工具只有用多了才会熟悉,相信读者使用多次就会逐渐熟悉。
如果还有其它需要补充的地方会继续写文章进行补充,也欢迎读者针对不懂的地方或者我写的不够好的地方提出意见,Thanks♪(・ω・)ノ
