Difference between revisions of "Help:Help"

From Robowiki
Jump to navigation Jump to search
m (Help moved to Help:Help: what the namespace help use for?)
Line 1: Line 1:
 +
== Help!, in both meanings of the term ==
 +
 +
 
This is a page for help, please edit the page and add the link to your problem, and maybe one of the more experienced coders will have a solution.  This is a potluck help page so, bring your problems, and be ready to share your expertise and knowledge with the less fortunate!
 
This is a page for help, please edit the page and add the link to your problem, and maybe one of the more experienced coders will have a solution.  This is a potluck help page so, bring your problems, and be ready to share your expertise and knowledge with the less fortunate!
 +
 +
--[[User:Pkdeken|Pkdeken]] 15:38, 29 April 2009 (UTC)
 +
 +
 +
----
 +
 +
I know it says post a link, but this is easier
 +
 +
<pre>
 +
package tutorials;
 +
 +
import robocode.*;
 +
import robocode.util.Utils;
 +
import java.util.ArrayList;
 +
import java.awt.geom.Point2D;
 +
 +
public class GFTTutorial extends AdvancedRobot {
 +
 +
    public final static int BINS = 47;
 +
    public final static int MIDDLE_BIN = (BINS - 1) / 2;
 +
    public final static double MAX_ESC_ANGLE = 0.8143399421265254D;
 +
    public final static double BIN_WIDTH = MAX_ESC_ANGLE / MIDDLE_BIN;
 +
    public static ArrayList aimFactors = new ArrayList();
 +
public double prevVelocity = 0;
 +
public double t = 0;
 +
    public Point2D.Double enemyLoc;
 +
 +
    public void run() {
 +
        while (true) {
 +
            turnRadarRightRadians(Double.POSITIVE_INFINITY);
 +
        }
 +
    }
 +
 +
    public void onScannedRobot(ScannedRobotEvent e) {
 +
        double absBearing = getHeadingRadians() + e.getBearingRadians();
 +
        double firePower = 3D;
 +
        BulletWave w = new BulletWave();
 +
        w.firedLocation = new Point2D.Double(getX(), getY());
 +
        enemyLoc = new Point2D.Double(getX() + Math.sin(absBearing) * e.getDistance(), getY()
 +
                + Math.cos(absBearing) * e.getDistance());
 +
        w.bearingDir = (e.getVelocity() * Math.sin(e.getHeadingRadians() - absBearing) < 0 ? -BIN_WIDTH
 +
                : BIN_WIDTH);
 +
        w.bearing = absBearing;
 +
        w.velocity = bulletVelocity(firePower);
 +
//originalDistance,wall,acceleration,myVelocity,time,timeSinceAccel;
 +
w.originalDistance = e.getDistance();
 +
w.wallX = getX() + Math.sin(absBearing) * e.getDistance() > 400 ? 800 - getX() + Math.sin(absBearing) * e.getDistance()
 +
: getX() + Math.sin(absBearing) * e.getDistance() == 0 ? 0 : getX() + Math.sin(absBearing) * e.getDistance();
 +
w.wallY = getY()+ Math.cos(absBearing) * e.getDistance() > 300 ? 600 - getY()+ Math.cos(absBearing) * e.getDistance()
 +
: getY()+ Math.cos(absBearing) * e.getDistance() == 0 ? 0 : getY()+ Math.cos(absBearing) * e.getDistance();
 +
w.acceleration = e.getVelocity() - prevVelocity;
 +
w.time = getTime();
 +
t = w.acceleration == 0 ? t++ : 0;
 +
w.timeSinceAccel = t;
 +
prevVelocity = e.getVelocity();
 +
int XX = 100;
 +
int[] TopXX = new int[XX];
 +
double[] TopDiff = new double[XX];
 +
for (int i=0;i<aimFactors.size();i++){
 +
double diff = findDifference(w,(AimFactor)aimFactors.get(i));
 +
for (int r=XX - 1;r>=0;r--) {
 +
if (diff < TopDiff[r]){
 +
TopXX[r] = ((AimFactor)aimFactors.get(i)).angle;
 +
TopDiff[r] = diff;
 +
break;
 +
}
 +
}
 +
}
 +
double[] stats = new double[BINS];
 +
        for (int i = 0; i < XX; i++) {
 +
stats[TopXX[i]]++;
 +
}
 +
        int mostVisited = MIDDLE_BIN;
 +
        for (int i = 0; i < BINS; i++) {
 +
            if (stats[i] > stats[mostVisited])
 +
                mostVisited = i;
 +
}
 +
        setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing - getGunHeadingRadians()
 +
                + w.bearingDir * (mostVisited - MIDDLE_BIN)));
 +
        if (setFireBullet(firePower) != null)
 +
            addCustomEvent(w);
 +
        setTurnRadarRightRadians(Utils.normalRelativeAngle(absBearing - getRadarHeadingRadians()) * 2);
 +
    }
 +
 +
double findDifference(BulletWave w, AimFactor a) {
 +
double diff = 0;
 +
diff += Math.sqrt(Math.pow((1-(w.originalDistance/a.distanceIndex)),2));
 +
diff += Math.sqrt(Math.pow((1-(w.wallX/a.wallIndexX)),2));
 +
diff += Math.sqrt(Math.pow((1-(w.wallY/a.wallIndexY)),2));
 +
diff += Math.sqrt(Math.pow((1-(w.acceleration/a.accelerationIndex)),2));
 +
diff += Math.sqrt(Math.pow((1-(w.myVelocity/a.velocityIndex)),2));
 +
diff += Math.sqrt(Math.pow((1-(w.time/a.time)),2));
 +
diff += Math.sqrt(Math.pow((1-(w.timeSinceAccel/a.timeSinceAccel)),2));
 +
return diff;
 +
}
 +
 +
    double absoluteBearing(Point2D.Double p, Point2D.Double q) {
 +
        return Math.atan2(q.x - p.x, q.y - p.y);
 +
    }
 +
 +
    double bulletVelocity(double power) {
 +
        return 20 - 3 * power;
 +
    }
 +
 +
    public class BulletWave extends Condition {
 +
        Point2D.Double firedLocation;
 +
        double velocity, distanceTraveled, bearing, bearingDir;
 +
double originalDistance,wallX,wallY,acceleration,myVelocity,time,timeSinceAccel;
 +
 +
        public boolean test() {
 +
            distanceTraveled += velocity;
 +
            double distance = firedLocation.distance(enemyLoc);
 +
            if (distanceTraveled > distance - 18) {
 +
                try {
 +
                    aimFactors.add(new AimFactor(originalDistance,wallX,wallY,acceleration,myVelocity,time,timeSinceAccel,(int) ((Utils.normalRelativeAngle(absoluteBearing(firedLocation, enemyLoc)) - bearing) / bearingDir) + MIDDLE_BIN));
 +
                } catch (Exception e) {
 +
                }
 +
                removeCustomEvent(this);
 +
            }
 +
            return false;
 +
        }
 +
    }
 +
public class AimFactor {
 +
double distanceIndex,wallIndexX,wallIndexY,accelerationIndex,velocityIndex,time,timeSinceAccel;
 +
int angle;
 +
public AimFactor(double ad,double awx,double awy,double aa,double av,double at,double ati,int aangle){
 +
distanceIndex = ad;
 +
wallIndexX = awx;
 +
wallIndexY = awy;
 +
accelerationIndex = aa;
 +
velocityIndex = av;
 +
time = at;
 +
timeSinceAccel = ati;
 +
angle = aangle;
 +
}
 +
}
 +
}
 +
</pre>
 +
 +
 +
If you run this you end up with it always firing at guessFactor -1, How can I fix this?
 +
  It is supposed to be running a patternMatchingStatitistical Targeting gun.
 +
  Basically, it segments the data without using nested arrays
 +
--[[User:Pkdeken|Pkdeken]] 15:38, 29 April 2009 (UTC)

Revision as of 17:38, 29 April 2009

Help!, in both meanings of the term

This is a page for help, please edit the page and add the link to your problem, and maybe one of the more experienced coders will have a solution. This is a potluck help page so, bring your problems, and be ready to share your expertise and knowledge with the less fortunate!

--Pkdeken 15:38, 29 April 2009 (UTC)



I know it says post a link, but this is easier

package tutorials;

import robocode.*;
import robocode.util.Utils;
import java.util.ArrayList; 
import java.awt.geom.Point2D;

public class GFTTutorial extends AdvancedRobot {

    public final static int BINS = 47;
    public final static int MIDDLE_BIN = (BINS - 1) / 2;
    public final static double MAX_ESC_ANGLE = 0.8143399421265254D;
    public final static double BIN_WIDTH = MAX_ESC_ANGLE / MIDDLE_BIN;
    public static ArrayList aimFactors = new ArrayList();
	public double prevVelocity = 0;
	public double t = 0;
    public Point2D.Double enemyLoc;

    public void run() {
        while (true) {
            turnRadarRightRadians(Double.POSITIVE_INFINITY);
        }
    }

    public void onScannedRobot(ScannedRobotEvent e) {
        double absBearing = getHeadingRadians() + e.getBearingRadians();
        double firePower = 3D;
        BulletWave w = new BulletWave();
        w.firedLocation = new Point2D.Double(getX(), getY());
        enemyLoc = new Point2D.Double(getX() + Math.sin(absBearing) * e.getDistance(), getY()
                + Math.cos(absBearing) * e.getDistance());
        w.bearingDir = (e.getVelocity() * Math.sin(e.getHeadingRadians() - absBearing) < 0 ? -BIN_WIDTH
                : BIN_WIDTH);
        w.bearing = absBearing;
        w.velocity = bulletVelocity(firePower);
		//originalDistance,wall,acceleration,myVelocity,time,timeSinceAccel;
		w.originalDistance = e.getDistance();
		w.wallX = getX() + Math.sin(absBearing) * e.getDistance() > 400 ? 800 - getX() + Math.sin(absBearing) * e.getDistance()
		 : getX() + Math.sin(absBearing) * e.getDistance() == 0 ? 0 : getX() + Math.sin(absBearing) * e.getDistance();
		w.wallY = getY()+ Math.cos(absBearing) * e.getDistance() > 300 ? 600 - getY()+ Math.cos(absBearing) * e.getDistance()
		 : getY()+ Math.cos(absBearing) * e.getDistance() == 0 ? 0 : getY()+ Math.cos(absBearing) * e.getDistance();
		w.acceleration = e.getVelocity() - prevVelocity;
		w.time = getTime();
		t = w.acceleration == 0 ? t++ : 0;
		w.timeSinceAccel = t;
		prevVelocity = e.getVelocity();
		int XX = 100;
		int[] TopXX = new int[XX];
		double[] TopDiff = new double[XX];
		for (int i=0;i<aimFactors.size();i++){
			double diff = findDifference(w,(AimFactor)aimFactors.get(i));
			for (int r=XX - 1;r>=0;r--) {
				if (diff < TopDiff[r]){
					TopXX[r] = ((AimFactor)aimFactors.get(i)).angle;
					TopDiff[r] = diff;
					break;
				}	
			}
		}
		double[] stats = new double[BINS];
        for (int i = 0; i < XX; i++) {
			stats[TopXX[i]]++;
		}
        int mostVisited = MIDDLE_BIN;
        for (int i = 0; i < BINS; i++) {
            if (stats[i] > stats[mostVisited])
                mostVisited = i;
		}
        setTurnGunRightRadians(Utils.normalRelativeAngle(absBearing - getGunHeadingRadians()
                + w.bearingDir * (mostVisited - MIDDLE_BIN)));
        if (setFireBullet(firePower) != null)
            addCustomEvent(w);
        setTurnRadarRightRadians(Utils.normalRelativeAngle(absBearing - getRadarHeadingRadians()) * 2);
    }
	
	double findDifference(BulletWave w, AimFactor a) {
		double diff = 0;
		diff += Math.sqrt(Math.pow((1-(w.originalDistance/a.distanceIndex)),2));
		diff += Math.sqrt(Math.pow((1-(w.wallX/a.wallIndexX)),2));
		diff += Math.sqrt(Math.pow((1-(w.wallY/a.wallIndexY)),2));
		diff += Math.sqrt(Math.pow((1-(w.acceleration/a.accelerationIndex)),2));
		diff += Math.sqrt(Math.pow((1-(w.myVelocity/a.velocityIndex)),2));
		diff += Math.sqrt(Math.pow((1-(w.time/a.time)),2));
		diff += Math.sqrt(Math.pow((1-(w.timeSinceAccel/a.timeSinceAccel)),2));
		return diff;
	}

    double absoluteBearing(Point2D.Double p, Point2D.Double q) {
        return Math.atan2(q.x - p.x, q.y - p.y);
    }

    double bulletVelocity(double power) {
        return 20 - 3 * power;
    }

    public class BulletWave extends Condition {
        Point2D.Double firedLocation;
        double velocity, distanceTraveled, bearing, bearingDir;
		double originalDistance,wallX,wallY,acceleration,myVelocity,time,timeSinceAccel;

        public boolean test() {
            distanceTraveled += velocity;
            double distance = firedLocation.distance(enemyLoc);
            if (distanceTraveled > distance - 18) {
                try {
                    aimFactors.add(new AimFactor(originalDistance,wallX,wallY,acceleration,myVelocity,time,timeSinceAccel,(int) ((Utils.normalRelativeAngle(absoluteBearing(firedLocation, enemyLoc)) - bearing) / bearingDir) + MIDDLE_BIN));
                } catch (Exception e) {
                }
                removeCustomEvent(this);
            }
            return false;
        }
    }
	public class AimFactor {
		double distanceIndex,wallIndexX,wallIndexY,accelerationIndex,velocityIndex,time,timeSinceAccel;
		int angle;
		public AimFactor(double ad,double awx,double awy,double aa,double av,double at,double ati,int aangle){
			distanceIndex = ad;
			wallIndexX = awx;
			wallIndexY = awy;
			accelerationIndex = aa;
			velocityIndex = av;
			time = at;
			timeSinceAccel = ati;
			angle = aangle;
		}
	}
}


If you run this you end up with it always firing at guessFactor -1, How can I fix this?

 It is supposed to be running a patternMatchingStatitistical Targeting gun.
 Basically, it segments the data without using nested arrays

--Pkdeken 15:38, 29 April 2009 (UTC)