====== 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. {{robocode.pdf|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); }