Difference between revisions of "SuperWalls"

From Robowiki
Jump to navigation Jump to search
(clean the code up for you)
m
Line 28: Line 28:
 
static int HGHits;      //Number of hits with Head-On Targeting
 
static int HGHits;      //Number of hits with Head-On Targeting
 
static int 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 LGRating; //Linear gun's rating
 
 
boolean gunIdent;      //Used to tell which gun we are using
 
boolean gunIdent;      //Used to tell which gun we are using
 
double moveAmount;      // How much to move
 
double moveAmount;      // How much to move
Line 54: Line 52:
  
 
// Turn the gun to turn right 90 degrees.
 
// Turn the gun to turn right 90 degrees.
peek = true;
 
 
turnRight(90);
 
turnRight(90);
 
while (true) {
 
while (true) {
Line 81: Line 78:
 
*/
 
*/
 
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 = absBearing - getRadarHeadingRadians();//The amount to turn our radar
+
double radarTurn = absBearing - getRadarHeadingRadians();// The amount to turn our radar
double HGRating = (double) HGHits / HGShots;//recalculate both gun's ratings
+
 
 +
double HGRating = (double) HGHits / HGShots;
 
double LGRating = (double) LGHits / LGShots;
 
double LGRating = (double) LGHits / LGShots;
if( getRoundNum() == 0 || LGRating>HGRating){ //In the first round use linear targeting
+
 
 +
if (getRoundNum() == 0 || LGRating>HGRating){ // In the first round use linear targeting
 
double bulletPower = Math.min(3, e.getEnergy() / 4);
 
double bulletPower = Math.min(3, e.getEnergy() / 4);
setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()+Math.asin(latVel/(20 - 3 * bulletPower)));//Turn our gun
+
setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing - getGunHeadingRadians() + Math.asin(latVel / (20 - 3 * bulletPower)));// Turn our gun
 
LGShots++;
 
LGShots++;
 
gunIdent = true;
 
gunIdent = true;
setFire(bulletPower);//Fire the minimum amount of energy needed to finish off the other robot
+
setFire(bulletPower);// Fire the minimum amount of energy needed to finish off the other robot
}
+
} else { //in the second use head-on
else {//in the second use head-on
+
setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing - getGunHeadingRadians()));
setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing-getGunHeadingRadians()));
 
 
HGShots++;
 
HGShots++;
gunIdent=false;
+
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;
 
}
 
}
 
else{
 
else{
HGHits=HGHits+1;
+
HGHits = HGHits+1;
 
}
 
}
 
}
 
}
 
}
 
}
 
</pre>
 
</pre>

Revision as of 20:43, 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
	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.
		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;
		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;
		}
	}
}