int tagCommand;
task tag() {
while(true) {
if (BUMP_SENSOR == 1) {
// Say tag!
SendMessage(MESSAGE_TAG);
// Coast to a stop.
tagCommand = COMMAND_FLOAT;
Wait(20);
// Check to see if we got an acknowledgement.
if (Message() == MESSAGE_ACKNOWLEDGE) {
∗ The endless loop isn't strictly necessary, but it makes cruise look more like the other behaviors.
Page 182
PlaySound(3);
SetPower(OUT_B, score);
On(OUT_B);
if (score < 7) score = score + 1;
}
else PlaySound(2);
ClearMessage();
// Back up.
tagCommand = COMMAND_REVERSE;
Wait(50);
// Turn left or right for a random duration.
if (Random(1) == 0) tagCommand = COMMAND_LEFT;
else tagCommand = COMMAND_RIGHT;
Wait(Random(200));
tagCommand = COMMAND_NONE;
}
else tagCommand = COMMAND_NONE;
}
}
tag acts only if the bumper is pressed. Otherwise, it sets tagCommand to a special value, COMMAND_NONE, which indicates that tag is not interested in controlling the robot.
When the bumper is pressed, tag sends out an IR message, using SendMessage(), to the other robot. Then it waits for a reply by repeatedly calling Message(). The robot also backs up and
turns to the left or right to move around the robot it has just tagged. This movement is accomplished by setting the tagCommand variable.
If tag receives an acknowledgement from the other robot, it adds one to its score. There's a bit of a hack here to keep score. The power setting of output B is used to contain the robot's current
score. The initialization code for RoboTag (presented later) tells the RCX to view the output B setting:
SelectDisplay(5);
All tag does is set the power of output B to show the current score on the display:
SetPower(OUT_B, score);
On(OUT_B);
if (score < 7) score = score + 1;
Of course, the counter runs from only 1 to 7, so the maximum score is 7.