|
Version 1.0: |
|
Version 1.1:
|
// (C) 2007 Stelokim
// nanobot using wave for targeting
package stelo;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.*;
import robocode.*;
import robocode.util.Utils;
public class FretNano extends AdvancedRobot {
// private double moveAmount = 100;
private static double enemyVelocity;
// private static double lastEnemyVelocity;
// private static double enemyDistance;
// private static int velocities_size;
public void run() {
setAdjustGunForRobotTurn(true);
//setAdjustRadarForGunTurn(true);
//do {
turnRadarRightRadians(Double.POSITIVE_INFINITY);
//} while (true);
}
public void onScannedRobot(ScannedRobotEvent e) {
double absbearing = e.getBearingRadians() + getHeadingRadians();
enemyVelocity = e.getVelocity();
// enemyDistance = e.getDistance();
setTurnRightRadians(Math.cos(e.getBearingRadians()));
//setTurnRadarRightRadians(Utils.normalRelativeAngle(absbearing - getRadarHeadingRadians()) * 2); // 2 original
// out.println(e.getVelocity() + " " + getTime());
setTurnRadarLeftRadians(getRadarTurnRemainingRadians());
VirtualBullet vb = new VirtualBullet(this, e.getDistance());
addCustomEvent(vb);
// setTurnGunRightRadians(Utils.normalRelativeAngle(absbearing - getGunHeadingRadians() + vb.mostVisitedVelocity() / 11.0 * Math.sin(e.getHeadingRadians() - absbearing)));
setTurnGunRightRadians(Utils.normalRelativeAngle(absbearing - getGunHeadingRadians() + VirtualBullet.guessedVelocity / 11.0 * Math.sin(e.getHeadingRadians() - absbearing)));
// setFire(3.0);
setFire(e.getEnergy() / 4.0);
// move
setAhead(Math.tan(e.getEnergy()*5)*500); // Perceptual bullet-dodger
// setAhead(moveAmount);
// if (Math.random() < 0.04)
// moveAmount = -moveAmount;
// if (!(new Rectangle2D.Double(18, 18, 800-36, 600-36)).contains(Math.sin(absbearing = getHeadingRadians())*moveAmount + getX(),Math.cos(absbearing)*moveAmount + getY()))
// moveAmount = -moveAmount;
// if (enemyEnergy > (enemyEnergy = e.getEnergy() ) ) {
// setMaxVelocity( Math.random() * 30.0 + 2.0);
// if (Math.random() < 0.25)
// onHitWall(null);
// }
//lastEnemyAbsoluteBearing = absbearing;
// lastEnemyVelocity = enemyVelocity;
}
// public static double limit(double min, double value, double max) {
// return Math.max(min, Math.min(value, max));
// }
// public void onHitWall(HitWallEvent e) {
// moveAmount = -moveAmount;
// }
private static class VirtualBullet extends Condition {
// private static int BINS = 8 * 2 + 1;
// private static double[][][] statBuffer = new double[VELOCITY_INDEXES][VELOCITY_INDEXES][BINS];
// static double[] statBuffer = new double[BINS];
private long time = 0;
private double velocitySum = 0;
AdvancedRobot robot;
// private int velocityIndex;
static double guessedVelocity;
private double enemyDistance;
VirtualBullet(AdvancedRobot _robot, double _enemyDistance) {
robot = _robot;
enemyDistance = _enemyDistance;
// buffer = statBuffer[(int) (velocity + 8)][(int) (velocity2 + 8)];
// velocityIndex = (int) (velocity + 8);
// buffer = statBuffer[(int) (velocity + 8)];
}
// public boolean test() {return false;}
public boolean test() {
time++;
velocitySum += enemyVelocity;
if (time * 11 > enemyDistance) {
// if (time > 32) {
guessedVelocity = velocitySum / time;
// statBuffer[velocityIndex] = enemyVelocity;
robot.removeCustomEvent(this);
// robot.out.println("arrived");
}
return false;
}
}
}
// (C) 2007 Stelokim
// nanobot using wave for targeting
// codesize 245
package stelo;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.*;
import robocode.*;
import robocode.util.Utils;
public class FretNano extends AdvancedRobot {
// private double moveAmount = 100;
// private static double enemyVelocity;
// private static double lastEnemyVelocity;
// private static double enemyDistance;
// private static int velocities_size;
private static double myX, myY, eX, eY;
private static AdvancedRobot robot;
public void run() {
robot = this;
// setAdjustGunForRobotTurn(true);
//setAdjustRadarForGunTurn(true);
//do {
turnRadarRightRadians(Double.POSITIVE_INFINITY);
//} while (true);
}
public void onScannedRobot(ScannedRobotEvent e) {
double absBearing = e.getBearingRadians() + getHeadingRadians();
double enemyDistance = e.getDistance();
eX = (myX = getX()) + enemyDistance * Math.sin(absBearing);
eY = (myY = getY()) + enemyDistance * Math.cos(absBearing);
setTurnRightRadians(Math.cos(e.getBearingRadians()));
setTurnRadarLeftRadians(getRadarTurnRemainingRadians());
addCustomEvent(new Wave(myX, myY, absBearing));
setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing - getGunHeadingRadians() + Wave.guessAngle));
setFire(2);
// setFire(e.getEnergy() / 4.0);
// move
setAhead(Math.tan(e.getEnergy()*5)*500); // Perceptual bullet-dodger
// setAhead(e.getVelocity() * 10); // pseudo-MirrorMovement
// if (Math.random() < 0.05 / 300.0 * enemyDistance)
// moveAmount = -moveAmount;
// if (!(new Rectangle2D.Double(18, 18, 800-36, 600-36)).contains(Math.sin(absBearing = getHeadingRadians())*moveAmount + getX(),Math.cos(absBearing)*moveAmount + getY()))
// moveAmount = -moveAmount;
// if (enemyEnergy > (enemyEnergy = e.getEnergy() ) ) {
// setMaxVelocity( Math.random() * 30.0 + 2.0);
// if (Math.random() < 0.25)
// onHitWall(null);
// }
//lastEnemyAbsoluteBearing = absBearing;
// lastEnemyVelocity = enemyVelocity;
}
// public static double limit(double min, double value, double max) {
// return Math.max(min, Math.min(value, max));
// }
// public void onHitWall(HitWallEvent e) {
// moveAmount = -moveAmount;
// }
static class Wave extends Condition {
// double bulletPower;
double gunX, gunY;
double bearing;
private double distanceTraveled;
static double guessAngle;
public Wave(double _gunX, double _gunY, double _bearing) {
gunX = _gunX;
gunY = _gunY;
bearing = _bearing;
}
public boolean test() {
// advance
// distanceTraveled += 20.0 - 3.0 * bulletPower;
double dx = eX - gunX, dy = eY - gunY;
// has arrived?
if ((distanceTraveled += 14) > Math.hypot(dx, dy)) {
guessAngle = Math.atan2(dx, dy) - bearing;
robot.removeCustomEvent(this);
}
return false;
}
}
}