====== Tracking ====== Für viele Techniken ist es wichtig, Informationen über die Roboter zu haben. Dazu werden die Informationen, welche beim Scannen der Roboter mittels robocode.Robot#onScannedRobot(robocode.ScannedRobotEvent)|onScannedRobot() anfallen, in geeigneter Weise zwischengespeichert. Die Klasse ''EnemyRobot'' speichert die Information (Position) eines Roboters: import robocode.*; import robocode.util.*; public class EnemyRobot { private Robot ownRobot; private String name; private double velocity; private double x; private double y; public EnemyRobot(Robot ownRobot, String name) { this.ownRobot = ownRobot; this.name = name; } public void update(ScannedRobotEvent e) { double headingToRobot = ownRobot.getHeading() + e.getBearing(); velocity = e.getVelocity(); x = ownRobot.getX() + e.getDistance() * Math.sin(Math.toRadians(headingToRobot)); y = ownRobot.getY() + e.getDistance() * Math.cos(Math.toRadians(headingToRobot)); } public double getDistance() { double dx = x - ownRobot.getX(); double dy = y - ownRobot.getY(); return Math.sqrt(dx*dx + dy*dy); } public double getHeading() { return Utils.normalAbsoluteAngleDegrees(Math.toDegrees(Math.atan2(x - ownRobot.getX(), y - ownRobot.getY()))); } public String getName() { return name; } public double getVelocity() { return velocity; } public double getX() { return x; } public double getY() { return y; } } Die Klasse ''EnemyTracker'' führt eine Liste aller bekannten Roboter und aktualisiert diese. import java.util.*; import robocode.*; public class EnemyTracker { private Map enemies; private Robot ownRobot; public EnemyTracker(Robot ownRobot) { enemies = new HashMap(); this.ownRobot = ownRobot; } // Idea by Michael Marti public EnemyRobot getClosestEnemy() { EnemyRobot closest = null; for (EnemyRobot enemy : getEnemies()) { if (closest == null || enemy.getDistance() < closest.getDistance()) { closest = enemy; } } return closest; } public Collection getEnemies() { return enemies.values(); } public void update(ScannedRobotEvent e) { if (!enemies.containsKey(e.getName())) { // Gegner noch nicht bekannt enemies.put(e.getName(), new EnemyRobot(ownRobot, e.getName())); } enemies.get(e.getName()).update(e); } } Im eigenen Roboter wird ein ''EnemyTracker''-Objekt erzeugt. Bei jedem Aufruf von robocode.Robot#onScannedRobot(robocode.ScannedRobotEvent)|onScannedRobot() wird die ''update()''-Methode des ''EnemyTracker'' aufgerufen. public class MyRobot extends Robot { private EnemyTracker enemyTracker; public void run() { enemyTracker = new EnemyTracker(this); // Weitere Aktionen } public void onScannedRobot(ScannedRobotEvent e) { enemyTracker.update(e); // Weitere Aktionen } }