/** * 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 并將其加入機器人事件隊列中,用來通知高級機器人。