Difference between revisions of "Radar"
(Cleanup, adding some example code) |
|||
Line 38: | Line 38: | ||
There are several "perfect" radar locks that will not slip once they have a lock. Here is one: | There are several "perfect" radar locks that will not slip once they have a lock. Here is one: | ||
+ | ==== Thin lock ==== | ||
+ | This type of lock is thin and follows the robots around the stage. | ||
<pre> | <pre> | ||
import robocode.util.Utils; | import robocode.util.Utils; | ||
Line 54: | Line 56: | ||
double radarTurn = absoluteBearing - getRadarHeadingRadians(); | double radarTurn = absoluteBearing - getRadarHeadingRadians(); | ||
setTurnRadarRightRadians(Utils.normalRelativeAngle(radarTurn)); | setTurnRadarRightRadians(Utils.normalRelativeAngle(radarTurn)); | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | ==== Wide lock ==== | ||
+ | Another type of "perfect" radar, that is think and practices by who have space to spare and want to avoid the rare slipping of the thin lock. | ||
+ | <pre> | ||
+ | import robocode.util.Utils; | ||
+ | |||
+ | int ticksSinceLastScan = 0; | ||
+ | public void run() { | ||
+ | // ... | ||
+ | do { | ||
+ | if (ticksSinceLastScan++ > 2) | ||
+ | turnRadarRight(Double.POSITIVE_INFINITY); | ||
+ | } while (true); | ||
+ | } | ||
+ | |||
+ | public void onScannedRobot(ScannedRobotEvent e) { | ||
+ | double radarHeading = Utils.normalRelativeAngle(e.getBearingRadians() | ||
+ | + getHeadingRadians() - getRadarHeadingRadians()); | ||
+ | |||
+ | // Width of the bot, plus twice the arc it can move in a tick | ||
+ | double arcToScan = atan(36.0 / e.getDistance()); | ||
+ | |||
+ | //Limit this so that we don't overshoot | ||
+ | if (arcToScan > PI / 4.0) arcToScan = PI / 4.0; | ||
+ | radar += (radar < 0) ? -arcToScan : arcToScan; | ||
+ | setTurnRadarRightRadians(radar); | ||
+ | |||
+ | ticksSinceLastScan = 0; | ||
+ | |||
+ | // ... | ||
} | } | ||
</pre> | </pre> |
Revision as of 08:38, 12 November 2007
The radar is one of the most vital components of your robot. Without it targeting is effectively impossible, and movement is purely random. Just as with movement and targeting, there are many simple and complex algorithms for radar control. In most robots the radar takes up the smallest portion of code.
Contents
Example code
NOTE: for most of these radar locks, you will need to add one of the following to your run()
method:
setAdjustRadarForRobotTurn(true);
setAdjustGunForRobotTurn(true); setAdjustRadarForGunTurn(true);
Spinning radar
To just spin the radar, add this to your run()
method:
setTurnRadarRightRadians(Double.POSITIVE_INFINITY);
The infinity lock
The infinity lock is the simplest radar lock, and is used frequently in Nano bots. It has the disadvantage of "slipping" and losing its lock frequently.
public void run() { // ... setTurnRadarRightRadians(Double.POSITIVE_INFINITY); } public void onScannedRobot(ScannedRobotEvent e) { // ... setTurnRadarLeftRadians(getRadarTurnRemainingRadians()); }
Perfect radar locks
There are several "perfect" radar locks that will not slip once they have a lock. Here is one:
Thin lock
This type of lock is thin and follows the robots around the stage.
import robocode.util.Utils; public void run() { // ... turnRadarRight(Double.POSITIVE_INFINITY); do { scan(); } while (true); } public void onScannedRobot(ScannedRobotEvent e) { // ... double absoluteBearing = getHeadingRadians() + e.getBearingRadians(); double radarTurn = absoluteBearing - getRadarHeadingRadians(); setTurnRadarRightRadians(Utils.normalRelativeAngle(radarTurn)); }
Wide lock
Another type of "perfect" radar, that is think and practices by who have space to spare and want to avoid the rare slipping of the thin lock.
import robocode.util.Utils; int ticksSinceLastScan = 0; public void run() { // ... do { if (ticksSinceLastScan++ > 2) turnRadarRight(Double.POSITIVE_INFINITY); } while (true); } public void onScannedRobot(ScannedRobotEvent e) { double radarHeading = Utils.normalRelativeAngle(e.getBearingRadians() + getHeadingRadians() - getRadarHeadingRadians()); // Width of the bot, plus twice the arc it can move in a tick double arcToScan = atan(36.0 / e.getDistance()); //Limit this so that we don't overshoot if (arcToScan > PI / 4.0) arcToScan = PI / 4.0; radar += (radar < 0) ? -arcToScan : arcToScan; setTurnRadarRightRadians(radar); ticksSinceLastScan = 0; // ... }