/** * DWStraight - a robot by (developerWorks) */ public class DWStraight extends Robot { ... // <<Area 1>> /** * run: DWStraight′s default behavior */ public void run() { ... // <<Area 2>> while(true) { ... // <<Area 3>> } } ... // <<Area 4>> public void onScannedRobot(ScannedRobotEvent e) { fire(1); } }
突出显示的区域就是我们添加控制机器人的代码的地方:
Area 1 我们可以在这片空白里声明类作用域变量并设置这些变量的值。这些变量可以在机器人的 run() 方法内以及其他一些您可能创建的助手方法内使用。
Area 2 战斗治理器调用 run() 方法激活机器人。典型情况下,run() 方法包括两个区域(即在清单 1 中指出的 Area 2 和 Area 3),您可以在这两块空白里添加代码。您在 Area 2 中加入的代码每个机器人实例只运行一次。这部分代码通常用于使机器人先处于一种预设状态后再开始执行重复行为。
Area 3 这是典型的 run() 方法实现的第二部分。在此,我们将在无限 while 循环内对机器人可能执行的重复行为进行编程。
Area 4 您可以在这一区域内添加机器人在 run() 逻辑内使用的助手方法。您也可以在此添加您想要覆盖的任何事件处理程序。例如,清单 1 里的代码处理 ScannedRobot 事件,每当雷达检测到机器人的时候,只是直接向其发射炮弹。
清单 3. 战斗治理器的逻辑的伪代码 while (round is not over) do call the rendering subsystem to draw robots, bullets, eXPlosions for each robot do wake up the robot wait for it to make a blocking call, up to a max time interval end for clear all robot event queue move bullets, and generate event into robots′ event queue if applicable move robots, and generate event into robots′ event queue if applicable do battle housekeeping and generate event into robots′ event queue if applicable delay for frame rate if necessary end do
请注重,在 for 循环内部,战斗治理器线程的等待时间不会超过最大的时间间隔。假如机器人线程没有及时调用阻塞 API(典型情况下是由于一些应用程序逻辑错误或无限循环),那么,它将继续进行战斗。生成一个 SkippedTurnEvent 并将其加入机器人事件队列中,用来通知高级机器人。