[Home]Movement/GoToBot

Robo Home | Movement | Changes | Preferences | AllPages

A complete bot that moves between destinations (selected at random) on the battle field and shoots on sight of an enemy.

If you're to lazy to copy-paste the source; Download the bot at http://www.robocoderepository.com/BotDetail.jsp?id=1456
package wiki;
import robocode.*;
import java.awt.geom.Point2D;

// GoToBot, demonstrates using a goTo() function to move around
// $Id: GoToBot.java,v 1.2 2003/05/15 14:30:46 peter Exp $

public class GoToBot extends AdvancedRobot {
    private Point2D[] destinations = {
        new Point2D.Double(90, 90),
        new Point2D.Double(790, 790),
        new Point2D.Double(400, 400),
        new Point2D.Double(90, 540),
        new Point2D.Double(740, 90),
        new Point2D.Double(500, 200),
        new Point2D.Double(200, 500)
    };

    public void run() {
        turnGunRightRadians(Double.POSITIVE_INFINITY); 
    }

    public void onScannedRobot(ScannedRobotEvent e) {
        setFire(3);
        setTurnGunRightRadians(0 - getGunTurnRemainingRadians());
        if (Math.abs(getDistanceRemaining()) < 5) {
            goTo(destinations[(int)(Math.random() * destinations.length)]);
        }
    }

    private void goTo(Point2D destination) {
        Point2D location = new Point2D.Double(getX(), getY());
        double distance = location.distance(destination);
        double angle = normalRelativeAngle(absoluteBearing(location, destination) - getHeading());
        if (Math.abs(angle) > 90) {
            distance *= -1;
            if (angle > 0) {
                angle -= 180;
            }
            else {
                angle += 180;
            }
        }
        setTurnRight(angle);
        setAhead(distance);
    }

    private double absoluteBearing(Point2D source, Point2D target) {
        return Math.toDegrees(Math.atan2(target.getX() - source.getX(), target.getY() - source.getY()));
    }

    private double normalRelativeAngle(double angle) {
        angle = Math.toRadians(angle);
        return Math.toDegrees(Math.atan2(Math.sin(angle), Math.cos(angle))); 
    }
}
Note that it uses the fancier goTo() function from /CodeSnippetGoTo. And I just had to make it shoot as well. =) -- PEZ

What the... HEY! You stole CircleBot's radar/aiming algorithm! (Except that he does it in a slightly different way...) j/k -- Kawigi

Ok, so something i have been desperately trying to work out and failing is what the difference is between fire(), and setFire(). I know that setFire() only works when execute() is called, but i dont see why you'd use it on a simple bot like this. I can see it's use on larger bots where you make it fire only after the gun has moved, but in this example the gun is constantly moving. Is it because if you call setFire() it doesnt interefere with any other actions as it is put in it's own thread??? -- Brainfade

I use setFire() out of habit. Sometimes when I started out with Robocode putting fire() in the wrong place made my bot stop to work completely. I have no clue as to why though. And as you mention it I don't know why the above works without a call to execute() either. =) -- PEZ

I changed the radar/aiming "algorithm" slightly so that it now doesn't look exactly like CircleBot's. =) -- PEZ

Ah - a "nano-gun-lock" - I should add that into CircleBot :-p -- Kawigi

It should function entirely without the while(true) there. -- Kuuran

Aha! If you're sure about it please feel free to remove that line. -- PEZ

I've removed the while(true) {} line, I tested it locally first and it worked fine. -- Kuuran

Please check HaikuGoTo and see if it does what it's meant to. Other than firing, it should replace this bot (although not very efficently). -- Tango


Robo Home | Movement | Changes | Preferences | AllPages
Edit text of this page | View other revisions
Last edited August 30, 2003 23:16 EST by Tango (diff)
Search: