[Home]Plains/Code

Robo Home | Plains | Changes | Preferences | AllPages

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

Robo Home | Plains | Changes | Preferences | AllPages
Edit revision 3 of this page | View other revisions | View current revision
Edited January 12, 2008 23:52 EST by Starrynte (diff)
Search: