SuperWalls

From Robowiki
Revision as of 20:40, 1 March 2009 by Nat (talk | contribs) (clean the code up for you)
Jump to navigation Jump to search

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