Informatikunterricht

am Gymnasium Kirchenfeld

Benutzer-Werkzeuge

Webseiten-Werkzeuge


robocode:target-linear-1

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
robocode:target-linear-1 [2015/03/23 08:26] rosrobocode:target-linear-1 [2020/10/13 14:25] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 2: Zeile 2:
  
 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. 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.
 +
 +{{robocode.pdf|Die Mathematik}} (PDF)
  
 <code java> <code java>
 public void onScannedRobot(ScannedRobotEvent e) { 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();     double headingToRobot = getHeading() + e.getBearing();
-    double lateralMovement = e.getVelocity() * Math.sin(Math.toRadians(e.getHeading() - headingToRobot)); +    // Bekannte Werte bestimmen 
-    double aimAt headingToRobot + Math.toDegrees(lateralMovement 13.0);+    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 (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()));     turnGunRight(Utils.normalRelativeAngleDegrees(aimAt - getGunHeading()));
-    fire(3);+    fire(FIREPOWER);
 } }
 </code> </code>
  
robocode/target-linear-1.1427095609.txt.gz · Zuletzt geändert: 2020/10/13 14:25 (Externe Bearbeitung)