图5.2(2) 关于表单界面
5.3 游戏设置表单的实现
游戏设置表单Option类用来对游戏的参数进行设置,包括棋盘大小,游戏难度,是否先手,过程中使用了Gauge和ChoiceGroup两种高级用户界面组件。
5.3.1 Gauge与ChoiceGroup组件介绍
Gauge组件实现了一个图形标尺,通常被用来表示一个过程的进展情况或者一些系列数字的选择情况。Gauge的构造方法根据指定的标签、交互模式、最大值、初始值生成一个新的Gauge对象,原型如下:
Gauge(String label,Boolean interactive,int maxValue,int initialValue)
? Gauge构造方法有4个参数:label、interactive、maxValue、initialValue ? 参数label用作label对象的标签,设置为null表示标签为空 ? 参数interactive是一个boolean变量,表示这个Gauge对象的交互模
式,设置为true表示交互模式,即用户可以改变Gauge对象的值:如果设置为flase,则表示非交互模式,即用户不可以改变Gauge的值。 ? 参数maxValue是一个大于0的整数,表示Gauge对象的最大值(Gauge值的范
- 13 -
围为[0,maxValue])。这个值必须大于0,否则会抛出IllegaArgumentException。 ? 参数initialValue是一个整数值,表示Gauge对象的初始值,它的范围是[0,
maxValue]。如果initialValue小于0,则Gauge对象的初始值被设置为0;
如果initialValue大于maxValue,则被设置为maxValue。
ChoiceGroup组件用来构造选择框,棋构造方法如下:
ChoiceGroup(String label,int choiceType)
该构造方法有两个参数,其中参数label用来设置此选项组的标签。Label可以设置为null,表示此Item对象的标签为空白。构造完成后,还可以使用setLabel方法和getLabel方法来分别设置和获取对象的标签。参数choiceType用来设置ChoiceGroup的类型,ChoiceGroup类继承了Choise接口的三种类型:
? EXCLUSIVE,值为1,一次只有一个元素被选择。 ? MULTIPLE,值为2,一次可以有多个元素被选择。
? IMPLICIT,值为3,类似软键菜单或者按钮,当被选择时,立即触发
Command事件。
? POPUP,值为4,弹出式菜单,当被选择时,弹出选项。
5.3.2 Option类设计
该类实现游戏参数的设置,其UML图如图4.3.2(1)所示,游戏截图如4.3.2(2)所示。
- 14 -
图5.3.2 (1) Option类的UML图
图5.3.2 (2) 设置表单界面
5.3.3 Option类代码片断
//保存记录的方法
public void saveOptions(){ try{
RecordStore rs=RecordStore.openRecordStore(\true);//打开记录,如果没有则创建
- 15 -
byte bs[]=new byte[3];
bs[0]=(byte)boardSize; //棋盘大小
bs[1]=(byte)(isComputerFirst?1:0); //先手
bs[2]=(byte)degree; //难度
if(rs.getNumRecords()>0) //如果有记录则ID为1的记录内容为当前参数
rs.setRecord(1,bs,0,3); else
rs.addRecord(bs,0,3); //如果不存在记录,则添加新记录,内容为当前的参数
rs.closeRecordStore(); //关闭记录 }
catch(RecordStoreException e){ } }
5.4 棋子Dot类的实现
Dot类代表了现实中的棋子,该类主要和于记录棋子的位置和检查落子的合法性(是否越界)。五子棋是一个二维棋类游戏,所以首先想到的是定义一个Dot类来表示棋子。考虑到移动设备的资源有限,以及尽可能减少系统资源占用,程序不在下每一步棋时生成一个对象,而是在游戏进行时,玩家或者计算机每下一步棋,在数组相应位置生成该棋子的对象,而将已经下过的棋子保存到数组中随时检索,这样可以避免过多的棋子对象占用系统内存。Dot类的UML图如4.4所示。
图5.4 Dot类的UML图
- 16 -
5.5 对战逻辑FIRlogic类的实现
FIRLogic类是整个游戏的逻辑类,包含了人工智能算法,这些算法主要体现在对各种棋型的检测并计算一个最佳的落子点。除此之外,该类还处理双方落子功能和悔棋功能,判断是否游戏结束,谁是胜利者。
5.5.1 落子与悔棋
当对战某一方在棋盘上落子时,就将棋盘数组的相应位置设置为该方代码(计算机方为1,玩家方为2)。
双方落子后,程序人使用一个Dot类棋子对象来记录最后一步棋的位置,当玩家下了一步棋后需要将上一步重新绘制,以消除棋子上的引导框。此外,还使用堆栈来存储最近的10步棋,以便玩家悔棋。
为了实现悔棋功能,该程序采用了堆栈来存储最近的棋子,当玩家取用悔棋功能时,程序就会将堆栈里的头两步棋的对象移出,这时本来位于第三的棋子对象就变成了栈顶,然后将栈顶的棋子设置为最后一步,并重新绘制棋盘。
5.5.2 棋型检测的实现
connectedIn1D方法用于检测棋盘上任意一点在指定方向上的同类棋子相连个数,传入落子方标志(区分计算机还是玩家)、检测位置的行列坐标和检测方向,返回在该方向上相连棋子的个数,若检测到对方棋子或者空白棋面则停止检测。
connectedIn8D方法是基于connectedIn1D方法的一个升级方法,是对8个方向都进行检测,最终返回一个整型的数组,后面用cd[i]表示。
expandedIn1D方法跟connectedIn1D方法相似,不同的是expandedIn1D方法是检测自己棋子以及空白棋子(最多连续四空白点)的个数,当遇上敌方棋子,
- 17 -