double bulletPower=Math.min(Math.min(target.energy/4,1200/target.distance),myEnergy/10)/(getTime()-target.ctime); |
double bulletPower=Math.min(Math.min(target.energy/4,1200/target.distance),myEnergy/10)/Math?.max(getTime()-target.ctime,0); |
import robocode.*; import robocode.util.Utils; import java.awt.geom.*; import java.util.*; /** * Lightning - a robot by Starrynte * Changes * ------------------------------------------------------------------ * Version 0.1 * Created! * * */ public class Lightning extends AdvancedRobot { static Hashtable enemies=new Hashtable(); static Point2D.Double nextDestination,lastPosition,myPos,center; static Rectangle2D.Double field; static Enemy target; static double myEnergy,myGunHeat,myGunHeading,myHeading; static int timeSinceLastScan; public void run() { initBattle(); while(true){ doMovement(); doGun(); execute(); } } public void onScannedRobot(ScannedRobotEvent e) { myPos=new Point2D.Double(getX(),getY()); myEnergy=getEnergy(); myGunHeat=getGunHeat(); myGunHeading=getGunHeadingRadians(); myHeading=getHeadingRadians(); Enemy en=(Enemy)enemies.get(e.getName()); if(en==null){ en=new Enemy(); enemies.put(e.getName(),en); } en.name=e.getName(); en.energy=e.getEnergy(); en.location=projectPoint(myPos,e.getBearingRadians()+getHeadingRadians(),e.getDistance()); en.distance=e.getDistance(); en.heading=e.getHeadingRadians(); en.velocity=e.getVelocity(); en.ctime=e.getTime(); en.live=true; if((!target.live) || getTime()-target.ctime>20 || (en.distance<target.distance*0.9 && myGunHeat/getGunCoolingRate()>5)){ if(!target.name.equals(en.name)){ target=en; } } } public void onHitByBullet(HitByBulletEvent e) { } public boolean initBattle(){ enemies=new Hashtable(); nextDestination=lastPosition=myPos=new Point2D.Double(getX(),getY()); field=new Rectangle2D.Double(36,getBattleFieldHeight()-36,getBattleFieldWidth()-72,getBattleFieldHeight()-72); target=new Enemy(); center=new Point2D.Double(getBattleFieldWidth()/2,getBattleFieldHeight()/2); timeSinceLastScan=0; setTurnRadarRightRadians(Double.POSITIVE_INFINITY); setAdjustGunForRobotTurn(true); setAdjustRadarForRobotTurn(true); return true; } public boolean doMovement(){ if(nextDestination.distanceSq(myPos)<1000 || target.extrapolate(getTime()).location.distance(myPos)<90){ boolean changed=false; for(int i=0;i<100;i++){ double ang=(2*Math.PI)*Math.random(); double dist=Math.min(target.extrapolate(getTime()).location.distance(myPos)*0.8,100+200*Math.random()); Point2D.Double testPoint=projectPoint(myPos,ang,dist); if(field.contains(testPoint) && evaluate(testPoint)<evaluate(nextDestination)){ nextDestination=testPoint; changed=true; } if(timeSinceLastScan>20 && field.contains(testPoint)){ nextDestination=testPoint; break; } } if(changed){ lastPosition=myPos; } }else{ double dir=1; double ang=calcAngle(myPos,nextDestination)-getHeadingRadians(); double dist=nextDestination.distance(myPos); if(Math.cos(ang)<0){ dir=-1; ang+=Math.PI; } ang=Utils.normalRelativeAngle(ang); setTurnRightRadians(ang); setAhead(dist*dir); setMaxVelocity((Math.abs(ang)>1) ? 0.1 : 8); } return true; } public boolean doGun(){ if(target.location!=null){ double absBearing=calcAngle(myPos,target.location); double bulletPower=Math.min(Math.min(target.energy/4,1200/target.distance),myEnergy/10)/Math.max(getTime()-target.ctime,0); if(Math.abs(getGunTurnRemainingRadians())<0.01){ setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing-myGunHeading)); } if(myGunHeat==0){ setFire(bulletPower); } } return true; } public double evaluate(Point2D.Double point){ long time=getTime(); double risk=0; Enumeration e=enemies.elements(); while(e.hasMoreElements()){ Enemy en=(Enemy)e.nextElement(); double eval=(en.energy+25)/en.extrapolate(time).location.distanceSq(myPos); int enTargets=0; Enumeration enEn=enemies.elements(); while(enEn.hasMoreElements()){ Enemy enE=(Enemy)enEn.nextElement(); if((!enE.name.equals(en.name)) && enE.live && enE.extrapolate(time).location.distanceSq(en.extrapolate(time).location)*0.9<point.distanceSq(en.extrapolate(time).location)){ enTargets++; } } if(enTargets<=1){ eval*=2; eval*=1+Math.abs(Math.cos(calcAngle(point,myPos)-calcAngle(point,en.extrapolate(time).location))); } if(new Line2D.Double(myPos,point).intersects(new Rectangle2D.Double(en.extrapolate(time).location.getX()-18,en.extrapolate(time).location.getY()-18,36,36))){ eval*=2; } risk+=eval; } risk+=1/lastPosition.distanceSq(point) + 0.8/myPos.distanceSq(point) + 0.5/center.distanceSq(point); return risk; } public double calcAngle(Point2D.Double source,Point2D.Double target){ return Math.atan2(target.getX()-source.getX(),target.getY()-source.getY()); } public Point2D.Double projectPoint(Point2D.Double sourceLocation, double angle, double length) { return new Point2D.Double(sourceLocation.getX() + Math.sin(angle) * length, sourceLocation.getY() + Math.cos(angle) * length); } }I need help on this as well! --Starrynte
The problem I see is that Lightning sometimes divides by zero when computing bullet power, giving an unreal answer. When it shoots the same tick as it scanned its target, getTime() - target.ctime is 0. -- Kev