9.2 五子棋游戏的架构
五子棋游戏的架构涉及游戏驱动、类结构和流程的初步设计,由于人机对战五子棋采用了人工智能算法,因此,还对获胜棋型和攻守策略进行了探讨。
9.2.1 事件驱动游戏
棋类游戏通常具备两个重要特性,首先是对战双方轮流落子,其次是落子间隔通常是不确定的,尤其是对战后期,可能每一步棋都需要经过深思熟虑,无论是人方还是计算机方,都无法对间隔时间有实现的预期。
基于以上两个特性,本游戏摒弃了大多数游戏采用的线程或定时器驱动游戏的方法,而采用了事件驱动的方法,即玩家的键盘或触摸笔触发游戏的下一步动作。
事件驱动大大减少了不必要的工作量,只有玩家发出消息时,计算机才启动运算,而在玩家思考期间,计算机不做任何运算和重绘操作。事件驱动的游戏循环如图9-4所示。
9.2.2 游戏的类结构
整个游戏共由6个类组成,如图9-5所示是游戏的类结构。游戏的FIRMIDlet类负责保持display对象,并且提供各屏幕之间的切换。整个程序包含4个屏幕:游戏主屏幕表单,实际玩家进行游戏的FIRCanvas,提供某些关于游戏选项的Option表单,以及一个用来显示相关信息的About表单。此外,Dot类和FIRLogic类是分别用来构造游戏棋子和算法逻辑的。
图9-4 事件驱动的游戏循环
图9-5 类结构
9.2.3 游戏的流程
游戏启动时,FIRMIDlet对象先显示游戏主屏幕,在屏幕下方一侧是退出软键,另一侧是用软键构成的菜单,菜单元素主要有“设置”、“开局”和“关于”选项。当玩家选择“设置”软键时,则显示游戏参数设置表单;当玩家选择“开局”软键时,则显示游戏对战主对面;当玩家选择“关于”软键时,则显示游戏介绍表单。
玩家进入游戏参数设置表单,当玩家按下“确定”软键时,则确认当前游戏参数,返回游戏主屏幕;当玩家按下“取消”软键时,则放弃此次对游戏的修改,直接返回游戏主屏幕。
玩家进入游戏对战画布,对战中画布有两个软键,当玩家按下“退出”软键时,则退出游戏;当玩家按下“悔棋”软键时,则进行悔棋操作;当游戏结束时,“悔棋”软键被换成“重玩”软键。
玩家进入游戏介绍表单,当玩家按下“确定”软键时,返回游戏主屏幕。
整个游戏的界面切换流程如图9-6所示,主要的用户界面如图9-7所示。
图9-6 整个游戏的界面切换流程图

图9-7 游戏的主要用户界面
9.2.4 五子棋的人工智能
人工智能也就是所谓的AI(Artificial Intelligence),它是一门很抽象的技术(或者也可以称之为艺术),游戏中的AI可以在遵循一定规则的情况下,依程序设计者本身的思考逻辑制作。
可以这样认为,人工智能的核心是使计算机具有自动处理事件的能力,而设计者的所有研究也应该围绕着这一方向进行。
最常见的AI游戏就是棋盘式游戏。在这类游戏中,通常的策略类AI程序都是使计算机根据目前状况计算所有可走的棋与可能的获胜状况,并计算当前计算机可走棋步的获胜分数或者玩家可走棋步的获胜分数,然后再决定出一个最佳走法。下面我们先介绍一下五子棋的AI构想。
1.求五子棋的获胜组合
在一场五子棋的游戏中,计算机必须要知道有哪些获胜组合,因此我们必须求得获胜组合的总数。我们假定当前的棋盘为15×15:
(1)计算水平方向的获胜组合数,每一列的获胜组合是11,共15列,所以水平方向的获胜组合数为:11×15=165。
(2)计算垂直方向的获胜组合总数,每一行的获胜组合是11,共15行,则垂直方向的获胜组合数为:11×15=165。
(3)计算正对角线方向的获胜组合总数,正对角线上的获胜组合总数为11+(10+9+8+ 7+6+5+4+3+2+1)×2=121。
(4)计算反对角线方向的获胜组合总数,反对角线上的获胜组合总数为11+(10+9+8+ 7+6+5+4+3+2+1)×2=121。
这样所有的获胜组合数为:165+165+121+121=572。
2.设计获胜棋型
我们已经计算出了一个15×15的五子棋盘会有572种获胜方式,这样我们可以利用数组建立一些常规棋型,棋型的主要作用是:① 判断是否有任何一方获胜;② 根据当前格局判断最可能的落子方式。
然而在现实中,人们总结了很多能够构成获胜棋型的“前奏”,它们是通向胜利的捷径,如“冲四”、“活三”,除了“连五”以外,这些也是我们努力的目标。
3.攻击与防守
获胜棋型的算法是中性的,不区分计算机和玩家,这就涉及到攻击和防守何者优先的问题。笔者认为,五子棋的根本是“防守”,“攻击”是灵魂。进攻是取胜的手段,是防守的延续和发展。
根据长期的经验和研究表明,一个棋手只要掌握全面的、基本的防守原理和技巧,就能和比自己棋力高一个等级的进攻型选手对抗,起码能立于不败之地。对手进攻越偏激,则防守的效果越好。没有进攻的防守就像只开花不结果,没有实际意义,顽强的防守是反攻的前奏,没有进攻的延续,防守也失去了价值。二者缺一不可。
根据以上的原理,计算机在计算最佳的攻击位置之前,还要计算当前玩家的最佳攻击位置。如果玩家存在最佳攻击位置,那么计算机就将下一步的棋子摆在玩家的最佳攻击位置上以阻止玩家的进攻,否则计算机便将棋子下在自己的最佳攻击位置上进行攻击。事实上,这个AI原理虽然很简单,但是很实用。






