Difference between revisions of "SuperWalls"
Jump to navigation
Jump to search
(clean the code up for you) |
|||
| Line 15: | Line 15: | ||
package wiki.SuperSampleBot; | package wiki.SuperSampleBot; | ||
| − | |||
| − | |||
| − | |||
import robocode.*; | import robocode.*; | ||
| + | import robocode.util.*; | ||
import java.awt.*; | import java.awt.*; | ||
| − | |||
/** | /** | ||
* SuperWalls - a sample robot by CrazyBassoonist based on the sample robot Walls by Mathew Nelson and maintained by Flemming N. Larsen | * SuperWalls - a sample robot by CrazyBassoonist based on the sample robot Walls by Mathew Nelson and maintained by Flemming N. Larsen | ||
| − | |||
* Moves around the outer edge with two targeting systems | * Moves around the outer edge with two targeting systems | ||
*/ | */ | ||
public class SuperWalls extends AdvancedRobot { | public class SuperWalls extends AdvancedRobot { | ||
| − | static | + | static int HGShots; //Number of shots with Head-On Targeting |
| − | static | + | static int LGShots; //Number of shots with Linear Targeting |
| − | static | + | static int HGHits; //Number of hits with Head-On Targeting |
| − | static | + | static int LGHits; //Number of hits with Linear Targeting |
| − | static double HGRating;//Head-on Targeting gun's rating | + | static double HGRating; //Head-on Targeting gun's rating |
| − | static double LGRating;//Linear gun's rating | + | static double LGRating; //Linear gun's rating |
| − | + | boolean gunIdent; //Used to tell which gun we are using | |
| − | + | double moveAmount; // How much to move | |
| − | |||
| − | double moveAmount; // How much to move | ||
| − | |||
| − | |||
| − | |||
public void run() { | public void run() { | ||
| − | + | setAdjustRadarForRobotTurn(true); | |
| − | setAdjustRadarForRobotTurn(true); | + | setAdjustRadarForGunTurn(true) |
| − | setAdjustRadarForGunTurn(true) | ||
setBodyColor(Color.black); | setBodyColor(Color.black); | ||
setGunColor(Color.black); | setGunColor(Color.black); | ||
| Line 51: | Line 41: | ||
setBulletColor(Color.cyan); | setBulletColor(Color.cyan); | ||
setScanColor(Color.cyan); | setScanColor(Color.cyan); | ||
| + | |||
// Initialize moveAmount to the maximum possible for this battlefield. | // Initialize moveAmount to the maximum possible for this battlefield. | ||
moveAmount = Math.max(getBattleFieldWidth(), getBattleFieldHeight()); | moveAmount = Math.max(getBattleFieldWidth(), getBattleFieldHeight()); | ||
| − | + | ||
| − | + | setTurnRadarRight(Double.POSITIVE_INFINITY); | |
// turnLeft to face a wall. | // turnLeft to face a wall. | ||
| Line 61: | Line 52: | ||
turnLeft(getHeading() % 90); | turnLeft(getHeading() % 90); | ||
ahead(moveAmount); | ahead(moveAmount); | ||
| + | |||
// Turn the gun to turn right 90 degrees. | // Turn the gun to turn right 90 degrees. | ||
peek = true; | peek = true; | ||
turnRight(90); | turnRight(90); | ||
while (true) { | while (true) { | ||
| − | |||
| − | |||
| − | |||
// Move up the wall | // Move up the wall | ||
ahead(moveAmount); | ahead(moveAmount); | ||
| − | |||
| − | |||
// Turn to the next wall | // Turn to the next wall | ||
turnRight(90); | turnRight(90); | ||
| Line 91: | Line 78: | ||
/** | /** | ||
| − | * onScannedRobot: | + | * onScannedRobot: Fire! |
*/ | */ | ||
public void onScannedRobot(ScannedRobotEvent e) { | public void onScannedRobot(ScannedRobotEvent e) { | ||
| − | double absBearing=e.getBearingRadians()+getHeadingRadians();//The enemies location relative to us | + | double absBearing = e.getBearingRadians()+getHeadingRadians();//The enemies location relative to us |
| − | double latVel=e.getVelocity()*Math.sin(e.getHeadingRadians()-absBearing);//The enemies lateral velocity | + | double latVel = e.getVelocity()*Math.sin(e.getHeadingRadians()-absBearing);//The enemies lateral velocity |
| − | double radarTurn = | + | double radarTurn = absBearing - getRadarHeadingRadians();//The amount to turn our radar |
| − | HGRating=HGHits/HGShots;//recalculate both gun's ratings | + | double HGRating = (double) HGHits / HGShots;//recalculate both gun's ratings |
| − | LGRating=LGHits/LGShots; | + | double LGRating = (double) LGHits / LGShots; |
| − | if( | + | if( getRoundNum() == 0 || LGRating>HGRating){ //In the first round use linear targeting |
| − | + | double bulletPower = Math.min(3, e.getEnergy() / 4); | |
| − | + | setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()+Math.asin(latVel/(20 - 3 * bulletPower)));//Turn our gun | |
| − | + | LGShots++; | |
| − | + | gunIdent = true; | |
| − | + | setFire(bulletPower);//Fire the minimum amount of energy needed to finish off the other robot | |
| − | |||
| − | LGShots | ||
| − | gunIdent= | ||
| − | setFire( | ||
} | } | ||
| − | else | + | else {//in the second use head-on |
| − | setTurnGunRightRadians( | + | setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing-getGunHeadingRadians())); |
| − | HGShots | + | HGShots++; |
| − | gunIdent= | + | gunIdent=false; |
setFire(e.getEnergy()/4);//Fire the minimum amount of energy needed to finish off the other robot | setFire(e.getEnergy()/4);//Fire the minimum amount of energy needed to finish off the other robot | ||
} | } | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
setTurnRadarRightRadians(Utils.normalRelativeAngle(radarTurn)*2);//Make the radar lock on | setTurnRadarRightRadians(Utils.normalRelativeAngle(radarTurn)*2);//Make the radar lock on | ||
} | } | ||
| + | |||
public void onBulletHit(BulletHitEvent e){//add a hit to the ranking of whatever gun we were using | public void onBulletHit(BulletHitEvent e){//add a hit to the ranking of whatever gun we were using | ||
| − | if(gunIdent | + | if(gunIdent){ |
LGHits=LGHits+1; | LGHits=LGHits+1; | ||
} | } | ||
| Line 147: | Line 111: | ||
} | } | ||
} | } | ||
| − | + | </pre> | |
| − | |||
Revision as of 19:40, 1 March 2009
SuperWalls is a part of the Super Sample Bots set by CrazyBassoonist. It is intended to provide new robocoders with a new challenge after beating all of the sample robots.
Movement
SuperWalls uses the exact same movement as Walls.
Targeting
SuperWalls uses two guns, a Linear Targeting gun and a Head-On Targeting gun. It keeps track of the number and of shots and hits of each gun, and uses whichever gun works better.
Code
package wiki.SuperSampleBot;
import robocode.*;
import robocode.util.*;
import java.awt.*;
/**
* SuperWalls - a sample robot by CrazyBassoonist based on the sample robot Walls by Mathew Nelson and maintained by Flemming N. Larsen
* Moves around the outer edge with two targeting systems
*/
public class SuperWalls extends AdvancedRobot {
static int HGShots; //Number of shots with Head-On Targeting
static int LGShots; //Number of shots with Linear Targeting
static int HGHits; //Number of hits with Head-On Targeting
static int LGHits; //Number of hits with Linear Targeting
static double HGRating; //Head-on Targeting gun's rating
static double LGRating; //Linear gun's rating
boolean gunIdent; //Used to tell which gun we are using
double moveAmount; // How much to move
public void run() {
setAdjustRadarForRobotTurn(true);
setAdjustRadarForGunTurn(true)
setBodyColor(Color.black);
setGunColor(Color.black);
setRadarColor(Color.orange);
setBulletColor(Color.cyan);
setScanColor(Color.cyan);
// Initialize moveAmount to the maximum possible for this battlefield.
moveAmount = Math.max(getBattleFieldWidth(), getBattleFieldHeight());
setTurnRadarRight(Double.POSITIVE_INFINITY);
// turnLeft to face a wall.
// getHeading() % 90 means the remainder of
// getHeading() divided by 90.
turnLeft(getHeading() % 90);
ahead(moveAmount);
// Turn the gun to turn right 90 degrees.
peek = true;
turnRight(90);
while (true) {
// Move up the wall
ahead(moveAmount);
// Turn to the next wall
turnRight(90);
}
}
/**
* onHitRobot: Move away a bit.
*/
public void onHitRobot(HitRobotEvent e) {
// If he's in front of us, set back up a bit.
if (e.getBearing() > -90 && e.getBearing() < 90) {
back(100);
} // else he's in back of us, so set ahead a bit.
else {
ahead(100);
}
}
/**
* onScannedRobot: Fire!
*/
public void onScannedRobot(ScannedRobotEvent e) {
double absBearing = e.getBearingRadians()+getHeadingRadians();//The enemies location relative to us
double latVel = e.getVelocity()*Math.sin(e.getHeadingRadians()-absBearing);//The enemies lateral velocity
double radarTurn = absBearing - getRadarHeadingRadians();//The amount to turn our radar
double HGRating = (double) HGHits / HGShots;//recalculate both gun's ratings
double LGRating = (double) LGHits / LGShots;
if( getRoundNum() == 0 || LGRating>HGRating){ //In the first round use linear targeting
double bulletPower = Math.min(3, e.getEnergy() / 4);
setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()+Math.asin(latVel/(20 - 3 * bulletPower)));//Turn our gun
LGShots++;
gunIdent = true;
setFire(bulletPower);//Fire the minimum amount of energy needed to finish off the other robot
}
else {//in the second use head-on
setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()));
HGShots++;
gunIdent=false;
setFire(e.getEnergy()/4);//Fire the minimum amount of energy needed to finish off the other robot
}
setTurnRadarRightRadians(Utils.normalRelativeAngle(radarTurn)*2);//Make the radar lock on
}
public void onBulletHit(BulletHitEvent e){//add a hit to the ranking of whatever gun we were using
if(gunIdent){
LGHits=LGHits+1;
}
else{
HGHits=HGHits+1;
}
}
}