|
To infinity and beyond! |
Here is the code. could comeone tell me what is wrong and why it just shoots in random directions?Adviceplease put advice here --Bayen The Code
And here is the Virtual BulletClass?
|
please put advice here --Bayen
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) ) );
}
}