Informatikunterricht

am Gymnasium Kirchenfeld

Benutzer-Werkzeuge

Webseiten-Werkzeuge


robocode:target-linear-1

Zielen: Lineares Vorhalten

Wenn sich der gegnerische Roboter bewegt, befindet er sich nicht mehr am gleichen Ort, wenn das Geschoss diesen erreicht. Ein Ansatz ist, auszurechnen, wo sich der Roboter befinden wird, wenn er gleichförmig weiterfährt.

Die Mathematik (PDF)

public void onScannedRobot(ScannedRobotEvent e) {
    final double FIREPOWER = 2.0;
    final double ROBOT_WIDTH = 16.0;
    final double ROBOT_HEIGHT = 16.0;
 
    double headingToRobot = getHeading() + e.getBearing();
    // Bekannte Werte bestimmen
    double xB = getX();
    double yB = getY();
    double vB = Rules.getBulletSpeed(FIREPOWER);
    double xE = xB + e.getDistance() * Math.sin(Math.toRadians(headingToRobot));
    double yE = yB + e.getDistance() * Math.cos(Math.toRadians(headingToRobot));
    double vE = e.getVelocity();
    double phiE = e.getHeading();
    // Konstanten A bis D bestimmen
    double A = (xE - xB) / vB;
    double B = vE / vB * Math.sin(Math.toRadians(phiE));
    double C = (yE - yB) / vB;
    double D = vE / vB * Math.cos(Math.toRadians(phiE));
    // Koeffizienten fuer quadratische Gleichung bestimmen
    double a = A*A + C*C;
    double b = 2*(A*B + C*D);
    double c = B*B + D*D - 1;
    // Diskriminante bestimmen
    double d = b*b - 4*a*c;
    if (d < 0) {
        // Keine Loesung vorhanden, Ende
        return;
    }
 
    // Loesungen bestimmen
    double t1 = 2*a / (-b + Math.sqrt(d));
    double t2 = 2*a / (-b - Math.sqrt(d));
    // Kleinste nicht negative Loesung suchen
    double t = 0;
    if (t1 >= 0 && t2 >= 0) {
        t = Math.min(t1, t2);
    }
    else if (t1 >= 0) {
        t = t1;
    }
    else if (t2 >= 0) {
        t = t2;
    }
    else {
        // keine positive Loesung
        return;
    }
 
    // Zukuenftige Koordinaten des Gegners bestimmen
    double x = xE + vE * t * Math.sin(Math.toRadians(phiE));
    double y = yE + vE * t * Math.cos(Math.toRadians(phiE));
    // Gegner kann Spielfeld nicht verlassen
    x = Math.max(ROBOT_WIDTH, Math.min(x, getBattleFieldWidth() - ROBOT_WIDTH));
    y = Math.max(ROBOT_HEIGHT, Math.min(y, getBattleFieldHeight() - ROBOT_HEIGHT));
    double aimAt = Math.toDegrees(Math.atan2(x - xB, y - yB));
    turnGunRight(Utils.normalRelativeAngleDegrees(aimAt - getGunHeading()));
    fire(FIREPOWER);
}
robocode/target-linear-1.txt · Zuletzt geändert: 2020/10/13 14:25 von 127.0.0.1