import robocode.*; import robocode.util.*; import java.awt.geom.*; public class ChallengerBot extends AdvancedRobot{ WaylanderGun waylanderGun; public void run(){ waylanderGun = new WaylanderGun(this); //your code here } public void onScannedRobot(ScannedRobotEvent e){ //your code here waylanderGun.onScannedRobot(e); } } class WaylanderGun { final static double angleScale = 24; final static double velocityScale = 1; static double lastEnemyHeading; static boolean firstScan; static StringBuilder data = new StringBuilder(); AdvancedRobot bot; public WaylanderGun(AdvancedRobot bot){ this.bot = bot; firstScan = true; try{ data.delete(60000, 80000); } catch(StringIndexOutOfBoundsException e){} } public void onScannedRobot(ScannedRobotEvent e) { double headingRadians; double eDistance ; double eHeadingRadians = e.getHeadingRadians(); double absbearing=e.getBearingRadians()+ (headingRadians = bot.getHeadingRadians()); boolean rammer = (eDistance = e.getDistance()) < 100 || bot.getTime() < 20; Rectangle2D.Double field = new Rectangle2D.Double(17,17,766,566); if(!firstScan) data.insert(0,(char)((eHeadingRadians - lastEnemyHeading )*angleScale)) .insert(0,(char)(e.getVelocity()*velocityScale)); int keyLength = Math.min(data.length(), Math.min(Math.max(2,(int)bot.getTime()*2 - 8), 256)); int index = -1; do{ index = data.indexOf(data.substring(0, keyLength),(int)eDistance/11)/2; }while(index <= 0 && (keyLength/=2) > 1); double bulletPower = rammer?3:Math.min(2,Math.min(bot.getEnergy()/16, e.getEnergy()/2)); double eX=eDistance*Math.sin(absbearing); double eY=eDistance*Math.cos(absbearing); double db=0; double ww=eHeadingRadians; double speed = e.getVelocity(); double w = eHeadingRadians - lastEnemyHeading; do { if( index > 1 ){ speed = (short)data.charAt(index*2 ); w = ((short)data.charAt(index--*2 - 1))/angleScale; } }while ((db+=(20-3*bulletPower))< Point2D.distance(0,0,eX+= (speed*Math.sin(ww+=w)),eY+= (speed*Math.cos(ww))) && field.contains(eX + bot.getX() , eY + bot.getY())); bot.setTurnGunRightRadians(Utils.normalRelativeAngle(Math.atan2(eX,eY) - bot.getGunHeadingRadians())); bot.setFire(bulletPower); bot.setTurnRadarRightRadians(Math.sin(absbearing - bot.getRadarHeadingRadians())*2); lastEnemyHeading=eHeadingRadians; firstScan = false; } }