import algds.c2002.Hamster;

/**
 * LeftHand: ein einfacher Hamster, der das Labyrinth systematisch
 * ablaeuft, indem er sich mit der linken Hand an der Wand haelt.
 * Hat er die maximale Anzahl von Koernern aufgenommen,
 * so kehrt er auf dem gleichen Weg zurueck.
 *
 * Kann nicht mit dem erweiterten Labyrinth umgehen.
 *
 * Diese Klasse dient der Veranschaulichung, wie man einen
 * (ziemlich schlechten) Hamster implementieren kann.
 *
 * Bitte versucht nicht, diesen verbessern zu wollen, lasst euch
 * gleich eine bessere Strategie fuer euren Hamster einfallen.
 *
 * @author Kai-Uwe Sattler, adaptiert von Christian Semrau
 */

public class LeftHand extends Hamster {

/**
 * Markierung, ob der Lauf beendet werden soll oder nicht.
 */
boolean finished = false;

/**
 * Hauptmethode.
 * Geht sammeln, kehrt nach Hause zurueck und legt allen Mais ab,
 * bis er das Heimatfeld auf dem Hinweg wieder erreicht.
 */
public void run() {
	finished = false;
	while (!finished) {
		goShopping();
		goHome();
		dropAll();
	}
}

/**
 * Geht Mais sammeln bis das Maul voll ist.
 */
private void goShopping() {
	boolean full = false;

	while (!full) {
		turn(TURN_LEFT); turn(TURN_LEFT);
		if ((lookForward() & WALLMASK) != WALL)
			forward();
		else {
			while ((lookForward() & WALLMASK) == WALL)
				turn(TURN_RIGHT);
			forward();
		}
		if (atHome()) {
			finished = true;
			if (verbose()) log("Walked once around.\n");
			return;
		}
		take(CORNCARRY_MAX);
		if (getCarriedCorn() == CORNCARRY_MAX) {
			full = true;
		}
	}
}    

/**
 * Geht auf dem gleichen Weg nach Hause wie er gekommen ist.
 */
private void goHome() {
	if (verbose()) log("go home...\n");

	turn(TURN_LEFT); turn(TURN_LEFT); turn(TURN_LEFT);
	if (!atHome())
		forward();
	while (!atHome()) {
		turn(TURN_RIGHT); turn(TURN_RIGHT);
		if ((lookForward() & WALLMASK) != WALL)
			forward();
		else {
			while ((lookForward() & WALLMASK) == WALL)
				turn(TURN_LEFT);
			forward();
		}
	}
	turn(TURN_LEFT); turn(TURN_LEFT); turn(TURN_LEFT);
}

/**
 * Legt alles ab, was er an Mais hat.
 */
public void dropAll() {
	int dropped = dropHere(CORNCARRY_MAX);
	if (verbose()) log(dropped + " corn dropped.\n");
}

/** Autor(en) des Hamsters. */
public String getHamsterAuthor() { return "KUS, adapted by Christian Semrau"; }

/** Datum der Hamsterversion. */
public String getHamsterDate() { return "29.11.2001"; }

/** Hamsterversion. */
public String getHamsterVersion() { return "0.2"; }

} // LeftHand
