[Home]UbaGfSource

Robo Home | Changes | Preferences | AllPages

No diff available--this is the first major revision. (minor diff)
Here is the code. could comeone tell me what is wrong and why it just shoots in random directions?

Advice

please put advice here --Bayen

The Code

package bayen;
import robocode.*;
import java.awt.Color;
import java.awt.geom.Point2D;
import robocode.util.Utils;

/**
 * Uba - a robot by Bayen
 */
public class UbaGF extends AdvancedRobot
{
	static double FORWARD = 1;//choose forward or backward
	static double rand = 185;//a random number that changes
	int k = 0;
	static int[] factor = new int[11];
	static int best = 5;
	static VBullet[][] vb = new VBullet[11][1000];
	/**
	 * CrazyTracker2's run method
	 */
	public void run() {
		setColors(Color.yellow,Color.blue,Color.yellow);
		setAdjustGunForRobotTurn(true);//allow gun and radar
		setAdjustRadarForGunTurn(true);//free movement
		int j = 0;
		int m = 0;
			while(j < 11){
				
				j++;
			}
		while (true)
		{
			turnRadarRight(360);//scan for enemies
		}
	}
	/**
	 * onScannedRobot:  We have a target.  Go get it.
	 */
	public void onScannedRobot(ScannedRobotEvent e) {
//here I use an oscillating movement pattern, but
//I use a constant "rand" that I change randomly
//so that Patternmatchers can't lock onto me
if (getDistanceRemaining() == 0) { FORWARD =
	-FORWARD; setAhead(rand * FORWARD);}
setTurnRightRadians(e.getBearingRadians()
+Math.PI/2-0.5236*FORWARD
*(e.getDistance()>200?1:-1));
//here I get my enemy's statistics so that I can use
//linear targeting
		double bulletPower = Math.min(3.0,getEnergy());
		double myX = getX();
		double myY = getY();
		double absoluteBearing =
		 getHeadingRadians() + e.getBearingRadians();
		double enemyX = getX() 
		+ e.getDistance() * Math.sin(absoluteBearing);
		double enemyY = getY() 
		+ e.getDistance() * Math.cos(absoluteBearing);
		double enemyHeading = e.getHeadingRadians();
		double enemyVelocity = 8;
		double deltaTime = 0;
double battleFieldHeight=
getBattleFieldHeight(),battleFieldWidth=
getBattleFieldWidth();
		double predictedX = enemyX, predictedY = enemyY;
while((++deltaTime)*(20.0
- 3.0*bulletPower)
<Point2D.Double.distance(myX, myY, predictedX, predictedY)){
		predictedX += Math.sin(enemyHeading) 
		* enemyVelocity;	
		predictedY += Math.cos(enemyHeading) 
		* enemyVelocity;
			if(	predictedX < 18.0 
				|| predictedY < 18.0
				|| predictedX > battleFieldWidth - 18.0
				|| predictedY > battleFieldHeight - 18.0){
predictedX = 
Math.min(Math.max(18.0, predictedX), battleFieldWidth 
- 18.0);	
predictedY = 
Math.min(Math.max(18.0, predictedY), battleFieldHeight
- 18.0);
				break;}}
double theta =
Utils.normalAbsoluteAngle(Math.atan2(predictedX
- getX(), predictedY - getY()));
double maxbearing = Math.abs(theta);
double bearingrange = Math.abs((maxbearing-getRadarHeadingRadians()) * 2);
double slice = bearingrange / 11;
k++;
if(k == 1000)
k=0;
				int i = 1;
		int dI = 4;
		if(e.getDistance() < 100)
		dI = 1;
		else if(e.getDistance()< 200)
		dI = 2;
		else if(e.getDistance() < 300)
		dI = 3;
		int j = 0;
		double deltaslice = slice;
		while(j <= 10){
			deltaslice = i*slice;
			double ebearing;
ebearing=maxbearing - deltaslice;
vb[j][k] = 
new VBullet(e.getName(), i, dI, getX(), getY(),
ebearing, getTime(), bulletPower);
i++;
j++;
}
j = 0;
boolean[][] targetWasHit = new boolean[11][1000];
boolean[][] outOfRange = new boolean[11][1000];
int m = 0;
while(m < 1000){
	while(j < 11){
	if(vb[j][m]!=null){
	if(vb[j][m].targetWasHit(enemyX, enemyY, getTime())){
		factor[j] += 1;
}
}
	j++;
}
	m++;
	j=0;
}
i = 0;
j = 0;
while(i < 11){
	if(factor[i] > factor[j])
	j = i;
	i++;
}
best = j;
out.println("Best: "+(best + 1));
out.println("With: "+factor[best]);
double predictedAbsBearing;
predictedAbsBearing=maxbearing - best*slice;

setTurnRadarRightRadians
(Utils.normalRelativeAngle(absoluteBearing 
- getRadarHeadingRadians()));
setTurnGunRightRadians(Utils.normalRelativeAngle(predictedAbsBearing
- getGunHeadingRadians()));
//...and fire!
		fire(3);
	}
	/**
	 * onHitByBullet: Randomize my movement
	 */
	public void onHitByBullet(HitByBulletEvent e) {
		//change my movement to throw off patternmatchers
		rand += Math.random()*50*FORWARD;
}

}

And here is the Virtual BulletClass?

package bayen;

class VBullet {
	String targetName;
	int guessIndex;				//represents the Guess Factor used
	int distanceIndex;			//represents the distance range
	double originX;				//the location where the VBullet was fired from
	double originY;
	double absBearing;			//and on which heading (0.0 up, +ve clockwise)
	long time;					//and at which time
	double power;				//and at what power
	
	VBullet (String targetName, int guessIndex, int distanceIndex,
		double originX, double originY, double absBearing, long time, double power) {
		this.targetName = targetName;
		this.guessIndex = guessIndex;
		this.distanceIndex = distanceIndex;
		this.originX = originX;
		this.originY = originY;
		this.absBearing = absBearing;
		this.time = time;
		this.power = Math.max(0.1,Math.min(3.0,power));
		}
	
	public String toString() {		//useful for debugging
		return ("targetName= "+targetName+"   guessIndex= "+guessIndex+"   distanceIndex= "+distanceIndex+"   originX = "+originX+"   originY = "+originY+"   absBearing = "+absBearing+"   time = "+time+"   power = "+power);
	}
	
	public double distance(double now) {  //double because targetWasHit uses double
		return (now - time) * (20.0 - 3.0*power);		//return the distance the bullet is away from the origin at the specified time
	}
	
	public double getX(double now) {		//returns the x position of the bullet at a particular time
		return originX + Math.sin(absBearing)*distance(now);
	}				

	public double getY(double now) {		//returns the y position of the bullet at a particular time
		return originY + Math.cos(absBearing)*distance(now);
	}
	
	public boolean targetWasHit(double targetX, double targetY, long now) {		//for this target, at this time does the bullet come within 30 units of the target over the last tick			
		
		if (range(targetX,targetY,now) > 50.0) return false;  // if we are no where near return immediatly
		for (double fraction = 0.0; fraction<1.05; fraction+=0.1) {  //if we are close check 10 positions of the bullet to make sure it does not hop over the target
			if (range(targetX,targetY,now-fraction) < 30.0) return true;
		}
		return false;  //close but not close enough over the last tick
	}
	
	public boolean outOfRange(double targetX, double targetY, long now) {		//has the bullet traveled beyond the range of the enemy
		double targetFromOrigin = Math.sqrt((targetX-originX)*(targetX-originX)+(targetY-originY)*(targetY-originY));
		if (range(originX, originY, now) > targetFromOrigin+30.0) return true; else return false;  //if our bullet is 30 units further away than our target (from where the bullet eas fired from) it will never hit the target
	}
	
	public double range( double targetX, double targetY, double now) {		//the distance between the bullet and the target at the specified time.
		double xo = targetX-this.getX(now);
		double yo = targetY-this.getY(now);
		return Math.sqrt( ( (xo)*(xo) ) + ( (yo)*(yo) ) );
	}

}

Robo Home | Changes | Preferences | AllPages
Edit text of this page | View other revisions
Last edited December 30, 2005 18:20 EST by Bayen (diff)
Search: