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/16 16:51] rotherobocode: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) {
-    double absoluteBearing = getHeading() + e.getBearing(); +    final double FIREPOWER = 2.0; 
-    double lateralMovement = e.getVelocity() * Math.sin(Math.toRadians(e.getHeading() - absoluteBearing)); +    final double ROBOT_WIDTH = 16.0; 
-    double aimAt absoluteBearing + Math.toDegrees(lateralMovement 13.0); +    final double ROBOT_HEIGHT = 16.0; 
-    setTurnGunRight(Utils.normalRelativeAngle(aimAt - getGunHeading()); + 
-    setFire(3.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 (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);
 } }
 </code> </code>
  
robocode/target-linear-1.1426521112.txt.gz · Zuletzt geändert: 2020/10/13 14:25 (Externe Bearbeitung)