package davidalves.sample; import robocode.*; import java.awt.Color; import java.awt.geom.Point2D; import robocode.util.Utils; public class CircularTargetingBot extends DrawingBot{ double oldEnemyHeading; public void run() { setAdjustRadarForGunTurn(true); do{ turnRadarRightRadians(Double.POSITIVE_INFINITY); } while(true); } public void onScannedRobot(ScannedRobotEvent e) { double bulletPower = Math.min(3.0, getEnergy()); double newEnemyHeading = Utils.normalAbsoluteAngle(e.getHeadingRadians()); double deltaEnemyHeading = Utils.normalRelativeAngle(newEnemyHeading - oldEnemyHeading); oldEnemyHeading = newEnemyHeading; Point2D.Double me = new Point2D.Double(getX(), getY()); Point2D.Double enemy = project(me, getHeadingRadians() + e.getBearingRadians(), e.getDistance()); double deltaTime = 1; double battleFieldHeight = getBattleFieldHeight(), battleFieldWidth = getBattleFieldWidth(); Point2D.Double predicted = (Point2D.Double) enemy.clone(); double predictedHeading = newEnemyHeading; while(deltaTime * (20.0 - 3.0 * bulletPower) < me.distance(predicted)){ deltaTime++; predictedHeading += deltaEnemyHeading; Point2D.Double newPredicted = project(predicted, predictedHeading, e.getVelocity()); newPredicted.x = Math.min(Math.max(18.0, newPredicted.x), battleFieldWidth - 18.0); newPredicted.y = Math.min(Math.max(18.0, newPredicted.y), battleFieldHeight - 18.0); drawLine(predicted, newPredicted, Color.RED); predicted = newPredicted; } drawLine(me, predicted, Color.GREEN); setTurnRadarRightRadians(Utils.normalRelativeAngle(angle(me, enemy) - getRadarHeadingRadians())); setTurnGunRightRadians(Utils.normalRelativeAngle(angle(me, predicted) - getGunHeadingRadians())); setFire(3); execute(); } public static Point2D.Double project(Point2D.Double origin, double angle, double distance){ return new Point2D.Double(origin.x + distance * Math.sin(angle), origin.y + distance * Math.cos(angle)); } public static double angle(Point2D.Double origin, Point2D.Double destination){ return Utils.normalAbsoluteAngle(Math.atan2(destination.x - origin.x, destination.y - origin.y)); } }