Page 193 - The Unofficial Guide to Lego Mindstorms Robots
P. 193
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;
}
}
t ag acts only if the bu mper is pressed. Otherwise, it sets tagCommand to a special value, COMMAND_NONE, which
indicates that tag is not interested i n 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
ju st tagged. This movement is accomplished by setting the tagCommand variable.
If tag receives an acknowledgement from the other robot, it add s 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 curren t 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 outp ut 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.
If tag sends out a tag message but doesn't receive a reply, it doesn't do anything. The lack of a reply can mean two things:
either the other robot did not receive the I R tag message, or the robot bum ped into an obstacle, not the other robot. In the
original RoboTag by Matthew Miller, the aren a contained no obstacles, so it was safe to assume that the other robot didn't
"hear" the tag message. The tagging robot would then spin in place shouting "Tag!" repeatedly, hoping to get in range of the
other robot's IR port.