package ntc;
import robocode.*;
//import java.util.Random;
public class Plains extends AdvancedRobot
{
static private final double HALF_PI = Math.PI / 2;
static private double lastEnergy=100,curEnergy=100,enemyGunHeat=100,turnAngle=0,favDistance,tryAmt=144;
static private java.awt.geom.Rectangle2D.Double _fieldRect = new java.awt.geom.Rectangle2D.Double(18, 18,
724, 564);
static private double[] energygain=new double[2];
// static Random random=new Random();
static boolean frontTried=false,backTried=false;
static int timeSinceLastChanged=50;
// java.awt.geom.Point2D.Double projectedPos=new java.awt.geom.Point2D.Double();
public void run(){
tryAmt=144d;
favDistance=0d;
setAdjustRadarForGunTurn(true);
setAdjustGunForRobotTurn(true);
setTurnRadarRight(Double.POSITIVE_INFINITY);
while(true){
double delta=lastEnergy-curEnergy;
//out.println(delta);
if(delta<=3.01 && delta>=0.09){
gain(delta);
double newVel=(Math.random()*40d) - 20d;
// out.println(newVel);
setMaxVelocity(Math.abs(newVel));
setAhead(newVel*Double.POSITIVE_INFINITY);
}
timeSinceLastChanged--;
if(timeSinceLastChanged<=0){
if(frontTried && backTried){
// out.print("Best distance is ");
if(energygain[0]>=energygain[1]){
favDistance+=tryAmt*2;
// out.println(favDistance + " since energygain[0] (" + ((int)energygain[0]) + ") > energygain[1] (" + ((int)energygain[1]) + ")");
}else{
// out.println(favDistance + " since energygain[1] (" + ((int)energygain[1]) + ") > energygain[0] (" + ((int)energygain[0]) + ")");
}
energygain[0]=energygain[1]=0;
tryAmt/=2;
frontTried=backTried=false;
timeSinceLastChanged=120;
execute();
}
if(!frontTried){
favDistance=Math.min(favDistance+=tryAmt,800);
frontTried=true;
// out.println("Trying distance " + favDistance);
}else{
favDistance=Math.max(favDistance-=tryAmt*2,50);
backTried=true;
// out.println("Trying distance " + favDistance);
}
timeSinceLastChanged=120;
}
execute();
}
}
public void onScannedRobot(ScannedRobotEvent e){
if(favDistance==0d){ favDistance=e.getDistance(); }
double absBearing=e.getBearingRadians()+getHeadingRadians(),distanceChangeAngle,power=Math.min(e.getEnergy()/4,getEnergy()/10),x=getX(),y=getY(),latVel=Math.signum(getVelocity()*Math.sin(e.getBearingRadians()));
setTurnRadarLeft(getRadarTurnRemaining());
lastEnergy=curEnergy;
curEnergy=e.getEnergy();
turnAngle=robocode.util.Utils.normalAbsoluteAngle(
absBearing
+HALF_PI
+(distanceChangeAngle=(
(Math.abs(favDistance-e.getDistance())>tryAmt/2) ?
HALF_PI*
(Math.random()/2)*
latVel*
Math.signum(e.getDistance()-favDistance)
:
0)))
;
int moveDir=(int)Math.signum(-latVel+0.000001);
while(!_fieldRect.contains(x+(Math.sin(turnAngle)*180*moveDir),y+(Math.cos(turnAngle)*180*moveDir))){
turnAngle=robocode.util.Utils.normalAbsoluteAngle(turnAngle*(-moveDir*0.3 + 1));
//out.println(turnAngle);
//out.println((Math.signum(latVel+0.0001)*0.1 + 1));
}
// projectedPos.setLocation(x+(Math.sin(turnAngle)*180*moveDir),y+(Math.cos(turnAngle)*180*moveDir));
setTurnRightRadians(robocode.util.Utils.normalRelativeAngle(turnAngle-getHeadingRadians()));
setTurnGunRightRadians(
robocode.util.Utils.normalRelativeAngle(
absBearing-getGunHeadingRadians()
));
if(setFireBullet(power)!=null){
gain(-power);
}
}
public void onBulletHit(BulletHitEvent e){
double power=e.getBullet().getPower();
gain(power*3 + (power*4 + (2*Math.max(1,power-1))));
}
public void onHitByBullet(HitByBulletEvent e){
double power=e.getPower();
gain(-(power*4 + (2*Math.max(1,power-1)) + power*3));
}
public void onHitRobot(HitRobotEvent e){
double newVel=(Math.random()*40d)-20d;
setMaxVelocity(Math.abs(newVel));
setAhead(newVel*Double.POSITIVE_INFINITY);
}
void gain(double energychange){
if(frontTried && !backTried){
energygain[0]+=energychange;
}else if(backTried){
energygain[1]+=energychange;
}
}
// public void onPaint(java.awt.Graphics2D g){
// g.fillOval((int)projectedPos.getX(),(int)projectedPos.getY(),11,11);
// }
}