package cx.sonnet;
import robocode.*;
import java.util.Vector;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
/**
*-----------------------------------------------------------------
* @author:iiley (iiley@hotmail.com)
* http://www.robochina.org
* Ash:When you are smoking by the window,you will see the ash flying...
* ash is a microbot with the Cigaret's move scheme ... and a similar to Spark's gun.
* SonAsh: a sonnet version of Ash,14 lines.Squeezed from FemtoAsh,so it performace same to FemtoAsh.
*--------------------version 0.7 2003.9.14--------------
* 0.7:first released version.With a mine version symbol PM.
* Thanks kawigi for his open source nanobots,i learned much more from his bot FunkyFemto and FunkyMusic.
*--------------------version 0.7 2003.9.15--------------
* 0.8:Thanx Kawigi that told me how to make this runnalbe in JVM 1.3.
*+++++++++++++++++++++++++++++++++Open Source+++++++++++++++++++++++++++
*--
* This bot is open source.
* - Don't just copy-paste the code .
* - Don't just copy-paste and then improve.(I don't want to fight modified versions of my own bot)
* - Maybe some useful skill in this codes,if you use,Make your bot open source
* - And preferably give credit.:)
*
* If you want to know more or suggest,
* email me or post messages on www.robochina.org or www.robocoderepository's forums.
* every messages will be pleasent.
*--
*/
public class SonAsh extends AdvancedRobot
{
private static Object e_energy=new double[1],pattern = new StringBuffer(),nextP,myP,enemyP;
public void run( ) {
setAdjustGunForRobotTurn(true);
setAdjustRadarForGunTurn(true);
while(true){
turnRadarRightRadians(1);
}
}
public void onScannedRobot( ScannedRobotEvent e ) {
double absBearing,edistance,moveDistance,moveAngle,dist=0,index=0,searchlength = 80,power=Math.min(600d/e.getDistance()+0.5d,Math.min(getEnergy()/5d,Math.min(3d,e.getEnergy()/5d)));
//--------------movement---------------------
if((enemyP=nextPoint((Point2D.Double)(myP=new Point2D.Double(getX(),getY())),absBearing=e.getBearingRadians()+getHeadingRadians(),moveDistance=edistance=e.getDistance()))!=null && ((double[])e_energy)[0]!=(((double[])e_energy)[0]=e.getEnergy()) && Math.abs(getDistanceRemaining())<53d){
while(!new Rectangle2D.Double(23D, 23D, getBattleFieldWidth()-46D, getBattleFieldHeight()-46D).contains((Point2D.Double)(nextP=nextPoint(((Point2D.Double)enemyP),absBearing+(moveAngle=Math.random()*1.6d-0.8d),-(moveDistance-=10d)/Math.cos(moveAngle)))));
setAhead((( moveAngle = robocode.util.Utils.normalRelativeAngle(Math.atan2( ((Point2D.Double)nextP).x-((Point2D.Double)myP).x,((Point2D.Double)nextP).y-((Point2D.Double)myP).y) - getHeadingRadians() ) ) == ( moveDistance = Math.atan( Math.tan( moveAngle ) ) ) ? 1 : - 1 ) * ((Point2D.Double)myP).distance(((Point2D.Double)nextP)) ); //move towards point
setTurnRightRadians( moveDistance );
}
//-----------------pattern analyser--------------------
if(getGunHeat()<0.4d){
try{
if(((StringBuffer)pattern).insert(0,new char[]{(char)(e.getHeadingRadians()/0.3927+8),(char)e.getVelocity()})!=null || true)
while ((index = ((StringBuffer)pattern).indexOf(((StringBuffer)pattern).substring(0, (int)(searchlength-=2)), 1)+1) < 20);
while((++dist)*(20d-power*3d) - ((Point2D.Double)myP).distance((Point2D.Double)(enemyP=nextPoint(((Point2D.Double)enemyP),((byte)(((StringBuffer)pattern).toString().charAt((int)(--index)))-8)*0.3927,((byte)((StringBuffer)pattern).toString().charAt((int)(--index))))))<0);
}catch(Exception ee){}
}
if(getEnergy()>power+0.1) if(setFireBullet(power)==null || true) setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(Math.atan2(((Point2D.Double)enemyP).x-((Point2D.Double)myP).x,((Point2D.Double)enemyP).y-((Point2D.Double)myP).y) - getGunHeadingRadians()));
//----------------radar------------------------------------
setTurnRadarRightRadians(Math.sin(absBearing - getRadarHeadingRadians()));
scan();
}
public static Point2D.Double nextPoint(Point2D.Double originPoint,double angle,double distance){
return new Point2D.Double(originPoint.x+Math.sin(angle)*distance,originPoint.y+Math.cos(angle)*distance);
}
}
OK~~Thanx.~;] -- iiley
This sonnet development doesn't exactly help making our bot code more readable. =) -- PEZ
changed. Yes,you are right PEZ,i do not like to make sonnet,i like femto and haiku.~;]sonnet is worse than mini,so you can see there are only 2 or 3 sonnet this time but many femto. -- iiley
Sonnets are much more complex to write than a femto or haiku, that's for sure. Of course, David and I were agreeing that while the state of the art in nanos always gets simplified and shrunk, the state of the art in line-based bots will continually get more complex. -- Kawigi
That's partly because we now count semicolons I think. In any case, it's even more silly than minibot coding. But fun for a change. I like the immediate trade-off situations when producing haikus. -- PEZ
...or especially when making femtos. But you're right. It's self-code-obfuscation as an art. I suspect it will be almost comical to look at a Sonnet sometimes.