Wall avoidance

Fragment of a discussion from Talk:Talon/source
Jump to navigation Jump to search
Edited by another user.
Last edit: 21:00, 16 February 2013

How does this look? It will hit walls when it doesn't have enough time to turn, but it doesn't stick on them. If there were only eight bytes to spare I could make it slow down when it had to make a wide turn, which would greatly reduce the number of wall hits.


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 Nano Melee robot by Chase
 * 
 * The idea is to avoid driving toward enemy robots, nearer ones are more
 * dangerous to drive towards.
 * 
 * Codesize: 247
 */
public class Talon extends AdvancedRobot {
	private static Point2D.Double[] map = new Point2D.Double[10];
	private static int n = 0;
 
	public void run() {
		//setAdjustGunForRobotTurn(true); //Sheldor: In melee this doesn't really matter.
		//setAllColors(Color.RED); //Sheldor: I'm very sorry. :(
		double angle, bestDanger, danger;
		while(true) {
		
			setAhead((bestDanger = angle = 360) /*- (3 * getTurnRemaining())*/); //Sheldor: Slowing down before making big turns makes the wall avoidance much better, but it costs ~8 bytes.
			
			while(angle-- > 0) {
				int t;
				setFire(t = getOthers()); //Sheldor: From Graviton.
				
				//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)))) *
					((short)(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 = 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) / v.x; //Sheldor: "X / Y" has exactly the same effect as "X * (1 / Y)" but is ~3 bytes smaller.  
					}
				} 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";
}
Sheldor19:38, 16 February 2013