Excession/DiveBomber
Jump to navigation
Jump to search
A Drone by User:Excession
package excession.drones;
import static java.lang.Math.PI;
import static java.lang.Math.atan2;
import static java.lang.Math.sqrt;
import static java.lang.Math.toRadians;
import static robocode.util.Utils.normalRelativeAngle;
import robocode.AdvancedRobot;
import robocode.ScannedRobotEvent;
/**
* A drone that spirals in towards and then circles its enemy and fires pot
* shots.
*
* @author Excession
* @version 1.0, 2008-06-04
*/
public class SpiralCircle extends AdvancedRobot {
private int direction = 1;
private void init() {
setAdjustRadarForRobotTurn(true);
setAdjustGunForRobotTurn(true);
setAdjustRadarForGunTurn(true);
}
@Override
public void run() {
init();
setTurnRadarRightRadians(2 * PI);
while (true) {
execute();
}
}
@Override
public void onScannedRobot(ScannedRobotEvent event) {
lockOnTarget(event);
aimAndFire(event);
move(event);
}
private void move(ScannedRobotEvent event) {
double bearing = event.getBearingRadians();
double r = event.getDistance();
if (getVelocity() == 0.0) {
direction *= -1;
}
final double SPEED = 20.0;
final double DISTANCE_MAX = 50;
final double DISTANCE_MIN = 40;
double spiral = 0;
if (r > DISTANCE_MAX) {
spiral = toRadians(45);
} else if (r < DISTANCE_MIN) {
spiral = toRadians(-5);
}
double d = SPEED;
final double b = sqrt(r * r - (d * d) / 4);
double alpha = atan2(b, (d / 2));
double tankTurn = bearing - alpha + spiral * direction;
setTurnRightRadians(tankTurn);
setAhead(d * direction);
}
/**
* @see http://testwiki.roborumble.org/w/index.php?title=Radar#Wide_lock
*/
private void lockOnTarget(ScannedRobotEvent event) {
double absoluteBearing = getHeadingRadians() + event.getBearingRadians();
double radarTurn = normalRelativeAngle(absoluteBearing - getRadarHeadingRadians());
double arcToScan = Math.min(Math.atan(36.0 / event.getDistance()), PI / 4.0);
radarTurn += (radarTurn < 0) ? -arcToScan : arcToScan;
setTurnRadarRightRadians(radarTurn);
}
private void aimAndFire(ScannedRobotEvent event) {
double absoluteBearing = getHeadingRadians() + event.getBearingRadians();
double gunTurn = normalRelativeAngle(absoluteBearing - getGunHeadingRadians());
setTurnGunRightRadians(gunTurn);
final double power = 3.0;
if (getGunHeat() == 0.0) {
setFire(power);
}
}
}