// Put comments at Uba
package bayen; /* * ___ ___ ____ | | | | | \ / | | | | | / | | | | | | | \ / \ \___/ / | \ | | \_____/ |____/ /__/\__ Author: Bayen Last Updated: 1 - 12 - 06 || 6:16 pm /**************************************** *=* *=* *=* This code is released under the RWPCL RoboWiki Public Code License === http://robowiki.net/?RWPCL === Code was used from: MicroAspid -- Base for my movement Faclon -- My GF Gun Misc snippets from RoboWiki -- my LT gun *=* *=* *=* \****************************************/ import robocode.*; import java.awt.Color; import java.awt.geom.Point2D; import robocode.util.Utils; /** * Uba: A Robot By Bayen */ public class Uba extends AdvancedRobot { static final double BULLET_POWER = 3.0; static final double BULLET_VELOCITY = 20 - 3 * BULLET_POWER; static final int AIM_FACTORS = 25; static final int MIDDLE_FACTOR = (AIM_FACTORS - 1) / 2; static double enemyX; static double enemyY; static int[] aimFactors = new int[AIM_FACTORS]; static double FORWARD = 1;//choose forward or backward static String targeting = "linear";//the targeting type int misscount = 0; //# of times I missed double energy = Double.POSITIVE_INFINITY; String name = ""; /** * Uba's run method */ public void run() { setColors(Color.yellow,Color.blue,Color.yellow); setAdjustGunForRobotTurn(true);//allow gun and radar setAdjustRadarForGunTurn(true);//free movement targeting = "gf"; while(true){ //keep scanning execute(); turnRadarRight(Double.POSITIVE_INFINITY);//for enemies } } /** * onScannedRobot: We have a target. Go get it. */ //This onScannedRobot "we have a target" phrase //is from the original base for this bot, //TrackFire. So I am leaving there as a tribute //to Uba's heritage public void onScannedRobot(ScannedRobotEvent e) { if(e.getEnergy() == 0){ setTurnRight(e.getBearing()); setAhead(e.getDistance()); return; } if(getOthers() > 1){ if(e.getDistance() < 100){ setTurnRight(e.getBearing()); setBack(100); } if(getX() <200){ setTurnLeft(getHeading() - 90); setBack(50); } if(getX() < getBattleFieldWidth() - 200){ setTurnLeft(getHeading() - 270); setBack(50); } if(getY() < 200){ setTurnLeft(getHeading() - 180); setBack(50); } if(getY() < getBattleFieldHeight() - 200){ setTurnLeft(getHeading()); setBack(50); } if(e.getEnergy() > energy && getOthers() > 1 && e.getName()!=name){ setTurnRadarRight(360); } else{ energy = e.getEnergy(); name = e.getName(); }} double enemyAbsoluteBearing = 0; int mostVisited = 0; int i = 0; Wave wave; addCustomEvent(wave = new Wave()); wave.wBearingDirection = 0; enemyAbsoluteBearing = getHeadingRadians() + e.getBearingRadians(); enemyX = (wave.wGunX = getX()) + Math.sin(enemyAbsoluteBearing) * e.getDistance(); enemyY = (wave.wGunY = getY()) + Math.cos(enemyAbsoluteBearing) * e.getDistance(); wave.wBearingDirection = (e.getVelocity() * Math.sin(e.getHeadingRadians() - enemyAbsoluteBearing) < 0 ? -1.0/MIDDLE_FACTOR : 1.0/MIDDLE_FACTOR) ; wave.wBearing = enemyAbsoluteBearing; mostVisited = 0; i = 0; do { if (aimFactors[i] > aimFactors[mostVisited]) mostVisited = i; i++; } while (i < AIM_FACTORS); /**One-on-One movement (zigsags)** \* Based From MicroAspid */ if(getOthers() == 1){ if (getDistanceRemaining() == 0) {FORWARD =-FORWARD; setAhead(185 * Math.random() * FORWARD);} setTurnRightRadians(e.getBearingRadians() +Math.PI/2-0.5236*FORWARD *(e.getDistance()>200?1:-1));} //**Melee Movement--Random!**\ if(getOthers() > 1){ if(getDistanceRemaining() == 0){setAhead(200 * Math.random()*FORWARD); FORWARD=-FORWARD;} if(getTurnRemaining() == 0) setTurnRightRadians(2* Math.random()*FORWARD); } if(misscount > 1){ if(getOthers() > 1){ setTurnRadarRight(360); misscount = 0; execute(); } } /*****LINEAR FACTOR TARGETING***** \* From The Wiki */ if(targeting == "linear" || getOthers() > 1){ double bulletPower = Math.min(3.0 ,getEnergy()); if(getOthers() == 1){ if(e.getDistance() > 290) bulletPower = 2.0; if(e.getDistance() > 390) bulletPower = 1.0;} double myX = getX();double myY = getY(); double absoluteBearing = getHeadingRadians() + e.getBearingRadians(); double enemyX = getX() + e.getDistance() * Math.sin(absoluteBearing); double enemyY = getY() + e.getDistance() * Math.cos(absoluteBearing); double enemyHeading = e.getHeadingRadians(); double enemyVelocity = e.getVelocity(); double deltaTime = 0; double battleFieldHeight= getBattleFieldHeight(),battleFieldWidth= getBattleFieldWidth(); double predictedX = enemyX, predictedY = enemyY; while((++deltaTime)*(20.0 - 3.0*bulletPower) <Point2D.Double.distance(myX, myY, predictedX, predictedY)){ predictedX += Math.sin(enemyHeading) * enemyVelocity; predictedY += Math.cos(enemyHeading) * enemyVelocity; if( predictedX < 18.0 || predictedY < 18.0 || predictedX > battleFieldWidth - 18.0 || predictedY > battleFieldHeight - 18.0){ predictedX = Math.min(Math.max(18.0, predictedX), battleFieldWidth - 18.0); predictedY = Math.min(Math.max(18.0, predictedY), battleFieldHeight - 18.0);break;}} double theta = Utils.normalAbsoluteAngle(Math.atan2(predictedX - getX(), predictedY - getY())); setTurnRadarRightRadians (Utils.normalRelativeAngle(absoluteBearing - getRadarHeadingRadians())); setTurnGunRightRadians(Utils.normalRelativeAngle(theta - getGunHeadingRadians())); fire(bulletPower); } /*****GUESS FACTOR TARGETING***** \* From Falcon */ if(targeting=="gf" && getOthers() == 1){ setTurnGunRightRadians(Utils.normalRelativeAngle( enemyAbsoluteBearing - getGunHeadingRadians() + wave.wBearingDirection * (mostVisited - MIDDLE_FACTOR))); setFire(BULLET_POWER); setTurnRadarLeft(getRadarTurnRemaining()); } } /** * onHitByBullet: Attack them instead */ public void onHitByBullet(HitByBulletEvent e) { energy = Double.POSITIVE_INFINITY; name = e.getName(); turnRadarRight(e.getBearing()); } /** * onHitRobot: Back off and attack them! */ public void onHitRobot(HitRobotEvent e) { energy = e.getEnergy(); name = e.getName(); FORWARD =-FORWARD; setAhead(185 * Math.random() * FORWARD); turnRadarRight(e.getBearing()); } /** * onHitWall: Bounce off! */ public void onHitWall(HitWallEvent e) { FORWARD =-FORWARD; setAhead(185 * Math.random() * FORWARD); } /** * onBulletMissed: Tally up misses */ public void onBulletMissed(BulletMissedEvent e) { misscount++; if(misscount > 2){ misscount = 0; if(targeting=="linear") targeting = "gf"; else if(targeting=="gf") targeting = "linear"; } } public void onBulletHit(BulletHitEvent e) { misscount = 0; } public void onRobotDeath(RobotDeathEvent e){ if(e.getName() == name) energy = Double.POSITIVE_INFINITY; } class Wave extends Condition { double wGunX; double wGunY; double wBearing; double wBearingDirection; double wDistance; public boolean test() { if ((wDistance += BULLET_VELOCITY) > Point2D.distance(wGunX, wGunY, enemyX, enemyY)) { try { aimFactors[(int)((Utils.normalRelativeAngle(Math.atan2(enemyX - wGunX, enemyY - wGunY) - wBearing)) / wBearingDirection) + MIDDLE_FACTOR]++; } catch (Exception e) { } removeCustomEvent(this); } return false; } } } //