Talk:DemonicRage
DemonicRagev3.0
- Lately I have completely rebuilt and improved Demonics foundation (still based on Module) I implemented Rednaxela's tree into a bare bones version of D's gun, which I plan to later expand after the new movement is fleshed out. The gun's new PIF I made should be quite quick. I'm not sure how it compares to displacement vectors or if it's type has been done before, but I will post it and D's Radar source code next chance I have.
Source Code
- I left it as is, with code commented out in case someOne wants to play with it..
/* author: Justin Mallais */ package justin.radar; import robocode.Event; import robocode.ScannedRobotEvent; import robocode.RobotDeathEvent; import robocode.util.Utils; import justin.Module; import justin.Radar; import justin.Enemy; import java.util.Iterator; //import java.awt.geom.Point2D; //import java.awt.Graphics2D; public class DynamicLocking extends Radar { public DynamicLocking(Module bot) { super(bot); } static final double PI = Math.PI; static double radarDirection = 1; static Enemy lookingFor = new Enemy();; public void scan(){ if(bot.getRadarTurnRemaining()==0 ){ double radarTurn = Double.POSITIVE_INFINITY * radarDirection; bot.setTurnRadarRightRadians(radarTurn);// the scan } } public void listen(Event e){ if (e instanceof RobotDeathEvent && (( RobotDeathEvent)e).getName()== lookingFor.name){ if(bot.enemy!=null) lookingFor.name=bot.enemy.name; } if (e instanceof ScannedRobotEvent){ if(Module.enemies.size() < bot.getOthers()) return; // not perfect if(lookingFor.name == null)lookingFor.name = ((ScannedRobotEvent) e).getName(); if( ((ScannedRobotEvent) e).getName()==lookingFor.name) { Iterator<Enemy> iterator= Module.enemies.values().iterator(); double bestScore=Double.POSITIVE_INFINITY; while (iterator.hasNext()){ Enemy tank= iterator.next(); if(tank.alive){ // choose next tank to scan double time = tank.scanTime; double sweepSize = (Math.abs(Utils.normalRelativeAngle(tank.absBearingRadians - bot.getRadarHeadingRadians())) /PI); //1 needs the scan int distance = (int)Math.round((Math.min(1000,tank.distance)/1000*3)); // 1 needs the scan distance = ( distance ==3 && bot.getOthers()>4 ) ? 10 : 0; // farthest not a concern // int priority = 0; // if( (tank.name==bot.enemy.name || tank.name == bot.myClosestBot.name || bot.myLocation.distance(tank.location)<tank.cbD || bot.getOthers()<4)){ // priority = -5; // } double score = time - sweepSize;// + distance + priority; // scan target before he fires /* double ang = lookingFor.absBearing + (lookingFor.deltaAbsBearing); double turnsB4ScanBot = Utils.normalRelativeAngle(Math.abs( (bot.getRadarHeadingRadians()-ang) ))/.785; double sS = bot.getTime()-lookingFor.timeScanned; if(enemy.name == lookingFor.name && (bot.getGunHeat()/bot.getGunCoolingRate())-turnsB4ScanBot < 2 && sS > 1)score=score-25; */ // scan Target before we fire at him /* if (tank.name==bot.enemy.name && ticksUntilGunCool() < bot.enemy.timeSinceLastScan +2 ) { score = score - 10; // score is based on time } */ if(score < bestScore){ bestScore = score; lookingFor = tank; } } } // the scan double angle = lookingFor.absBearingRadians-(lookingFor.deltaAbsBearingRadians*2); // + lookingFor.deltaBearing;// should be much more accurate to use below radarDirection =(int) Math.signum(Utils.normalRelativeAngle(angle - bot.getRadarHeadingRadians())); double turnsTillScanBot = Utils.normalRelativeAngle(Math.abs( (bot.getRadarHeadingRadians()-angle) ))/.7; double radarTurn = Double.POSITIVE_INFINITY * radarDirection; // int timeSinceScanned = (int) bot.getTime()-lookingFor.timeScanned; // radar Lock if(lookingFor.deltaScanTime < 1.1 && turnsTillScanBot < 1){ //System.out.println(lookingFor.deltaBearing+" ss "+lookingFor.timeSinceLastScan+" d " +lookingFor.distance); double offset =0;// = radarsMaxEscapeAngle(lookingFor.distance,sinceScanned) * radarDirection; // a small offset based on escape angle offset = offset + ( Math.abs(lookingFor.deltaAbsBearingRadians * 3 ) ); // greater offset for lateral speed offset = offset + (20* (lookingFor.deltaScanTime)) / (lookingFor.distance); // greater offset for smaller distance offset = offset * radarDirection; radarTurn =(Utils.normalRelativeAngle(angle - bot.getRadarHeadingRadians()+offset)); } bot.setTurnRadarRightRadians(radarTurn);// the scan } } } /* public void onPaint(Graphics2D g){ if(lookingFor!=null&&lookingFor.location !=null){ g.setColor(new Color(0, 0, 255, 70)); g.fillRect((int)lookingFor.location.x-25,(int)lookingFor.location.y-25,50,50); } } */ // utils /* protected long ticksUntilGunCool() { return Math.round(Math.ceil(bot.getGunHeat() / bot.getGunCoolingRate())); } public static double radarsMaxEscapeAngle(double distance, double sinceScanned) { return Math.asin( 8/ (distance-(8*sinceScanned))) * sinceScanned ;// } */ }
- ///// DataLog is a linked list of scan info(I should rename it to HistoryLog). //Enemy is additional scan info (current)
//Play It Forward by Justin Mallais public Angle getGunAngle(DataLog similar, Enemy e ,double bulletSpeed, long time, double weight){// GunData predictedInfo, Enemy e) { final DataLog predictedInfo = similar; final DataLog currInfo = e.last; DataLog endInfo = predictedInfo; double bulletTime; long timeDelta = (time - currInfo.scanTime); double predDist = 0, predAng; Point2D.Double myRelativePosition = project(predictedInfo.location, Utils.normalRelativeAngle(currInfo.absBearingRadians + FastTrig.PI-currInfo.headingRadians+predictedInfo.headingRadians), currInfo.distance); while (endInfo.next != null && endInfo.round == predictedInfo.round && endInfo.scanTime >= predictedInfo.scanTime ) { endInfo = endInfo.next; bulletTime = (myRelativePosition.distance(endInfo.location) / bulletSpeed) +1; if (Math.abs(endInfo.scanTime - predictedInfo.scanTime - timeDelta - bulletTime) <= 1) break; } if ( endInfo.next == null | endInfo.round != predictedInfo.round )return null; predAng = Utils.normalRelativeAngle(DRUtils.absoluteBearing(predictedInfo.location, endInfo.location) - predictedInfo.headingRadians ); predDist = predictedInfo.location.distance(endInfo.location); Point2D.Double predLocation = project(currInfo.location,Utils.normalRelativeAngle(predAng+currInfo.headingRadians),predDist); if(!Module.bf.contains(predLocation)) return null; predAng = DRUtils.absoluteBearing(bot.myData.location, predLocation); predDist = bot.myData.location.distance( predLocation); Angle angle = new Angle( predAng, FastTrig.atan(18 / predDist), 0, weight ); // returns: predicted angle, tolerence, return angle; }
- [View source↑]
- [History↑]
You cannot post new threads to this discussion page because it has been protected from new threads, or you do not currently have permission to edit.
There are no threads on this page yet.