// 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;
}
}
}
//