package tormentor; import robocode.*; import java.awt.Color; /** * TheTormentor - a robot by Robert Widdick */ public class TheTormentor extends Robot { double oldEnergy = 0; double newEnergy = 0; public void run() { setBodyColor(Color.black); setGunColor(new Color(0, 0, 0)); setRadarColor(new Color(200, 200, 70)); setScanColor(Color.white); setBulletColor(Color.blue); addCustomEvent(new Condition("bulletfired") { public boolean test() { double delta = oldEnergy - newEnergy; oldEnergy = newEnergy; return delta >= 0.1 && delta <= 3; }; } setAdjustRadarForRobotTurn(true); while(true) { turnGunRight(360); // manipulative stuff here :> } } public void onScannedRobot(ScannedRobotEvent e) { turnLeft( smallestToParallel(90 - e.getBearing())); newEnergy = e.getEnergy(); turnRadarRight(normalRelativeAngle(e.getBearing() + getHeading() - getRadarHeading())); turnGunRight(normalRelativeAngle(e.getBearing() + (getHeading() - getRadarHeading()))); fire(3); scan(); } public void onCustomEvent(CustomEvent e) { if (e.getCondition().getName().equals("bulletfired")) setAhead(distance); } public void onHitRobot(HitRobotEvent e) { turnRight(e.getBearing()); if (e.getEnergy() > 16) fire(3); else if (e.getEnergy() > 10) fire(2); else if (e.getEnergy() > 4) fire(1); else if (e.getEnergy() > 2) fire(.5); else if (e.getEnergy() > .4) fire(.1); ahead(40); } public void onHitWall(HitWallEvent e) { distance *= -1; ahead(distance); } public void onHitByBullet(HitByBulletEvent e) { turnLeft(smallestToParallel(90 - e.getBearing())); ahead(distance); scan(); } public void onWin() { if (getOthers() == 0) { setMaxVelocity(5); setTurnGunRight(10000); while(true) { ahead(20); back(20); if (getEnergy() > 0.1) fire(0.1); } } } public double normalAbsoluteAngle(double angle) { if (angle >= 0 && angle < 360) return angle; double fixedAngle = angle; while (fixedAngle < 0) fixedAngle += 360; while (fixedAngle >= 360) fixedAngle -= 360; return fixedAngle; } public double normalRelativeAngle(double angle) { if (angle > -180 && angle <= 180) return angle; double fixedAngle = angle; while (fixedAngle <= -180) fixedAngle += 360; while (fixedAngle > 180) fixedAngle -= 360; return fixedAngle; } public double smallestToParallel(double angle) { if (angle > -90 && angle <= 90) return angle; double fixedAngle = angle; while (fixedAngle <= -90) fixedAngle += 180; while (fixedAngle > 90) fixedAngle -= 180; return fixedAngle; } }