robocode:target-linear-1
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| robocode:target-linear-1 [2015/03/23 08:26] – ros | robocode: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, | Wenn sich der gegnerische Roboter bewegt, befindet er sich nicht mehr am gleichen Ort, wenn das Geschoss diesen erreicht. Ein Ansatz ist, auszurechnen, | ||
| + | |||
| + | {{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 | + | |
| - | double | + | |
| + | 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 | ||
| + | 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, | ||
| + | } | ||
| + | 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, | ||
| + | y = Math.max(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); |
| } | } | ||
| </ | </ | ||
robocode/target-linear-1.1427095609.txt.gz · Zuletzt geändert: 2020/10/13 14:25 (Externe Bearbeitung)