人工智能的实现 如果说前面介绍的框架是骨骼,界面是皮肉的话,那么接下来将要介绍的人工智能部分则可以说是整个程序的灵魂了。它将进行对弈双方落子的合法性检测、计算机行棋的智能计算、游戏结束检测以及对
胜负结果的判定等工作。以上这些都需要有合理的设计才能实现较高的游戏运行效率。考虑到游戏规则始终是围绕双方棋子的排列形状来进行的,因此可以把棋盘网格作为主要因素进行设计。按从左到右,从上到下的次序从0开始依次对棋盘的9个网格进行编号,可以得出如下几组获胜条件:0,1,2;3,4,5;6,7,8;0,3,6;1,4,7;2,5,8;0,4,8;2,4,6。只要有一方有三颗棋子的位置符合其中任何一组即可认定该方获胜(读者可以在纸上验证一下)。在
程序实现过程中以WINS数组记录上述几种获胜条件,并在每一次行棋完毕后进行比对,以判断游戏是否有获胜方产生。限于篇幅,下面主要对
计算机行棋思路的人工智能设计进行介绍。
首先明确计算机的对弈目的:获胜,如果暂时无法获胜则阻止选手获胜,如果双方都暂时无法获胜则可以下一些"随手棋"。在计算出合适的下子位置后将其添加到己方的行棋记录(打谱)以备后用。由此可以写出如下代码:
int move = getWinningComputerMove();//如能立即获胜则在获胜位置下子 if (move == -1) { //如选手即将获胜则在选手将获胜的位置下子 move = getRequiredBlockingComputerMove(); if (move == -1) // 如双方均暂时无法获胜则下随手棋 move = getRandomComputerMove(); } computerState |= bit(move); // 当前计算机占用的所有位置 |
其中,getWinningComputerMove方法通过对所有可能下子位置(即尚未落子的网格)的枚举,智能判断计算机下一步走到哪里才能获胜:
int move = -1; for (int i = 0; i < 9;++i) { if (isFree(i) && isWin(computerState | bit(i))) { move = i; // 找到获胜位置时中断 break; } } |
如果循环完毕仍没有找到获胜位置则表示目前己方暂无法获胜,需要进一步调用getRequiredBlockingComputerMove方法来计算下一回合对方有无获胜的可能,其实现代码与getWinningComputerMove完全类似,只是以选手的行棋记录playerState替代计算机的行棋记录computerState而已。以上寥寥数行代码即构成了计算机对弈算法的人工智能核心部分,显然人工智能在实现上并没有想象的那么复杂与困难。
小结 通过本系列文章的介绍,陆续将J2ME手机应用程序的一般
开发过程向读者作了一个较为系统和全面的介绍。尤其是本篇对
图形化手机游戏的介绍相信一定对读者有不同程度的启发作用,而且本文所述程序框架完全是通用的,读者只需在此基础之上重新设计游戏剧本即可实现类似的手机游戏如"华容道"、"俄罗斯方块"等。本系列文章开发环境为:
Windows 2000 Professional + SP4;
Java2SDK 1.5.0;
J2ME Wireless ToolKits 2.1;
SonyErisson J2ME SDK(WTK 1.0.4);
SonyErisson T628;
Eclipse 3.0.1-win32;
EclipseMe 0.5.5;
NLpack-eclipse-SDK-3.0.x-win32
查看本文来源