Sits still and fires full power bullets using
CircularTargeting. Source code is included. Written by David Alves and adapted for circular targeting by
GrubbmGait.
/*
* Created on Sep 17, 2004
* Adapted on Jan 16, 2006
*
*/
package wiki.challenge;
import java.awt.geom.Point2D;
import robocode.AdvancedRobot;
import robocode.ScannedRobotEvent;
import robocode.util.Utils;
/**
* @author David Alves
* adapted for circular targeting by GrubbmGait
*
* For more information about the Wave Surfing Challenge, visit
* <a href="http://robowiki.net/perl/robowiki?WaveSurfingChallenge">http://robowiki.net/perl/robowiki?WaveSurfingChallenge</a>
*
* This robot sits still and fires at its opponent using circular targeting.
*
*/
public class WaveSurfingChallengeBotC extends AdvancedRobot{
double oldEnemyHeading;
public void run(){
setAdjustRadarForGunTurn(true);
do{
turnRadarRightRadians(Double.POSITIVE_INFINITY);
} while(true);
}
public void onScannedRobot(ScannedRobotEvent e){
double bulletPower = Math.min(3.0,getEnergy());
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 enemyHeadingChange = enemyHeading - oldEnemyHeading;
double enemyVelocity = e.getVelocity();
oldEnemyHeading = enemyHeading;
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;
enemyHeading += enemyHeadingChange;
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(3);
}
}