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;
}
}