[共设计了三个包:creature、faction、controller]
其中最重要的是Creature类,该类实现了Runnable接口:
public void run() {
// TODO Auto-generated method stub
while (!exit) {
if (canMove()) //判断当前生物能否移动
move();
else {
changeDirection(); //改变前进方向
continue;
}
try {
Thread.sleep(100);
this.controller.repaint();
} catch (Exception e) {
}
}
}
另外有5个派生的生物类,一个Location类,一个Order枚举类和一个Color枚举类。
Faction类作为父类,派生出huluFaction类和scorpionFaction类,两个子类又分别实现了InitializeFormation接口,用于初始化阵型。另外子类中生成了各个生物体的线程,供UIController类调用。
(5)UIController类:整个战斗过程控制类,实现不同对象之间的交互通信,采用单例模式,全局唯一。添加了一个键盘响应事件接受键盘输入。实现了一个内部类:Fighting类,该类实现了Runnable接口,用于模拟双方交战的场景,并时刻判断是否有一方生物全部死亡,即游戏是否结束。
##面向对象机制
grandFather = new GrandFather();
for(HuluBrother brother:brothers)
this.creatures.add(brother);
creatures.add(grandFather);
private static UIController controller = new UIController();
public static UIController getInstance() {
return controller;
}
所有线程通过退出标志位exit终止线程,exit被定义为valitle类型,成为原子级别的操作。
记录战斗过程的线程是通过按一定频率对屏幕截屏的方式实现的,回放战斗经过的线程则通过对所截的图按原来的频率快速播放得到。
程序接受键盘响应,当按下空格键的时候,所有生物体线程,控制双方战斗的线程,以及记录战斗过程的线程同时启动。在战斗前或战斗结束后按L键,然后可以选择文件回放战斗经过,该文件和src在同一目录下,目录名称是records。