图4.3 游戏的界面切换游戏图
4.4 五子棋的人工智能
人工智能也就是所谓的AI(Artificial Intelligence),它是一门很抽象的技术(或者也可以称之为艺术),游戏中的AI可以在遵循一定规则的情况下,依程序设计者本身的思考逻辑制作。
可以这样认为,人工智能的核心是使计算机具有自动处理事件的能力,而设计者的所有研究也应该围绕着这一方向进行。
最常见的AI游戏就是棋盘式游戏。在这类游戏中,通常的策略类AI程序都是使计算机根据目前状况计算所有可走的棋与可能的获胜状况,并计算当前计算机可走棋步的获胜分数或者玩家可走棋步的获胜分数,然后再决定出一个最佳法。下面介绍一下五子棋的AI构想。
4.4.1 五子棋的获胜组合
在一场五子棋的游戏中,计算机必须要知道有哪些获胜组合,因此我们必须求得获胜组合的总数。现在假定当前的棋盘为15x15:
1) 计算水平方向的获胜组合数,每一列的获胜组合是11,共15列,所以
水平方向的获胜组合数为:11x15=165。
- 8 -
2) 计算垂直方向的获胜组合数,每一行的获胜组合是11,共15列,所以
垂直方向的获胜组合数为:11x15=165。
3) 计算正对角线方向的获胜组合数,正对角线上的获胜组合总数为11+
(10+9+8+7+6+5+4+3+2+1)x2=121。
4) 计算反对角线方向的获胜组合数,反对角线上的获胜组合总数为11+
(10+9+8+7+6+5+4+3+2+1)x2=121。
这样所有的获胜组合数为:165+165+121+121=572。
4.4.2 设计获胜棋型
我们已经计算出了一个15x15的五子棋盘会有572种获胜方式,这样我们可以利用数组建立一些常规棋型,棋型主要作用是:判断是否有任何一方获胜;根据当前格局判断最可能的落子方式。
然而在现实中,人们总结了很多能够构成获胜棋型的“前奏” ,它们是通向胜利的捷径,如“冲四” 、“活三” 、“双三”等等。
5.游戏设计与实现
5.1 MIDlet简介
MIDlet是用J2ME APIs开发的程序,用于移动计算环境中。MIDlet需要一个特殊的运行环境,这个环境主要包含一个应用程序管理器,它为在移动设备上选择和运行MIDlet提供方便。
- 9 -
5.1.1 MIDlet生命周期
所有MIDlet都继承自java.microedition.midlet.MIDlet,该类包含了MIDP平台控制应用程序执行过程的方法。
当MIDlet被初始化后就进入它的生命周期,该生命周期包含三种状态:激活态(Active)、暂停态(Paused)和销毁态(Destroyed),这三种状态的控制完全由JAM来完成。当出现状态迁移时,JAM会自动调用相应的方法,MIDlet状态迁移图如4.1.1所示。
JAM初始化MIDlet暂停状态(Paused)调用startApp方法调用destroyApp方法调用ParseApp方法激活状态(Active)销毁状态(Destroyed)调用destroyApp方法
图5.1.1 MIDlet状态迁移触发的方法调用
JAM加载MIDlet后,首先进行初始化的工作,然后将状态设置暂停态,如果在初始化过程中没有出现异常,那么将MIDlet的状态设置为激活状态,否则将MIDlet的状态设置为销毁状态。在每次状态转换的时候都要高用相应的方法。
- 10 -
5.1.2 主类FIRMIDlet类的实现
FIRMIDlet类继承了MIDlet类,负责程序的启动和屏幕切换,该类用高级界面中的软键来实现游戏菜单,在不同的手机上,软键可能有不同的分布。FIRMIDlet类的UML图如图4.1.2(1)所示,主界面如图4.1.2(2)与4.1.2(3)所示。
图5.1.2 FIRMIDlet类的UML图
图5.1.2 (2) 初屏 图5.1.2 (3) 按下菜单后的屏幕
- 11 -
5.1.3 FIRMIDlet类代码片断
//构建主屏表单
public FIRMIDlet() {
display=Display.getDisplay(this); form=new Form(null); try{
imgSplash=Image.createImage(\加载屏幕图片 }
catch(IOException e){
imgSplash=Image.createImage(1, 1); }
form.append(imgSplash);
CMD_EXIT=new Command(\退出\创建退出软键 CMD_GO=new Command(\开局\创建开局软键 CMD_OPTION=new Command(\设置\创建设置软键 CMD_ABOUT=new Command(\关于\创建关于软键
form.addCommand(CMD_EXIT); //将退出软键添加到主表单 form.addCommand(CMD_GO); //将开局软键添加到主表单 form.addCommand(CMD_OPTION); //将设置软键添加到主表单 form.addCommand(CMD_ABOUT); //将关于软键添加到主表单 form.setCommandListener(this); //监听主表单软键事件 myCanvas=new FIRCanvas(this); //创建画布 options=new Options(this); //创建设置表单 about=new About(this); //创建关于表单
}
5.2 游戏介绍表单的实现
About是游戏介绍表单类,主要是向玩家阐述五子棋的一些信息。其UML图如4.2(1)所示,游戏截图如4.2(2)所示。
图5.2(1) About类的UML图
- 12 -