Bots using this Movement:
Sample code(stelo.MirrorNano 1.1's):
// MirrorNano
// codesize 247
// author Stelokim
package stelo;
import robocode.*;
//import java.awt.Color;
import robocode.util.Utils;
import java.util.*;
import java.awt.geom.*;
// mirror movement
public class MirrorNano extends AdvancedRobot
{
static double centerX, centerY;
//Point2D robotLocation;
//Point2D enemyLocation;
static double enemyAbsoluteBearing;
static double lastEnemyAbsoluteBearing;
static double enemyEnergy;
public void run() {
// After trying out your robot, try uncommenting the import at the top,
// and the next line:
//setColors(Color.red,Color.blue,Color.green);
centerX = getBattleFieldWidth() / 2.0;
centerY = getBattleFieldHeight() / 2.0;
//enemyLocation = new Point2D.Double();
//while(true) {
turnRadarRightRadians(Double.POSITIVE_INFINITY);
//}
}
/**
* onScannedRobot: What to do when you see another robot
*/
public void onScannedRobot(ScannedRobotEvent e) {
double enemyX, enemyY;
//robotLocation = new Point2D.Double(myX, myY);
enemyAbsoluteBearing = getHeadingRadians() + e.getBearingRadians();
//enemyLocation = vectorToLocation(enemyAbsoluteBearing, enemyDistance, robotLocation);
enemyX = getX() + Math.sin(enemyAbsoluteBearing) * e.getDistance();
enemyY = getY() + Math.cos(enemyAbsoluteBearing) * e.getDistance();
// attack
// HeadOnTargeting
//setTurnGunRightRadians(Utils.normalRelativeAngle(enemyAbsoluteBearing - getGunHeadingRadians()));
// AngularTargeting
setTurnGunRightRadians(Utils.normalRelativeAngle(enemyAbsoluteBearing - getGunHeadingRadians() + 2.0 * (enemyAbsoluteBearing - lastEnemyAbsoluteBearing)));
//fire(getEnergy() * 25.0 / e.getDistance());
fire(getEnergy() * 10.0 / e.getDistance());
//fire(getEnergy() * 2000.0 / e.getDistance() / e.getDistance());
lastEnemyAbsoluteBearing = enemyAbsoluteBearing;
// move (StopNMirror)
if (enemyEnergy > (enemyEnergy = e.getEnergy())) {
//goTo(new Point2D.Double(2.0 * centerX - enemyLocation.getX(), 2.0 * centerY - enemyLocation.getY()));
double destinationX, destinationY;
//destinationX = 2.0 * centerX - enemyX;
//destinationY = 2.0 * centerY - enemyY;
// slightly closer to the enemy to avoid wall collision
destinationX = 1.8 * centerX - 0.8 * enemyX;
destinationY = 1.8 * centerY - 0.8 * enemyY;
double angle = Utils.normalRelativeAngle(Math.atan2(destinationX - getX(), destinationY - getY()) - getHeadingRadians());
double turnAngle = Math.atan(Math.tan(angle));
setTurnRightRadians(turnAngle);
//setAhead(Math.sqrt((getX() - destinationX) * (getX() - destinationX) + (getY() - destinationY) * (getY() - destinationY)) * (angle == turnAngle ? 1 : -1));
setAhead((angle == turnAngle ? 50 : -50)); // due to code size
}
// Lock Radar Infinite style. About a 99% lock rate - plus good melee coverage.
setTurnRadarLeftRadians(getRadarTurnRemaining());
}
}
This bot moves such a way symmetric with respect to the battle field center point.
-- Stelokim
An early version of Beowulf used this type of movement, but I added something that every 500 or so rounds my bot flipped copied coordiantes(never the same as the enemy though that would make a decent rammer), sometimes mirrored over X or sometimes over Y and sometimes both. It was rather effective vs anti-mirror as it picked which kind of mirror at random (though you could do something like a virtual gun, e.g. virtual movement to pick the best ways to copy and rank em or what not), I also added something that made it so my bot would flow around the enemy if it was within 20 distance. I was going to add wall smoothing(and wall advoidance of course) but by that time I had dropped the idea. (Note: its better against an anti-mirror gun, but said gun is still gonna pick it apart) --Chase-san