Help:Help

From Robowiki
Jump to navigation Jump to search

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 suggest to create another page as subpages and make a link would be easier. » Nat | Talk » 16:01, 29 April 2009 (UTC)


How do I implement HTML colors? --KDH 13:41, 5 June 2010 (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)

I'm testing. One thing that is wrong is the BIN_WIDTH calculation, it should be

public final static double BIN_WIDTH = MAX_ESC_ANGLE / (double)MIDDLE_BIN;

And the diff always be NaN (try printing it out). Another thing to mention is this is not patternMatchingStatitistical Targeting gun, but it is a Dynamic Clustering GuessFactor Targeting gun. I'll look into this later when I have time. » Nat | Talk » 16:01, 29 April 2009 (UTC)

Problem finding enemy position

I've tried to make a snippet to find the enemy position. For some reason the computer isn't calculating it right :/ after I couldn't figure it out I tried making the calculations by hand and it was exactly right - only one off which was probably due to me rounding when I calculated it. Any ideas why this won't work??? =S

      int x, y;
      double radHead = getRadarHeading();
      double eDist = e.getDistance();
      double quadrant = Math.ceil(radHead / 90);
      switch((int)quadrant){
      case 1:
         x = 1;
         y = 1;
         break;
      case 2:
         x = 1;
         y = -1;
         break;
      case 3:
         x = -1;
         y = -1;
         break;
      case 4:
         x = -1;
         y = 1;
         break;
         default:
            x = 1;
            y = 1;
            break;
      }
      double angle = radHead - ((quadrant - 1) * 90);
      double enx = (Math.cos((90 - angle))) * eDist * x;
      double eny = (Math.sin((90 - angle))) * eDist * y;
      double enemX = getX() + enx;
      double enemY = getY() + eny;

I don't know :S I can't figure out why it wont work lol. Help plz :D Thanks --Exaugetalk 22:18, 23 July 2010 (UTC)