Wall avoidance

Jump to navigation Jump to search
Revision as of 22 February 2013 at 17:54.
The highlighted comment was created in this revision.

Wall avoidance

While that would minimize the codesize, it would make the wall avoidance much more pronounce (and much worse).

I come back time to time to see if I can make a better wall avoidance for this robot. But so far I have failed terribly.

    Chase01:12, 8 February 2013

    ahead(.222222 * (direction = -direction));

      Sheldor01:18, 8 February 2013
       

      And here I was hoping you would come up with some amazing wall avoidance technique. :)

        Chase01:38, 8 February 2013

        That's probably more in Mike's territory, but I could give it a try.

          Sheldor01:48, 8 February 2013
           

          Thanks for the attempt. I think I covered most possibilities already however. Unfortunately it only has about 50 bytes to play with.

            Chase03:25, 8 February 2013
             
            Edited by another user.
            Last edit: 22: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";
            }
              Sheldor20:38, 16 February 2013
               

              It still seems to hang up on walls fairly easily. Sometimes it looks very nice and avoids them. But sometimes ti drives straight into them and hangs up on them.

              But the idea isn't a bad one at all.

                Chase21:55, 16 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() {
                		//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) - (5 * getTurnRemaining())); //Sheldor: Slowing down before making big turns makes the wall avoidance much better.
                			
                			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)))) *
                					(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
                						danger += 1 / (Math.abs(Utils.normalRelativeAngleDegrees(angle - v.y))) / 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";
                }
                  Sheldor18:10, 22 February 2013
                   

                  Well it still knocks into walls a good bit, but less then my prototype. But it doesn't hang up on them either. Which is nice. If you are okay, we can brand it wiki or a cs.sheldor and enter it. See how a nano Minimum Risk Movement does.

                    Chase19:54, 22 February 2013