Difference between revisions of "Talon/source"

From Robowiki
Jump to navigation Jump to search
m (Made a few concessions. Now have 50 bytes to work with.)
m (It isn't perfect, but at least it doesn't hang up on walls anymore!)
Line 2: Line 2:
 
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;
Line 13: Line 15:
 
  * dangerous to drive towards.
 
  * dangerous to drive towards.
 
  *  
 
  *  
  * Codesize: 200
+
  * 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;
+
private static int n = 0, direction = 1;
  
 
public void run() {
 
public void run() {
 
setAdjustGunForRobotTurn(true);
 
setAdjustGunForRobotTurn(true);
 +
setAllColors(Color.RED);
 
double angle, bestDanger, danger;
 
double angle, bestDanger, danger;
 
while(true) {
 
while(true) {
setAhead(angle = 360);
+
setAhead((bestDanger = angle = 360)*direction);
setFire(bestDanger = angle);
+
setFire(1);
 
while(angle-- > 0) {
 
while(angle-- > 0) {
 
int t = getOthers();
 
int t = getOthers();
Line 41: Line 44:
 
danger += 1 / (Math.abs(Utils.normalRelativeAngleDegrees(angle - v.y)) + 1) * (1 / 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 loop without
 
// the only way to get out of the loop without
Line 49: Line 51:
 
if(danger < bestDanger) {
 
if(danger < bestDanger) {
 
bestDanger = danger;
 
bestDanger = danger;
setTurnRight(Utils.normalRelativeAngleDegrees(angle - getHeading()));
+
setTurnRight(Utils.normalRelativeAngleDegrees(angle + ((direction < 0) ? 180 : 0) - getHeading()));
 
}
 
}
 
}
 
}
Line 72: Line 74:
 
n = getOthers();
 
n = getOthers();
 
}
 
}
 +
}
 +
 +
public void onHitWall(HitWallEvent event) {
 +
ahead(20*(direction = -direction));
 
}
 
}
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>

Revision as of 22:58, 7 February 2013

package cs;

import java.awt.Color;
import java.awt.geom.Point2D;
import robocode.AdvancedRobot;
import robocode.HitWallEvent;
import robocode.ScannedRobotEvent;
import robocode.util.Utils;

/**
 * Talon - a robot by Chase Nano Melee bot
 * 
 * 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 = 0, direction = 1;

	public void run() {
		setAdjustGunForRobotTurn(true);
		setAllColors(Color.RED);
		double angle, bestDanger, danger;
		while(true) {
			setAhead((bestDanger = angle = 360)*direction);
			setFire(1);
			while(angle-- > 0) {
				int t = getOthers();
				danger = 0;
				try {
					while(true) {
						// our most recent scans, unfortunately not enough room
						// to project them
						Point2D.Double v = map[--t];
						// set our gun to face this nearest enemy
						setTurnGunRight(Utils.normalRelativeAngleDegrees(v.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
						danger += 1 / (Math.abs(Utils.normalRelativeAngleDegrees(angle - v.y)) + 1) * (1 / 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 + ((direction < 0) ? 180 : 0) - 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());
			// map[--n] = new double[]{e.getDistance(),getHeading() +
			// e.getBearing()};
		}
		catch(Exception ex) {
			// attempted to scan but it failed, set the number of enemies again
			// we miss a enemy scan but we gain some code size here
			n = getOthers();
		}
	}
	
	public void onHitWall(HitWallEvent event) {
		ahead(20*(direction = -direction));
	}
}