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