/**
*
*/
package rampancy.mini;
import java.awt.Color;
import java.awt.geom.Point2D;
import java.util.*;
import rampancy.util.RPoint;
import rampancy.util.RUtil;
import robocode.*;
import robocode.util.Utils;
/**
* @author Matthew Chun-Lum
*
*/
public class BackAndForthKiller extends AdvancedRobot {
private HashMap<String, Enemy> yLocations;
private ArrayList<String> deadBots;
private double desiredGunAngle;
private int wallDir;
private boolean hitWall;
int shotCount = 0;
public void run() {
setColors(Color.RED, Color.RED, Color.RED);
setAdjustGunForRobotTurn(true);
setAdjustRadarForGunTurn(true);
setAdjustRadarForRobotTurn(true);
hitWall = false;
yLocations = new HashMap<String, Enemy>();
deadBots = new ArrayList<String>();
wallDir = 1;
if(getX() < getBattleFieldWidth() / 2.0) {
wallDir = -1;
}
double gunTurnAngle = wallDir == 1 ? 3 * Math.PI / 2 : Math.PI / 2;
desiredGunAngle = gunTurnAngle;
setTurnGunRightRadians(desiredGunAngle - getGunHeadingRadians());
while(getRadarTurnRemainingRadians() == 0) {
setTurnRadarLeftRadians(3 * Math.PI);
}
}
public void onScannedRobot(ScannedRobotEvent e) {
if(!deadBots.contains(e.getName())) {
RPoint loc = new RPoint(getX(), getY());
double absB = Utils.normalAbsoluteAngle(e.getBearingRadians() + getHeadingRadians());
loc = RUtil.project(loc, absB, e.getDistance());
yLocations.put(e.getName(), new Enemy(e.getName(),loc.y));
}
double closestDist = 50000;
double closestY = 5000;
String closestName = "";
double myY = getY();
for(Enemy enemy : yLocations.values()) {
if(Math.abs(enemy.yLoc - myY) < closestDist) {
closestDist = Math.abs(enemy.yLoc - myY);
closestY = enemy.yLoc;
closestName = enemy.name;
}
}
if(!hitWall) {
if(Math.PI / 2 - getHeadingRadians() != 0) {
setTurnRightRadians(Math.PI / 2 - getHeadingRadians());
} else {
setAhead(5000 * wallDir);
}
} else if(getGunHeadingRadians() == desiredGunAngle) {
if(Math.abs(myY - closestY) < 2) {
if(setFireBullet(3.0) != null) {
shotCount++;
if(shotCount * 16 >= 100) {
shotCount = 0;
yLocations.remove(closestName);
deadBots.add(closestName);
}
}
} else {
setAhead(closestY - myY);
}
} else if(getGunHeadingRadians() != desiredGunAngle) {
setTurnGunRightRadians(desiredGunAngle - getGunHeadingRadians());
}
setTurnRadarLeftRadians(3 * Math.PI);
}
public void onHitWall(HitWallEvent e) {
if(!hitWall) {
setAhead(0);
setTurnRightRadians(0 - getHeadingRadians());
hitWall = true;
}
}
public void onHitRobot(HitRobotEvent e) {
if(!hitWall) {
if(!deadBots.contains(e.getName())) {
deadBots.add(e.getName());
yLocations.remove(e.getName());
}
setTurnGunRightRadians(Utils.normalRelativeAngle(e.getBearingRadians() + getHeadingRadians() - getGunHeadingRadians()));
setFireBullet(3);
}
}
}
class Enemy {
public String name;
public double yLoc;
public Enemy(String name, double yLoc) {
this.name = name;
this.yLoc = yLoc;
}
}