Difference between revisions of "Yatagan/Source"

From Robowiki
Jump to navigation Jump to search
m (→‎Development Version: Let's try this in the rumble.)
(1.0.6 reverse probability change)
Line 105: Line 105:
 
   //required reverse probability, from Toorkild's formula: 0.6*sqrt((20 - 3*2.5)/160) - 0.04 ~= 0.125
 
   //required reverse probability, from Toorkild's formula: 0.6*sqrt((20 - 3*2.5)/160) - 0.04 ~= 0.125
 
   //thus 3/x = 0.125 --> x = 3/0.125 = 24
 
   //thus 3/x = 0.125 --> x = 3/0.125 = 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24;
+
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29;
 
   
 
   
 
   
 
   
Line 248: Line 248:
 
<syntaxhighlight>
 
<syntaxhighlight>
 
/*
 
/*
Yatagan 1.0.5 by Sheldor & Skilgannon
+
Yatagan 1.0.6 by Sheldor & Skilgannon;  Release date:  04/25/2013
 
The yatagan is a short sabre which was used extensively in the Ottoman Empire.
 
The yatagan is a short sabre which was used extensively in the Ottoman Empire.
 +
Codesize:  249 bytes without any colors
 
   
 
   
 
Credits:  
 
Credits:  
Pattern Matching code from simonton.WeekendObsession_S and mld.Moebius, heavily modified,
+
Pattern Matching code from simonton.WeekendObsession_S and mld.Moebius, heavily modified.
and a general thanks to all open source bot authors and contributors to the RoboWiki.
+
And a general thanks to all open source bot authors and contributors to the RoboWiki.
 
   
 
   
Yatagan is open source and released under the terms of the RoboWiki Public Code License (RWPCL) - Version 1.1
+
Yatagan is open source and released under the terms of the RoboWiki Public Code License (RWPCL) - Version 1.1.
see license here: http://robowiki.net/wiki/RWPCL
+
See license here: http://robowiki.net/wiki/RWPCL
 
*/
 
*/
 
   
 
   
Line 270: Line 271:
 
   static double enemyEnergy;
 
   static double enemyEnergy;
 
   
 
   
   static int deathCount;
+
   static int deathCount;
+
 
//En garde!
 
 
   public void run()
 
   public void run()
 
   {
 
   {
 
       setAdjustGunForRobotTurn(true);
 
       setAdjustGunForRobotTurn(true);
+
 
 
   //Start spinning radar and initialize direction to infinity.
 
   //Start spinning radar and initialize direction to infinity.
 
       setTurnRadarRightRadians(direction = Double.POSITIVE_INFINITY);
 
       setTurnRadarRightRadians(direction = Double.POSITIVE_INFINITY);
Line 283: Line 283:
 
   public void onScannedRobot(ScannedRobotEvent e)
 
   public void onScannedRobot(ScannedRobotEvent e)
 
   {
 
   {
  //Local variables.
+
      //Local variables.
 
       int integer = 30;
 
       int integer = 30;
 
       double absoluteBearing;
 
       double absoluteBearing;
      double distance;
 
 
       int matchPosition;
 
       int matchPosition;
+
 
  //Orbiting/Oscillating/Random movement, all depending on how big the number you multiply the random with is.
+
      //Orbiting/Oscillating/Random movement, all depending on the size of the number you multiply the random with.
 
       if( (char) ((enemyEnergy - 1.09999999999  
 
       if( (char) ((enemyEnergy - 1.09999999999  
 
       + chancesOfReversing.charAt(deathCount)*Math.random()  
 
       + chancesOfReversing.charAt(deathCount)*Math.random()  
 
       - (enemyEnergy = e.getEnergy()))) <= 1 )
 
       - (enemyEnergy = e.getEnergy()))) <= 1 )
 
       {
 
       {
 +
        //Reverse direction.
 +
        //Calling the onHitWall event saves two bytes.
 
         onHitWall(null);
 
         onHitWall(null);
 
       }
 
       }
       setAhead(direction);
+
       setAhead(direction);    
+
 
  //Stay perpendicular to the enemy.
+
        
       setTurnRightRadians(Math.cos(absoluteBearing = e.getBearingRadians()) + ((160.0 - (distance = e.getDistance())) * (getVelocity()  / 3000)));
+
 
+
      //Record the current enemy lateral velocity.
  //Pattern Matching.
+
       enemyHistory = String.valueOf((char) (e.getVelocity() * (Math.sin(e.getHeadingRadians() - (absoluteBearing = e.getBearingRadians() + getHeadingRadians()))))).concat(enemyHistory);  
       enemyHistory = String.valueOf((char) (e.getVelocity() * (Math.sin(e.getHeadingRadians() - (absoluteBearing += getHeadingRadians()))))).concat(enemyHistory);
+
       
+
      //Pattern Matching.     
  // search for a match
+
      // search for a match
 
       while((matchPosition = enemyHistory.indexOf(enemyHistory.substring(0, integer--), 64)) < 0);
 
       while((matchPosition = enemyHistory.indexOf(enemyHistory.substring(0, integer--), 64)) < 0);
   
+
 
       integer = (int)(distance);
+
      //Stay mostly perpendicular to the enemy, but try to maintain a distance of 220 pixels.
   // calculate aim offset
+
      //SHELDOR: Let's try 220 this time.
+
       setTurnRightRadians(Math.cos(e.getBearingRadians()) + ((220.0 - (integer = (int)(e.getDistance()))) * (getVelocity()  / 3200)));
       do {  
+
    
         absoluteBearing += ((short) enemyHistory.charAt(--matchPosition)) /  distance;
+
      do
       } while ((integer -= 12) > 0);
+
       {  
+
         absoluteBearing += ((short) enemyHistory.charAt(--matchPosition)) /  e.getDistance();
  //Aim at the predicted target.
+
       }
 +
      while ((integer -= 13) > 0);
 +
 
 +
      //Aim at the predicted target.
 
       setTurnGunRightRadians(Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians()));
 
       setTurnGunRightRadians(Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians()));
+
 
  //Fire!
+
      //Fire!
       setFire(2.6666666666666666666666666666666666666666666666);
+
      //Bullet power must be a multiple of 0.33333... or else the gun will be inaccurate.
+
      //SHELDOR:  Though lower-power bullets make us easy rambot prey, they will probably result in a larger overall APS score.
  //Infinite radar lock.
+
       setFire(2.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333);
 +
 
 +
      //Infinite radar lock.
 
       setTurnRadarLeftRadians(getRadarTurnRemainingRadians());
 
       setTurnRadarLeftRadians(getRadarTurnRemainingRadians());
 
   }
 
   }
Line 326: Line 332:
 
   public void onDeath(DeathEvent e)
 
   public void onDeath(DeathEvent e)
 
   {
 
   {
 +
      //When the bot dies, move to the next cell in the table.
 
       deathCount++;
 
       deathCount++;
 
   }
 
   }
Line 331: Line 338:
 
   public void onHitWall(HitWallEvent e)
 
   public void onHitWall(HitWallEvent e)
 
   {
 
   {
  //Reverse direction when the bot hits a wall.
+
      //Reverse direction.
 
       direction = -direction;
 
       direction = -direction;
 
   }
 
   }
 
   
 
   
//chance out of 3 for given number of deaths, 'final' saves a few bytes
+
  //The chance that Yatagan will reverse direction when the enemy fires.
 +
  //Since this is an unchanging table, we can use 'final' to save a few bytes.
 
   private static final String chancesOfReversing = ""
 
   private static final String chancesOfReversing = ""
   + (char)60000 + (char)0 + (char)60000 + (char) 0 + (char)60000 + (char)0
+
   + (char)60000 + (char)0 + (char)60000 + (char) 0 + (char)60000 + (char) 0
 
   //100 rounds of deaths, should be enough?
 
   //100 rounds of deaths, should be enough?
 
   // range which will produce 'bullet hit': 3.0999 - 0.0999 = 3
 
   // range which will produce 'bullet hit': 3.0999 - 0.0999 = 3
Line 365: Line 373:
 
   
 
   
 
   
 
   
//Preloaded log of enemy movements for pattern matcher so it doesn't need error checking
+
//Preloaded log of enemy movements for pattern matcher so it doesn't need error checking.
 
   static String enemyHistory = ""
 
   static String enemyHistory = ""
 
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
 
   + (char) 1 + (char) 1 + (char) 1 + (char) 1

Revision as of 21:53, 28 April 2013

Development Version

Codesize: 249

/*
Yatagan 1.0.6 by Sheldor & Skilgannon;  Release date:  04/25/2013
The yatagan is a short sabre which was used extensively in the Ottoman Empire.
Codesize:  249 bytes without any colors
 
Credits: 
Pattern Matching code from simonton.WeekendObsession_S and mld.Moebius, heavily modified.
And a general thanks to all open source bot authors and contributors to the RoboWiki.
 
Yatagan is open source and released under the terms of the RoboWiki Public Code License (RWPCL) - Version 1.1.
See license here: http://robowiki.net/wiki/RWPCL
*/
 
package sheldor.jk;
 
import robocode.*;
import robocode.util.Utils;
 
public class Yatagan extends AdvancedRobot
{
//Global variables.
   static double direction;
   static double enemyEnergy;
 
   static int deathCount;

   public void run()
   {
      setAdjustGunForRobotTurn(true);
   
   //Start spinning radar and initialize direction to infinity.
      setTurnRadarRightRadians(direction = Double.POSITIVE_INFINITY);
   }
 
   public void onScannedRobot(ScannedRobotEvent e)
   {
      //Local variables.
      int integer = 30;
      double absoluteBearing;
      int matchPosition;
   
      //Orbiting/Oscillating/Random movement, all depending on the size of the number you multiply the random with.
      if( (char) ((enemyEnergy - 1.09999999999 
      + chancesOfReversing.charAt(deathCount)*Math.random() 
      - (enemyEnergy = e.getEnergy()))) <= 1 )
      {
         //Reverse direction.
         //Calling the onHitWall event saves two bytes.
         onHitWall(null);
      }		
      setAhead(direction);     

      

      //Record the current enemy lateral velocity.
      enemyHistory = String.valueOf((char) (e.getVelocity() * (Math.sin(e.getHeadingRadians() - (absoluteBearing = e.getBearingRadians() + getHeadingRadians()))))).concat(enemyHistory);   
        
      //Pattern Matching.      
      // search for a match
      while((matchPosition = enemyHistory.indexOf(enemyHistory.substring(0, integer--), 64)) < 0);

      //Stay mostly perpendicular to the enemy, but try to maintain a distance of 220 pixels.
      //SHELDOR:  Let's try 220 this time.
      setTurnRightRadians(Math.cos(e.getBearingRadians()) + ((220.0 - (integer = (int)(e.getDistance()))) * (getVelocity()  / 3200)));
   
      do
      { 
         absoluteBearing += ((short) enemyHistory.charAt(--matchPosition)) /  e.getDistance();
      }
      while ((integer -= 13) > 0);
   
      //Aim at the predicted target.
      setTurnGunRightRadians(Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians()));
   
      //Fire!
      //Bullet power must be a multiple of 0.33333... or else the gun will be inaccurate.
      //SHELDOR:  Though lower-power bullets make us easy rambot prey, they will probably result in a larger overall APS score.
      setFire(2.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333);
   
      //Infinite radar lock.
      setTurnRadarLeftRadians(getRadarTurnRemainingRadians());
   }
 
   public void onDeath(DeathEvent e)
   {
      //When the bot dies, move to the next cell in the table.
      deathCount++;
   }
 
   public void onHitWall(HitWallEvent e)
   {
      //Reverse direction.
      direction = -direction;
   }
 
   //The chance that Yatagan will reverse direction when the enemy fires.
   //Since this is an unchanging table, we can use 'final' to save a few bytes.
   private static final String chancesOfReversing = ""
   + (char)60000 + (char)0 + (char)60000 + (char) 0 + (char)60000 + (char) 0
   //100 rounds of deaths, should be enough?
   // range which will produce 'bullet hit': 3.0999 - 0.0999 = 3
   //required reverse probability, from Toorkild's formula: 0.6*sqrt((20 - 3*2.5)/160) - 0.04 ~= 0.125
   //thus 3/x = 0.125 --> x = 3/0.125 = 24
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29
   + (char) 29 + (char) 29 + (char) 29 + (char) 29 + (char) 29;
 
 
 
//Preloaded log of enemy movements for pattern matcher so it doesn't need error checking.
   static String enemyHistory = ""
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 2
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char)-2 + (char)-4 + (char)-6
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-7 + (char)-6 + (char)-5 + (char)-4
   + (char)-3 + (char)-2 + (char)-1 + (char)1
   + (char) 2 + (char) 4 + (char) 6 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 7 + (char) 6 + (char) 5 + (char) 4
   + (char) 3 + (char) 2 + (char) 1 + (char) 1;
}

Latest Released Version (1.0.5)

Codesize: 249

/*
Yatagan 1.0.6 by Sheldor & Skilgannon;  Release date:  04/25/2013
The yatagan is a short sabre which was used extensively in the Ottoman Empire.
Codesize:  249 bytes without any colors
 
Credits: 
Pattern Matching code from simonton.WeekendObsession_S and mld.Moebius, heavily modified.
And a general thanks to all open source bot authors and contributors to the RoboWiki.
 
Yatagan is open source and released under the terms of the RoboWiki Public Code License (RWPCL) - Version 1.1.
See license here: http://robowiki.net/wiki/RWPCL
*/
 
package sheldor.jk;
 
import robocode.*;
import robocode.util.Utils;
 
public class Yatagan extends AdvancedRobot
{
//Global variables.
   static double direction;
   static double enemyEnergy;
 
   static int deathCount;

   public void run()
   {
      setAdjustGunForRobotTurn(true);
   
   //Start spinning radar and initialize direction to infinity.
      setTurnRadarRightRadians(direction = Double.POSITIVE_INFINITY);
   }
 
   public void onScannedRobot(ScannedRobotEvent e)
   {
      //Local variables.
      int integer = 30;
      double absoluteBearing;
      int matchPosition;
   
      //Orbiting/Oscillating/Random movement, all depending on the size of the number you multiply the random with.
      if( (char) ((enemyEnergy - 1.09999999999 
      + chancesOfReversing.charAt(deathCount)*Math.random() 
      - (enemyEnergy = e.getEnergy()))) <= 1 )
      {
         //Reverse direction.
         //Calling the onHitWall event saves two bytes.
         onHitWall(null);
      }		
      setAhead(direction);     

      

      //Record the current enemy lateral velocity.
      enemyHistory = String.valueOf((char) (e.getVelocity() * (Math.sin(e.getHeadingRadians() - (absoluteBearing = e.getBearingRadians() + getHeadingRadians()))))).concat(enemyHistory);   
        
      //Pattern Matching.      
      // search for a match
      while((matchPosition = enemyHistory.indexOf(enemyHistory.substring(0, integer--), 64)) < 0);

      //Stay mostly perpendicular to the enemy, but try to maintain a distance of 220 pixels.
      //SHELDOR:  Let's try 220 this time.
      setTurnRightRadians(Math.cos(e.getBearingRadians()) + ((220.0 - (integer = (int)(e.getDistance()))) * (getVelocity()  / 3200)));
   
      do
      { 
         absoluteBearing += ((short) enemyHistory.charAt(--matchPosition)) /  e.getDistance();
      }
      while ((integer -= 13) > 0);
   
      //Aim at the predicted target.
      setTurnGunRightRadians(Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians()));
   
      //Fire!
      //Bullet power must be a multiple of 0.33333... or else the gun will be inaccurate.
      //SHELDOR:  Though lower-power bullets make us easy rambot prey, they will probably result in a larger overall APS score.
      setFire(2.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333);
   
      //Infinite radar lock.
      setTurnRadarLeftRadians(getRadarTurnRemainingRadians());
   }
 
   public void onDeath(DeathEvent e)
   {
      //When the bot dies, move to the next cell in the table.
      deathCount++;
   }
 
   public void onHitWall(HitWallEvent e)
   {
      //Reverse direction.
      direction = -direction;
   }
 
   //The chance that Yatagan will reverse direction when the enemy fires.
   //Since this is an unchanging table, we can use 'final' to save a few bytes.
   private static final String chancesOfReversing = ""
   + (char)60000 + (char)0 + (char)60000 + (char) 0 + (char)60000 + (char) 0
   //100 rounds of deaths, should be enough?
   // range which will produce 'bullet hit': 3.0999 - 0.0999 = 3
   //required reverse probability, from Toorkild's formula: 0.6*sqrt((20 - 3*2.5)/160) - 0.04 ~= 0.125
   //thus 3/x = 0.125 --> x = 3/0.125 = 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
   + (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24;
 
 
 
//Preloaded log of enemy movements for pattern matcher so it doesn't need error checking.
   static String enemyHistory = ""
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 2
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char) 1 + (char) 1 + (char) 1
   + (char) 1 + (char)-2 + (char)-4 + (char)-6
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-8 + (char)-8 + (char)-8 + (char)-8
   + (char)-7 + (char)-6 + (char)-5 + (char)-4
   + (char)-3 + (char)-2 + (char)-1 + (char)1
   + (char) 2 + (char) 4 + (char) 6 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 8 + (char) 8 + (char) 8 + (char) 8
   + (char) 7 + (char) 6 + (char) 5 + (char) 4
   + (char) 3 + (char) 2 + (char) 1 + (char) 1;
}