Difference between revisions of "SuperWalls"

From Robowiki
Jump to navigation Jump to search
(clean the code up for you)
Line 15: Line 15:
 
package wiki.SuperSampleBot;
 
package wiki.SuperSampleBot;
  
import robocode.HitRobotEvent;
 
import robocode.Robot;
 
import robocode.ScannedRobotEvent;
 
 
import robocode.*;
 
import robocode.*;
 +
import robocode.util.*;
 
import java.awt.*;
 
import java.awt.*;
import robocode.util.Utils;
 
  
 
/**
 
/**
 
  * 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
* <p/>
 
 
  * 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 double HGShots;//Number of shots with Head-On Targeting
+
static int HGShots;     //Number of shots with Head-On Targeting
static double LGShots;//Number of shots with Linear Targeting
+
static int LGShots;     //Number of shots with Linear Targeting
static double HGHits;//Number of hits with Head-On Targeting
+
static int HGHits;     //Number of hits with Head-On Targeting
static double LGHits;//Number of hits with Linear Targeting
+
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
static double roundNum;//Number of rounds
+
boolean gunIdent;       //Used to tell which gun we are using
double gunIdent;//Used to tell which gun we are using
+
double moveAmount;     // How much to move
boolean peek; // Don't turn if there's a robot there
 
double moveAmount; // How much to move
 
  
/**
 
* run: Move around the walls
 
*/
 
 
public void run() {
 
public void run() {
roundNum=roundNum+1;//update number of rounds
+
setAdjustRadarForRobotTurn(true);
setAdjustRadarForRobotTurn(true);//keeps our radar from moving with our gun
+
setAdjustRadarForGunTurn(true)
setAdjustRadarForGunTurn(true);//keeps our radar from moving with our robot
 
 
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());
// Initialize peek to false
+
 
peek = false;
+
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) {
setTurnRadarRightRadians(10000);
 
// Look before we turn when ahead() completes.
 
peek = true;
 
 
// Move up the wall
 
// Move up the wall
 
ahead(moveAmount);
 
ahead(moveAmount);
// Don't look now
 
peek = false;
 
 
// Turn to the next wall
 
// Turn to the next wall
 
turnRight(90);
 
turnRight(90);
Line 91: Line 78:
  
 
/**
 
/**
* onScannedRobot: Fire!
+
* 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 =getHeadingRadians() + e.getBearingRadians() - getRadarHeadingRadians();//The amount to turn our radar
+
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(roundNum==1){//In the first round use linear targeting
+
if( getRoundNum() == 0 || LGRating>HGRating){ //In the first round use linear targeting
if(e.getEnergy()>=16){
+
double bulletPower = Math.min(3, e.getEnergy() / 4);
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()+latVel/11));//Turn our gun
+
setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()+Math.asin(latVel/(20 - 3 * bulletPower)));//Turn our gun
}
+
LGShots++;
else{
+
gunIdent = true;
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()+latVel/(e.getEnergy()/4)));//Turn our gun
+
setFire(bulletPower);//Fire the minimum amount of energy needed to finish off the other robot
}
 
LGShots=LGShots+1;
 
gunIdent=111;
 
setFire(e.getEnergy()/4);//Fire the minimum amount of energy needed to finish off the other robot
 
 
}
 
}
else if(roundNum==2){//in the second use head-on
+
else {//in the second use head-on
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()));
+
setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()));
HGShots=HGShots+1;
+
HGShots++;
gunIdent=222;
+
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
 
}
 
}
else{//after that...
 
if(LGRating>HGRating){//use whichever gun has the highest rating
 
if(e.getEnergy()>=16){
 
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()+latVel/11));//Turn our gun
 
}
 
else{
 
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()+latVel/(e.getEnergy()/4)));//Turn our gun
 
}
 
LGShots=LGShots+1;
 
gunIdent=111;
 
setFire(e.getEnergy()/4);//Fire the minimum amount of energy needed to finish off the other robot
 
}
 
else if(LGRating<=HGRating){
 
setTurnGunRightRadians(robocode.util.Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()));
 
HGShots=HGShots+1;
 
gunIdent=222;
 
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==111){
+
if(gunIdent){
 
LGHits=LGHits+1;
 
LGHits=LGHits+1;
 
}
 
}
Line 147: Line 111:
 
}
 
}
 
}
 
}
+
</pre>
</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;
		}
	}
}