Informatikunterricht

am Gymnasium Kirchenfeld

Benutzer-Werkzeuge

Webseiten-Werkzeuge


robocode:tracking

Dies ist eine alte Version des Dokuments!


Tracking

Für viele Techniken ist es wichtig, Informationen über die Roboter zu haben. Dazu werden die Informationen, welche beim Scannen der Roboter mittels <javadoc robocode>robocode.Robot#onScannedRobot(robocode.ScannedRobotEvent)|onScannedRobot()</javadoc> anfallen, in geeigneter Weise zwischengespeichert.

Die Klasse EnemyRobot speichert die Information (Position) eines Roboters:

public class EnemyRobot
{
    private Robot ownRobot;
    private String name;
    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();
        x = ownRobot.getX() + e.getDistance() * Math.sin(Math.toRadians(headingToRobot));
        y = ownRobot.getY() + e.getDistance() * Math.cos(Math.toRadians(headingToRobot));
    }
 
    public String getName() {
        return name;
    }
 
    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<String, EnemyRobot> enemies;
    private Robot ownRobot;
 
    public EnemyTracker(Robot ownRobot) {
        enemies = new HashMap<String, EnemyRobot>();
        this.ownRobot = ownRobot;
    }
 
    public Collection<EnemyRobot> 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 <javadoc robocode>robocode.Robot#onScannedRobot(robocode.ScannedRobotEvent)|onScannedRobot()</javadoc> 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
    }
}
robocode/tracking.1427718825.txt.gz · Zuletzt geändert: 2020/10/13 14:25 (Externe Bearbeitung)