package ntc;
import robocode.*;
import robocode.util.Utils;
import java.util.*;
import java.awt.geom.*;
/**
* SimpleATBot - a robot by Starrynte
* Demonstrates AreaTargeting with a simple MinimumRiskMovement
* Changes
* 0.1
* Created!
*
*/
public class SimpleATBot extends AdvancedRobot
{
static Hashtable enemies=new Hashtable();
static double segment;
static Point2D.Double lastPosition,myPos,nextDestination;
public void run() {
setTurnRadarRightRadians(Double.POSITIVE_INFINITY);
segment=(Math.PI*2)/(getOthers()*3);
lastPosition=myPos=nextDestination=new Point2D.Double(getX(),getY());
do{
if(getTime()>10){
move();
gun();
}
segment=(Math.PI*2)/(getOthers()*3);
myPos.setLocation(getX(),getY());
execute();
}while(true);
}
public void onScannedRobot(ScannedRobotEvent e) {
Enemy en=(Enemy)enemies.get(e.getName());
if(en==null){
en=new Enemy();
enemies.put(e.getName(),en);
}
en.live=true;
en.energy=e.getEnergy();
en.pos=projectPoint(myPos,e.getBearingRadians()+getHeadingRadians(),e.getDistance());
}
public boolean move(){
for(int i=0;i<100;i++){
Point2D.Double testPoint=projectPoint(myPos,Math.random()*2*Math.PI,50+Math.random()*150);
if(evaluate(testPoint)<evaluate(nextDestination)){
nextDestination=testPoint;
}
}
lastPosition=myPos;
driveTo(nextDestination);
return true;
}
public boolean gun(){
int[] botsInArea=new int[(int)segment];
Enumeration e=enemies.elements();
int curSegment=0;
while(e.hasMoreElements()){
Enemy en=(Enemy)e.nextElement();
if(en.live){
double ang=calcAngle(myPos,en.pos);
botsInArea[(int)(Math.abs(Math.floor(ang/segment)))]++;
}
}
for(int i=0;i<(int)segment;i++){
int bots=botsInArea[i];
int curBots=botsInArea[curSegment];
if(bots>curBots){
curSegment=i;
}
}
out.println("Using segment " + (curSegment*segment) + "~" + ((curSegment*segment)+segment));
setTurnGunRightRadians(Utils.normalRelativeAngle(((curSegment*segment)+Math.random()*segment)-getGunHeadingRadians()));
setFire(2);
return true;
}
private double evaluate(Point2D.Double p){
double risk=(1/lastPosition.distanceSq(p)) + (0.5/myPos.distanceSq(p));
Enumeration e=enemies.elements();
while(e.hasMoreElements()){
Enemy en=(Enemy)e.nextElement();
double thisRisk=en.energy/en.pos.distanceSq(p);
if(en.live){
risk+=thisRisk;
}
}
return risk;
}
private double calcAngle(Point2D.Double s,Point2D.Double t){
return Math.atan2(t.getX()-s.getX(),t.getY()-s.getY());
}
private Point2D.Double projectPoint(Point2D.Double s, double ang, double dist){
return new Point2D.Double(s.getX()+(Math.sin(ang)*dist),
s.getY()+(Math.cos(ang)*dist));
}
private void driveTo(Point2D.Double next){
driveTo(next.getX(),next.getY());
}
private void driveTo(double nextX, double nextY){
double myX = getX();double myY = getY();double turnAngle;double normalizedTurnAngle;
setTurnRightRadians(normalizedTurnAngle = Math.atan(Math.tan(turnAngle = ((Math.atan2(nextX - myX, nextY - myY) - getHeadingRadians()) + (7.0 * Math.PI)) % (2.0 * Math.PI) - Math.PI)));
setAhead((normalizedTurnAngle == turnAngle ? 1.0 : -1.0) * (java.awt.geom.Point2D.Double.distance(myX, myY, nextX, nextY)));
}
class Enemy{
boolean live;
double energy;
Point2D.Double pos;
}
}
When I run the bot, I get an
Exception: java.lang.ArrayIndexOutOfBoundsException: 3 >= 0
java.lang.ArrayIndexOutOfBoundsException: 3 >= 0
at java.util.Vector.elementAt(Vector.java:432)
at ntc.SimpleATBot.gun(SimpleATBot.java:65)
at ntc.SimpleATBot.run(SimpleATBot.java:28)
at robocode.peer.RobotPeer.run(Unknown Source)
at java.lang.Thread.run(Thread.java:595)
Help? --Starrynte
A Vector comes empty, so on line 65 you're trying to fetch the 4th value (index 3) from a Vector with 0 values (3 >= 0). I suggest skipping the vectory and using an array (int[] botsInArea? = new int[numSegments]).
Hm...I didin't know you could initialize an array with a variable...but i'll try it. Thnx --Starrynte
Ok, changed the code a bit, but now I get an
Exception: java.lang.ArrayIndexOutOfBoundsException: 8
java.lang.ArrayIndexOutOfBoundsException: 8
at ntc.SimpleATBot.gun(SimpleATBot.java:68)
at ntc.SimpleATBot.run(SimpleATBot.java:29)
at robocode.peer.RobotPeer.run(Unknown Source)
at java.lang.Thread.run(Thread.java:595)
It might be a problem with the hashtable, calcAngle(), or projectPoint(), since those are some functions (and variable) called by SimpleATBot (both directly and indirectly) --Starrynte
Ok, ArrayIndexOutOfBoundsException? fixed now (now I just have to tweak the movement a bit...and the gun! It always uses the 'due north' segment as the area), but the code isn't updated yet. I will update as soon as i can --Starrynte