Difference between revisions of "Talon/source"

From Robowiki
Jump to navigation Jump to search
m (Oh fine)
m (Slight modification (see setFire).)
Line 1: Line 1:
 
<syntaxhighlight>
 
<syntaxhighlight>
 
package cs;
 
package cs;
 
+
import java.awt.Color;
 
 
import java.awt.geom.Point2D;
 
import java.awt.geom.Point2D;
 
import robocode.AdvancedRobot;
 
import robocode.AdvancedRobot;
import robocode.HitWallEvent;
 
 
import robocode.ScannedRobotEvent;
 
import robocode.ScannedRobotEvent;
 
import robocode.util.Utils;
 
import robocode.util.Utils;
 
+
 
/**
 
/**
  * Talon - a robot by Chase Nano Melee bot
+
  * Talon - a Nano Melee robot by Chase
 
  *  
 
  *  
 
  * The idea is to avoid driving toward enemy robots, nearer ones are more
 
  * The idea is to avoid driving toward enemy robots, nearer ones are more
 
  * dangerous to drive towards.
 
  * dangerous to drive towards.
 
  *  
 
  *  
  * Codesize: 243
+
  * Codesize: 248
 
  */
 
  */
 
public class Talon extends AdvancedRobot {
 
public class Talon extends AdvancedRobot {
 
private static Point2D.Double[] map = new Point2D.Double[10];
 
private static Point2D.Double[] map = new Point2D.Double[10];
private static int n = 0, direction = 90;
+
private static int n;
 
+
 
public void run() {
 
public void run() {
setAdjustGunForRobotTurn(true);
+
//Sheldor: In melee this doesn't really matter.
setAllColors(Color.RED);
+
//setAdjustGunForRobotTurn(true);
 +
 +
//Sheldor: I'm very sorry. :(
 +
//setAllColors(Color.RED);
 
double angle, bestDanger, danger;
 
double angle, bestDanger, danger;
 
while(true) {
 
while(true) {
setAhead((bestDanger = angle = 360)*direction);
+
setFire(1);
+
//Sheldor: Slowing down before making big turns makes the wall avoidance much better.
 +
setAhead((bestDanger = angle = 360) - (5 * getTurnRemaining()));
 +
 
while(angle-- > 0) {
 
while(angle-- > 0) {
int t = getOthers();
+
int t;
danger = 0;
+
//Chase: uses less energy when there are less robots on the map, makes up for our poor targeting
 +
setFire(t = n);
 +
 +
//Sheldor: Drive toward the center of the field when the bot gets near a wall.
 +
//This will only work properly on a 1000/1000 pixel field.
 +
danger = -Math.abs(Utils.normalRelativeAngleDegrees(angle - Math.toDegrees(Math.atan2(getX() - 500, getY() - 500)))) *
 +
(table.charAt((int)getX()) + table.charAt((int)getY()));
 +
 
try {
 
try {
 
while(true) {
 
while(true) {
// our most recent scans, unfortunately not enough room
+
// our most recent scans, unfortunately not enough room to project them
// to project them
+
Point2D.Double v;
Point2D.Double v = map[--t];
 
 
// set our gun to face this nearest enemy
 
// set our gun to face this nearest enemy
setTurnGunRight(Utils.normalRelativeAngleDegrees(v.y - getGunHeading()));
+
setTurnGunRight(Utils.normalRelativeAngleDegrees((v = map[--t]).y - getGunHeading()));
// the difference between current angle we are
+
// the difference between current angle we are considering and the enemy multiply it
// considering and the enemy
+
// by how close they are, closer is more dangerous to move towards
// multiply it by how close they are, closer is more
+
//Sheldor: "X / Y" has exactly the same effect as "X * (1 / Y)" but is ~3 bytes smaller.
// dangerous to move towards
+
danger += 1 / (Math.abs(Utils.normalRelativeAngleDegrees(angle - v.y))) / v.x;
danger += 1 / (Math.abs(Utils.normalRelativeAngleDegrees(angle - v.y)) + 1) * (1 / v.x);
 
 
}
 
}
 
} catch(Exception e) {
 
} catch(Exception e) {
// We don't have room for any kind of sanity checks, also
+
// We don't have room for any kind of sanity checks, also the only way to get out of
// the only way to get out of the loop without
+
// the loop without having to have a comparison, saves us some code size
// having to have a comparison, saves us some code size
 
 
}
 
}
 
if(danger < bestDanger) {
 
if(danger < bestDanger) {
 
bestDanger = danger;
 
bestDanger = danger;
setTurnRight(Utils.normalRelativeAngleDegrees(angle + (direction - 90) - getHeading()));
+
setTurnRight(Utils.normalRelativeAngleDegrees(angle - getHeading()));
 
}
 
}
 
}
 
}
 
// Turning it by only 1 saves us some code size but in radians this
 
// Turning it by only 1 saves us some code size but in radians this
// value > PI/4 the maximum
+
// value > PI/4 the maximum turn the radar can turn, meaning it will
// turn the radar can turn, meaning it will cover the full arc as
+
// cover the full arc as long as we call it every turn.
// long as we call it every turn.
 
 
turnRadarRightRadians(1);
 
turnRadarRightRadians(1);
 
}
 
}
 
}
 
}
 
+
 
public void onScannedRobot(ScannedRobotEvent e) {
 
public void onScannedRobot(ScannedRobotEvent e) {
 
try {
 
try {
Line 69: Line 75:
 
catch(Exception ex) {
 
catch(Exception ex) {
 
// attempted to scan but it failed, set the number of enemies again
 
// attempted to scan but it failed, set the number of enemies again
// we miss a enemy scan but we gain some code size here
+
// we miss an enemy scan but we gain some code size here
 
n = getOthers();
 
n = getOthers();
 
}
 
}
 
}
 
}
+
public void onHitWall(HitWallEvent event) {
+
static final String table = "\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064" +
ahead((direction = -direction)*0.22);
+
"\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0001" +
}
+
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
 +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
 +
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
 +
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
 +
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
 +
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
 +
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
 +
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
 +
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
 +
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
 +
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
 +
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
 +
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\u0001\u0001\u0001\u0001\u0001" +
 +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
 +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064" +
 +
"\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064" +
 +
"\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064";
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>

Revision as of 19:08, 22 February 2013

package cs;
 
import java.awt.geom.Point2D;
import robocode.AdvancedRobot;
import robocode.ScannedRobotEvent;
import robocode.util.Utils;
 
/**
 * Talon - a Nano Melee robot by Chase
 * 
 * The idea is to avoid driving toward enemy robots, nearer ones are more
 * dangerous to drive towards.
 * 
 * Codesize: 248
 */
public class Talon extends AdvancedRobot {
	private static Point2D.Double[] map = new Point2D.Double[10];
	private static int n;
 
	public void run() {
		//Sheldor: In melee this doesn't really matter.
		//setAdjustGunForRobotTurn(true);
		
		//Sheldor: I'm very sorry. :(
		//setAllColors(Color.RED);
		double angle, bestDanger, danger;
		while(true) {
 
			//Sheldor: Slowing down before making big turns makes the wall avoidance much better.
			setAhead((bestDanger = angle = 360) - (5 * getTurnRemaining()));
 
			while(angle-- > 0) {
				int t;
				//Chase: uses less energy when there are less robots on the map, makes up for our poor targeting
				setFire(t = n);
 
				//Sheldor: Drive toward the center of the field when the bot gets near a wall.
				//This will only work properly on a 1000/1000 pixel field.
				danger = -Math.abs(Utils.normalRelativeAngleDegrees(angle - Math.toDegrees(Math.atan2(getX() - 500, getY() - 500)))) *
					(table.charAt((int)getX()) + table.charAt((int)getY()));
 
				try {
					while(true) {
						// our most recent scans, unfortunately not enough room to project them
						Point2D.Double v;
						// set our gun to face this nearest enemy
						setTurnGunRight(Utils.normalRelativeAngleDegrees((v = map[--t]).y - getGunHeading()));
						// the difference between current angle we are considering and the enemy multiply it
						// by how close they are, closer is more dangerous to move towards
						//Sheldor: "X / Y" has exactly the same effect as "X * (1 / Y)" but is ~3 bytes smaller.
						danger += 1 / (Math.abs(Utils.normalRelativeAngleDegrees(angle - v.y))) / v.x;  
					}
				} catch(Exception e) {
					// We don't have room for any kind of sanity checks, also the only way to get out of
					// the loop without having to have a comparison, saves us some code size
				}
				if(danger < bestDanger) {
					bestDanger = danger;
					setTurnRight(Utils.normalRelativeAngleDegrees(angle - getHeading()));
				}
			}
			// Turning it by only 1 saves us some code size but in radians this
			// value > PI/4 the maximum turn the radar can turn, meaning it will
			// cover the full arc as long as we call it every turn.
			turnRadarRightRadians(1);
		}
	}
 
	public void onScannedRobot(ScannedRobotEvent e) {
		try {
			// Set the most recent scan into our map of enemies
			map[--n] = new Point2D.Double(e.getDistance(), getHeading() + e.getBearing());
		}
		catch(Exception ex) {
			// attempted to scan but it failed, set the number of enemies again
			// we miss an enemy scan but we gain some code size here
			n = getOthers();
		}
	}
 
	static final String table = "\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064" +
			"\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0001" +
			"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
			"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
			"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
			"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
			"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
			"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
			"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
			"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
			"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
			"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
			"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
			"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +
			"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\u0001\u0001\u0001\u0001\u0001" +
			"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
			"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064" +
			"\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064" +
			"\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064\u0064";
}