[Home]UbaSource

Robo Home | Changes | Preferences | AllPages

Showing revision 23
// Copy the Code from [here] --Bayen

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

//

Robo Home | Changes | Preferences | AllPages
Edit revision 23 of this page | View other revisions | View current revision
Edited January 19, 2006 15:08 EST by pc249.dasd.org (diff)
Search: