Current codesize is: 731
The BackAsFront code I found in Cigaret. And Kawigi has helped me shrink some of my utility functions. -- PEZ
package pez.micro;
import robocode.*;
import java.awt.geom.*;
import java.awt.Color;
// BlackWidow - Small, black, shiny and deadly - By PEZ
//
// BlackWidow is open source under GPL-like conditions. Meaning you can use
// the code. Meaning you should feel obliged to share any improvements you do
// to the code. Meaning you must release your bots code if you directly use this
// code.
//
// Home page of this bot is: http://robowiki.dyndns.org/?BlackWidow
// The code should be available there and it is also the place for you to share any
// code improvements.
//
// $Id: BlackWidow.java,v 1.4 2003/04/24 16:30:59 peter Exp $
public class BlackWidow extends AdvancedRobot {
private static Point2D location = new Point2D.Double();
private static Point2D oldLocation = new Point2D.Double();
private static Point2D enemyLocation = new Point2D.Double();
private static Point2D oldEnemyLocation = new Point2D.Double();
private static Point2D bulletLocation = new Point2D.Double();
private static Rectangle2D fieldRectangle;
private static Bullet bullet;
private static double enemyDistance;
private static double enemyEnergy;
private static double enemyBearing;
private static double enemyBearingOffset;
private static double velocity = 8;
public void run() {
fieldRectangle = new Rectangle2D.Double(0, 0 , getBattleFieldWidth(), getBattleFieldHeight());
setColors(Color.black, Color.black, Color.red);
setAdjustGunForRobotTurn(true);
setTurnRadarRightRadians(Double.POSITIVE_INFINITY);
do {
location.setLocation(getX(), getY());
try {
if (oldLocation.distance(new Point2D.Double(bullet.getX(), bullet.getY())) >
oldLocation.distance(enemyLocation) || !bullet.isActive()) {
enemyBearingOffset = absoluteBearing(oldLocation, enemyLocation) -
absoluteBearing(oldLocation, oldEnemyLocation);
bullet = null;
}
shoot();
}
catch (Exception e) {
bullet = shoot();
oldLocation.setLocation(location);
oldEnemyLocation.setLocation(enemyLocation);
}
execute();
} while (true);
}
public void onScannedRobot(ScannedRobotEvent e) {
enemyDistance = e.getDistance();
enemyBearing = getHeadingRadians() + e.getBearingRadians();
enemyEnergy = e.getEnergy();
setLocationRelative(location, enemyDistance, getHeadingRadians() + e.getBearingRadians(), enemyLocation);
setTurnGunRightRadians(normalRelativeAngle(enemyBearing +
enemyBearingOffset * (-0.5 + Math.random() * 1.5) - getGunHeadingRadians()));
move();
}
private Bullet shoot() {
if (getEnergy() > 0.2) {
return setFireBullet(Math.min(getEnergy() / 3, enemyEnergy / 4));
}
return bullet;
}
private void move() {
if (Math.random() < 0.05) {
velocity = Math.min(8, Math.random() * 24);
}
setMaxVelocity(Math.abs(getTurnRemaining()) > 45 ? 0.1 : velocity);
if (Math.abs(getDistanceRemaining()) < 40) {
Point2D destination = new Point2D.Double();
double distanceExtra = 3;
if (enemyDistance > 475) {
distanceExtra = -2;
}
double relativeAngle = Math.PI / -4 + Math.random() * Math.PI / 2;
distanceExtra *= Math.abs(relativeAngle) * 40;
setLocationRelative(enemyLocation, enemyDistance + distanceExtra, enemyBearing + Math.PI + relativeAngle, destination);
if (!fieldRectangle.contains(destination)) {
setLocationRelative(enemyLocation, enemyDistance + distanceExtra, enemyBearing + Math.PI - relativeAngle, destination);
}
translateInsideField(destination);
double angle = normalRelativeAngle(absoluteBearing(location, destination) - getHeadingRadians());
int direction = 1;
if (Math.abs(angle) > Math.PI / 2) {
angle += Math.acos(direction = -1);
}
setTurnRightRadians(normalRelativeAngle(angle));
setAhead(location.distance(destination) * direction);
}
}
private void translateInsideField(Point2D point) {
point.setLocation(Math.max(45, Math.min(fieldRectangle.getWidth() - 45, point.getX())),
Math.max(45, Math.min(fieldRectangle.getHeight() - 45, point.getY())));
}
private void setLocationRelative(Point2D sourceLocation, double length, double angle, Point2D targetLocation) {
targetLocation.setLocation(sourceLocation.getX() + Math.sin(angle) * length,
sourceLocation.getY() + Math.cos(angle) * length);
}
private double absoluteBearing(Point2D source, Point2D target) {
return Math.atan2(target.getX() - source.getX(), target.getY() - source.getY());
}
private double normalRelativeAngle(double angle) {
return Math.atan2(Math.sin(angle), Math.cos(angle));
}
}