import java.awt.Color; import java.awt.Graphics2D; |
static final double BULLET_POWER = 3.0; RobotState? me, target; // these aren't static, //so they will be reset every round static Vector guns; // this Vector (and all its //contents) will persist from round to round static Vector virtualBullets = new Vector(); Rectangle2D.Double battlefield; |
public void run() { battlefield = new Rectangle2D.Double(0,0, Squirrel.getBattleFieldWidth?(), Squirrel.getBattleFieldHeight?()); if(guns == null){ guns = new Vector(); Gun defaultGun = new ReallyBadGun?(); defaultGun.hits = 1; guns.add(defaultGun); guns.add(new HeadOnGun?()); guns.add(new RandomGun?()); } virtualBullets.clear(); } |
// Create a new RobotState? object to represent the enemy's current state target = new RobotState?(); target.setLocation(me.project(e.getBearingRadians?() + Squirrel.getHeadingRadians(), e.getDistance())); target.heading = e.getHeadingRadians(); target.velocity = e.getVelocity(); target.name = e.getName(); me = new RobotState?(); me.name = Squirrel.getName(); me.velocity = Squirrel.getVelocity(); me.heading = Squirrel.getHeadingRadians(); me.x = Squirrel.getX(); me.y = Squirrel.getY(); //Turn? our radar /* if(target == null) setTurnRadarRightRadians(Math.toRadians(45)); else { double radarTurnAngle? = normalizeRelativeAngle(me.absoluteAngleTo?(target) - getRadarHeadingRadians?()); if(radarTurnAngle? > 0) radarTurnAngle? += .4; else radarTurnAngle? -= .4; setTurnRadarRightRadians(radarTurnAngle?); }*/ //Move? each virtual bullet forward one tick. After moving, check if they are off the field or near the target. Iterator i = virtualBullets.iterator(); while(i.hasNext()){ VirtualBullet? virtualBullet = (VirtualBullet?) i.next(); virtualBullet.setLocation(virtualBullet.project(virtualBullet.heading, virtualBullet.velocity)); if(virtualBullet.distance(target) < 25){ //check if the virtual bullet "hit" the enemy virtualBullet.gunUsed.hits += 1; i.remove(); } else if(!battlefield.contains(virtualBullet)){ //check if the virtual bullet is off the field i.remove(); } } if(target != null) gun(); /* |
double battleFieldHeight? = Squirrel.getBattleFieldHeight?(); double battleFieldWidth? = Squirrel.getBattleFieldWidth?(); |
|
if(!(Squirrel.getEnergy()<5)) |
Math.min(Squirrel.getEnergy()-1, |
Math.min((Squirrel.getEnergy()-5), |
else if(e.getEnergy() == 0 && Squirrel.getOthers()==1) Squirrel.setFire(0.1);*/ |
public void onDeath(DeathEvent? e){ endRound(); } public void onWin(WinEvent? e){ endRound(); } public void endRound(){ Iterator i = guns.iterator(); Squirrel.out.println(); Squirrel.out.println("Virtual bullet hit table"); Squirrel.out.println(" "); while(i.hasNext()){ Gun gun = (Gun) i.next(); Squirrel.out.println(gun.getName() + ": " + gun.hits); } Squirrel.out.println(); //So? we don't keep firing target = null; } public void gun(){ //Select? the best gun long bestScore = -1; Gun bestGun = null; Iterator i = guns.iterator(); while(i.hasNext()){ Gun gun = (Gun) i.next(); if(gun.hits > bestScore){ bestScore = gun.hits; bestGun = gun; } } //Aim? with the best gun Squirrel.setTurnGunRightRadians?( normalizeRelativeAngle(bestGun.getFiringAngle?( me, target, BULLET_POWER) - Squirrel.getGunHeadingRadians?())); // create new virtual bullets only if we actually // fired this turn Bullet b = Squirrel.setFireBullet(BULLET_POWER); if(b != null){ i = guns.iterator(); while(i.hasNext()){ Gun gun = (Gun) i.next(); VirtualBullet? newVirtualBullet? = new VirtualBullet?(); newVirtualBullet?.setLocation(me); newVirtualBullet?.heading = gun.getFiringAngle?(me, target, BULLET_POWER); newVirtualBullet?.velocity = 20.0 - 3.0 * BULLET_POWER; newVirtualBullet?.gunUsed = gun; virtualBullets.add(newVirtualBullet?); } } } //Draw? the virtual bullets on screen - this will // only work with a recent version of robocode // and "Paint" turned on in the robot's console public void onPaint(Graphics2D g){ Iterator i = virtualBullets.iterator(); while(i.hasNext()){ VirtualBullet? virtualBullet = (VirtualBullet?) i.next(); g.setColor(virtualBullet.gunUsed.getColor()); g.fillOval((int)virtualBullet.x - 3, (int)virtualBullet.y -3, 6, 6); } int numberOfGuns? = guns.size(); for(int j = 0; j < numberOfGuns?; j++){ Gun gun = (Gun) guns.elementAt(j); g.setColor(Color.WHITE); g.drawString(gun.getName() + ": " + gun.hits, 20, 5 + j*15); g.setColor(gun.getColor()); g.fillOval(5, 5 + j * 15, 10, 10); } } //This? method ensures that angles are between -180 and 180 degrees, for turning radar / gun public static double normalizeRelativeAngle(double angle){ while(angle <= -Math.PI){ angle += 2.0 * Math.PI; } while(angle > Math.PI){ angle -= 2.0 * Math.PI; } return angle; } |
</PRE> |
class ReallyBadGun? extends Gun{ public String getName(){return "Really bad gun - fires away from the enemy";} public Color getColor(){return Color.RED;} public double getFiringAngle?(RobotState? shooter, RobotState? target, double bulletPower) { return target.absoluteAngleTo?(shooter); } } class RandomGun? extends Gun { public String getName(){return "Simple linear gun";} public Color getColor(){return Color.BLUE;} public double getFiringAngle?(RobotState? shooter, RobotState? target, double bulletPower) { //double maxAngle = Math.asin(8.0 / (20.0 - 3.0 * bulletPower)); double directAngle = shooter.absoluteAngleTo?(target); return directAngle - target.velocity * Math.sin(directAngle - target.heading) / (20.0 - 3.0 * bulletPower); } } class HeadOnGun? extends Gun { public String getName(){return "Head on";} public Color getColor(){return Color.GREEN;} public double getFiringAngle?(RobotState? shooter, RobotState? target, double bulletPower) { return shooter.absoluteAngleTo?(target); } } abstract class Gun { public long hits; public abstract Color getColor(); public abstract String getName(); public abstract double getFiringAngle?(RobotState? shooter, RobotState? target, double bulletPower); } class FieldPoint? extends Point2D.Double{ public FieldPoint?(){} public FieldPoint?(double x, double y){ super(x,y); } public double absoluteAngleTo?(FieldPoint? p){ double angle = Math.atan2(p.x - x, p.y - y); while(angle < 0.0){ angle += 2.0 * Math.PI; } while(angle >= 2.0 * Math.PI){ angle -= 2.0 * Math.PI; } return angle; } public FieldPoint? project(double angle, double distance) { return new FieldPoint?(x + Math.sin(angle) * distance, y + Math.cos(angle) * distance); } } class MotionState? extends FieldPoint?{ public double velocity, heading; } class VirtualBullet? extends MotionState?{ public Gun gunUsed; } class RobotState? extends MotionState?{ public String name; } </PRE> |
package bayen; import robocode.*; import java.util.*; import java.awt.geom.*; import java.awt.Color; import java.awt.Graphics2D; /** * AcornSlingshot - Squirrel's gun */ public class AcornSlingshot { AdvancedRobot Squirrel; ScannedRobotEvent lastScan; static final double BULLET_POWER = 3.0; RobotState me, target; // these aren't static, //so they will be reset every round static Vector guns; // this Vector (and all its //contents) will persist from round to round static Vector virtualBullets = new Vector(); Rectangle2D.Double battlefield; public AcornSlingshot(AdvancedRobot robot) { Squirrel = robot; } public void run() { battlefield = new Rectangle2D.Double(0,0, Squirrel.getBattleFieldWidth(), Squirrel.getBattleFieldHeight()); if(guns == null){ guns = new Vector(); Gun defaultGun = new ReallyBadGun(); defaultGun.hits = 1; guns.add(defaultGun); guns.add(new HeadOnGun()); guns.add(new RandomGun()); } virtualBullets.clear(); } public void onScannedRobot(ScannedRobotEvent e) { if(Squirrel.getTime()<30) lastScan = e; // Create a new RobotState object to represent the enemy's current state target = new RobotState(); target.setLocation(me.project(e.getBearingRadians() + Squirrel.getHeadingRadians(), e.getDistance())); target.heading = e.getHeadingRadians(); target.velocity = e.getVelocity(); target.name = e.getName(); me = new RobotState(); me.name = Squirrel.getName(); me.velocity = Squirrel.getVelocity(); me.heading = Squirrel.getHeadingRadians(); me.x = Squirrel.getX(); me.y = Squirrel.getY(); //Turn our radar /* if(target == null) setTurnRadarRightRadians(Math.toRadians(45)); else { double radarTurnAngle = normalizeRelativeAngle(me.absoluteAngleTo(target) - getRadarHeadingRadians()); if(radarTurnAngle > 0) radarTurnAngle += .4; else radarTurnAngle -= .4; setTurnRadarRightRadians(radarTurnAngle); }*/ //Move each virtual bullet forward one tick. After moving, check if they are off the field or near the target. Iterator i = virtualBullets.iterator(); while(i.hasNext()){ VirtualBullet virtualBullet = (VirtualBullet) i.next(); virtualBullet.setLocation(virtualBullet.project(virtualBullet.heading, virtualBullet.velocity)); if(virtualBullet.distance(target) < 25){ //check if the virtual bullet "hit" the enemy virtualBullet.gunUsed.hits += 1; i.remove(); } else if(!battlefield.contains(virtualBullet)){ //check if the virtual bullet is off the field i.remove(); } } if(target != null) gun(); /* double lastEnemyHeading = lastScan.getHeadingRadians(); double w=e.getHeadingRadians()-lastEnemyHeading; double absbearing=e.getBearingRadians()+ Squirrel.getHeadingRadians(); double eX=e.getDistance()*Math.sin(absbearing); double eY=e.getDistance()*Math.cos(absbearing); double db=0; double ww=lastEnemyHeading; double battleFieldHeight = Squirrel.getBattleFieldHeight(); double battleFieldWidth = Squirrel.getBattleFieldWidth(); do{ db+=11; double dx=e.getVelocity()*Math.sin(ww); double dy=e.getVelocity()*Math.cos(ww); ww+=w; eX+=dx; eY+=dy; }while (db< Point2D.distance(0,0,eX,eY)); Squirrel.setTurnGunRight(Math.toDegrees(Math.asin (Math.sin(Math.atan2(eX, eY) - Squirrel.getGunHeadingRadians())))); if(!(Squirrel.getEnergy()<5)) Squirrel.setFire(Math.min(3, Math.min((Squirrel.getEnergy()-5), e.getEnergy()))); else if(e.getEnergy() == 0 && Squirrel.getOthers()==1) Squirrel.setFire(0.1);*/ lastScan = e; } public void onDeath(DeathEvent e){ endRound(); } public void onWin(WinEvent e){ endRound(); } public void endRound(){ Iterator i = guns.iterator(); Squirrel.out.println(); Squirrel.out.println("Virtual bullet hit table"); Squirrel.out.println("------------------------"); while(i.hasNext()){ Gun gun = (Gun) i.next(); Squirrel.out.println(gun.getName() + ": " + gun.hits); } Squirrel.out.println(); //So we don't keep firing target = null; } public void gun(){ //Select the best gun long bestScore = -1; Gun bestGun = null; Iterator i = guns.iterator(); while(i.hasNext()){ Gun gun = (Gun) i.next(); if(gun.hits > bestScore){ bestScore = gun.hits; bestGun = gun; } } //Aim with the best gun Squirrel.setTurnGunRightRadians( normalizeRelativeAngle(bestGun.getFiringAngle( me, target, BULLET_POWER) - Squirrel.getGunHeadingRadians())); // create new virtual bullets only if we actually // fired this turn Bullet b = Squirrel.setFireBullet(BULLET_POWER); if(b != null){ i = guns.iterator(); while(i.hasNext()){ Gun gun = (Gun) i.next(); VirtualBullet newVirtualBullet = new VirtualBullet(); newVirtualBullet.setLocation(me); newVirtualBullet.heading = gun.getFiringAngle(me, target, BULLET_POWER); newVirtualBullet.velocity = 20.0 - 3.0 * BULLET_POWER; newVirtualBullet.gunUsed = gun; virtualBullets.add(newVirtualBullet); } } } //Draw the virtual bullets on screen - this will // only work with a recent version of robocode // and "Paint" turned on in the robot's console public void onPaint(Graphics2D g){ Iterator i = virtualBullets.iterator(); while(i.hasNext()){ VirtualBullet virtualBullet = (VirtualBullet) i.next(); g.setColor(virtualBullet.gunUsed.getColor()); g.fillOval((int)virtualBullet.x - 3, (int)virtualBullet.y -3, 6, 6); } int numberOfGuns = guns.size(); for(int j = 0; j < numberOfGuns; j++){ Gun gun = (Gun) guns.elementAt(j); g.setColor(Color.WHITE); g.drawString(gun.getName() + ": " + gun.hits, 20, 5 + j*15); g.setColor(gun.getColor()); g.fillOval(5, 5 + j * 15, 10, 10); } } //This method ensures that angles are between -180 and 180 degrees, for turning radar / gun public static double normalizeRelativeAngle(double angle){ while(angle <= -Math.PI){ angle += 2.0 * Math.PI; } while(angle > Math.PI){ angle -= 2.0 * Math.PI; } return angle; } private double normalRelativeAngle(double angle) { angle = Math.toRadians(angle); return Math.toDegrees(Math.atan2( Math.sin(angle), Math.cos(angle))); } } class ReallyBadGun extends Gun{ public String getName(){return "Really bad gun - fires away from the enemy";} public Color getColor(){return Color.RED;} public double getFiringAngle(RobotState shooter, RobotState target, double bulletPower) { return target.absoluteAngleTo(shooter); } } class RandomGun extends Gun { public String getName(){return "Simple linear gun";} public Color getColor(){return Color.BLUE;} public double getFiringAngle(RobotState shooter, RobotState target, double bulletPower) { //double maxAngle = Math.asin(8.0 / (20.0 - 3.0 * bulletPower)); double directAngle = shooter.absoluteAngleTo(target); return directAngle - target.velocity * Math.sin(directAngle - target.heading) / (20.0 - 3.0 * bulletPower); } } class HeadOnGun extends Gun { public String getName(){return "Head on";} public Color getColor(){return Color.GREEN;} public double getFiringAngle(RobotState shooter, RobotState target, double bulletPower) { return shooter.absoluteAngleTo(target); } } abstract class Gun { public long hits; public abstract Color getColor(); public abstract String getName(); public abstract double getFiringAngle(RobotState shooter, RobotState target, double bulletPower); } class FieldPoint extends Point2D.Double{ public FieldPoint(){} public FieldPoint(double x, double y){ super(x,y); } public double absoluteAngleTo(FieldPoint p){ double angle = Math.atan2(p.x - x, p.y - y); while(angle < 0.0){ angle += 2.0 * Math.PI; } while(angle >= 2.0 * Math.PI){ angle -= 2.0 * Math.PI; } return angle; } public FieldPoint project(double angle, double distance) { return new FieldPoint(x + Math.sin(angle) * distance, y + Math.cos(angle) * distance); } } class MotionState extends FieldPoint{ public double velocity, heading; } class VirtualBullet extends MotionState{ public Gun gunUsed; } class RobotState extends MotionState{ public String name; }