import java.awt.Color;

public class RandomWalker extends MobileSimObject {
    // OVERVIEW: A RandomWalker is a drunk simulator object that performace a random walk,
    //    moving one square in a random direction each step.

    private boolean inTurn; // Currently in the middle of a turn (used for coloring)

    public RandomWalker () {
	inTurn = false;
    }

    public Color getColor()
    {
	if (inTurn) {
	    return Color.white;
	} else {
	    return Color.cyan;
	}
    } //@nowarn NonNullResult // ESC/Java doesn't know Color constants are not null

    //synchronized
    public void executeTurn() throws RuntimeException
       // Note: requires isInitialized is inherited from SimObject
       // EFFECTS: Picks a random direction and tries to move that way.
       //          If the move is successful, return true. If the move fails
       //          because the spot being attempted to move into is already
       //          occupied then return false.

    {
	inTurn = true;
	Direction dir = Direction.randomDirection ();
	int newrow = getRow () + dir.northerlyDirection ();
	int newcol = getColumn () + dir.easterlyDirection ();

	if (getGrid ().validLocation (newrow, newcol)) {
	    synchronized(getGrid()){
                if (getGrid().isSquareEmpty (newrow, newcol)){
		    // Here, we pretend there is a lot of compution to do by sleeping,
		    // to make race conditions more likely.
		    delay (500);

		    setLocation (newrow, newcol);
		}
            }
	}

	inTurn = false;
    }
}