package ntc; import robocode.*; import java.awt.geom.*; import java.awt.Color; public class Plains extends AdvancedRobot { static private final double HALF_PI = Math.PI / 2; static private double lastEnergy,curEnergy,favDistance,tryAmt,myPrevEnergy,dist; static private final Rectangle2D.Double _fieldRect = new Rectangle2D.Double(18, 18, 724, 564); static private double[] energygain=new double[2]; static private boolean tryingBack; static private int timeSinceLastChanged; // double tempX,tempY; public void run(){ tryAmt=144d; timeSinceLastChanged=50; energygain=new double[2]; tryingBack=false; setAdjustRadarForGunTurn(true); setAdjustGunForRobotTurn(true); setTurnRadarRight(Double.POSITIVE_INFINITY); while(true){ double delta=lastEnergy-curEnergy; if(delta<=3.01 && delta>=0.09){ move(0); } if(--timeSinceLastChanged<=0){ if(!tryingBack){ favDistance=Math.min(favDistance+=tryAmt*2d,575d); tryingBack=true; // out.println("Trying distance " + favDistance); }else{ favDistance=Math.max(favDistance-=tryAmt*2.5,200d); // backTried=true; // out.println("Trying distance " + favDistance); // out.print("Best distance is "); if(energygain[1]>=energygain[0]){ favDistance+=tryAmt*2d; } // 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; tryingBack=false; timeSinceLastChanged=120; } timeSinceLastChanged=Math.max(100,(int)tryAmt*2); } if(Math.abs(dist-favDistance)<=tryAmt/2){ energygain[(tryingBack)?1:0]+=getEnergy()-myPrevEnergy+delta; } myPrevEnergy=getEnergy(); execute(); } } public void onScannedRobot(ScannedRobotEvent e){ dist=e.getDistance(); if(favDistance==0d){ favDistance=dist; } double absBearing=e.getBearingRadians()+getHeadingRadians(),vel=Math.signum(getVelocity()),turnAngle; setTurnRadarLeft(getRadarTurnRemaining()); lastEnergy=curEnergy; curEnergy=e.getEnergy(); double diff=favDistance-dist; turnAngle=robocode.util.Utils.normalAbsoluteAngle( absBearing +HALF_PI *(( (Math.abs(diff)>tryAmt/2) ? 1d+ Math.random()* Math.signum(diff)* vel : 1d))) ; // tempX=x+Math.sin(absBearing)*dist; // tempY=y+Math.cos(absBearing)*dist; double stick=200d*vel; for(int i=1;!_fieldRect. contains( getX() + stick*Math.sin(turnAngle+=Math.signum(vel*Math.sin(e.getBearingRadians()))*i/500d), getY() + stick*Math.cos(turnAngle) ) && i<500 && (((Math.abs(absBearing-turnAngle)<0.4 || i==499) ? move((int)(-getVelocity())):true)); i++); setTurnRightRadians(robocode.util.Utils.normalRelativeAngle(turnAngle-getHeadingRadians()));//out.println("Line 106"); setTurnGunRightRadians( robocode.util.Utils.normalRelativeAngle( absBearing-getGunHeadingRadians() )); setFire(Math.min(e.getEnergy()/4,getEnergy()/10)); } public void onHitRobot(HitRobotEvent e){ move(0); } public boolean move(int dir){ double newVel=(Math.random()*41d) - 21d; setMaxVelocity(Math.abs(newVel)+1d); setAhead(((dir==0) ? newVel:dir)*Double.POSITIVE_INFINITY); return false; } /* public void onPaint(java.awt.Graphics2D g){ double distance=Point2D.Double.distance(tempX,tempY,getX(),getY()); g.drawOval((int)(tempX-distance),(int)(tempY-distance),(int)(distance*2),(int)(distance*2)); g.setColor(Color.GREEN); g.drawOval((int)(tempX-favDistance),(int)(tempY-favDistance),(int)(favDistance*2),(int)(favDistance*2)); g.setColor(new Color(0,150,0)); g.drawOval((int)(tempX-favDistance-(tryAmt/2)),(int)(tempY-favDistance-(tryAmt/2)),(int)((tryAmt/2+favDistance)*2),(int)((tryAmt/2+favDistance)*2)); g.drawOval((int)(tempX-favDistance+(tryAmt/2)),(int)(tempY-favDistance+(tryAmt/2)),(int)((favDistance-(tryAmt/2))*2),(int)((favDistance-(tryAmt/2))*2)); } */ }