algds.c2002
Class Hamster

java.lang.Object
  |
  +--algds.c2002.Hamster
All Implemented Interfaces:
Constants
Direct Known Subclasses:
Hamster2

public abstract class Hamster
extends java.lang.Object
implements Constants

Basisklasse fuer alle Hamster, die sich im einfachen Labyrinth bewegen sollen.

Jede Implementierung muss von dieser Klasse abgeleitet werden und die Methode run ueberschreiben. Eine Instanz der abgeleiteten Klasse wird in die Labyrinth-Welt geladen und dort gestartet.
Alle Konstanten-Werte und Methoden koennen ohne Ankuendigung bis zum offiziellen Start geaendert werden.

Die Konstanten befinden sich im Interface algds.c2002.Constants, welches von Hamster implementiert wird. Diese Konstanten koennen direkt als CORN angesprochen werden, man muss nicht Constants.CORN schreiben! Wenn ihr noch zusaetzliche Klassen braucht, die die Konstanten verwenden, empfiehlt es sich, einfach das Interface Constants zu implementieren.

Aenderungen:
07.07.2001: Erste Anpassung an die Umgebung 2002.
12.12.2001: Trennung Hamster und Hamster2.
10.01.2002: getCollectedCorn() entfernt. Der Hamster wird sich wohl merken koennen, wieviel er auf dem Heimatfeld abgelegt hat.

Wer Fragen hat, stelle die bitte an Christian.

Zurueck zur Wettbewerbsseite.

Version vom 10.01.2002

See Also:
Constants, Hamster2

Field Summary
(package private)  algds.c2002.MazeEngine engine
          Speichert die verwendete MazeEngine, also die Umgebung, die den Hamster durchs Labyrinth bewegt.
(package private)  algds.c2002.HamsterStopException hse
          Wird geworfen, wenn die Engine null ist, weil der Hamster gestoppt werden soll.
 
Fields inherited from interface algds.c2002.Constants
CLIFFDOWN, CLIFFUP, CORN, CORNCARRY_MAX, CORNFIELD_MAX, CORNMASK, INFINITE_LOOP, MAZELENGTH_MAX, POINTS_COLLISION, POINTS_CORN, POINTS_CRASH, POINTS_LOWERBOUND, POINTS_NOTHOME, POINTS_STEP, SLOPEDOWN, SLOPEUP, TOTAL_RUNTIME, TURN_LEFT, TURN_RIGHT, WALL, WALLMASK
 
Constructor Summary
Hamster()
          Konstruktor zum Erzeugen eines Hamster-Objektes.
 
Method Summary
 boolean atHome()
          Gibt true zurueck, wenn der Hamster sich auf dem Heimatfeld befindet, false sonst.
 int dropHere(int anzahl)
          Legt die angegebene Anzahl von Koernern auf dem aktuellen Feld ab.
 boolean forward()
          Bewegt den Hamster um einen Schritt in der aktuellen Richtung vorwaerts.
 int getAvailableCorn()
          Liefert die Anzahl der Koerner auf dem aktuellen Feld.
 int getCarriedCorn()
          Liefert die Anzahl der Koerner, die der Hamster im Maul traegt.
 int getCollisions()
          Liefert die Anzahl der bisher gemachten Kollisionen.
 java.lang.String getHamsterAuthor()
          Autor(en) des Hamsters.
 java.lang.String getHamsterDate()
          Datum der Hamsterversion.
 java.lang.String getHamsterVersion()
          Hamsterversion.
 int getPoints()
          Liefert die aktuelle Punktzahl des Hamsters.
 int getSteps()
          Liefert die Anzahl der bisher ausgefuehrten Schritte.
(package private)  boolean isEngineAlive()
          Prueft, ob die Engine noch existiert.
 void log(java.lang.String msg)
          Gibt eine Meldung in Form eines Strings im Meldungsfeld aus.
 void logln(java.lang.String msg)
          Gibt eine Meldung in Form eines Strings mit Zeilenwechsel im Meldungsfeld aus.
 int lookForward()
          Liefert Informationen ueber das in Blickrichtung angrenzende Feld.
 int lookHere()
          Liefert Informationen ueber das Feld, auf dem der Hamster gerade steht.
abstract  void run()
          Die Hauptmethode des Hamsters.
(package private)  void setEngine(algds.c2002.MazeEngine me)
          Interne Methode fuer die Ablaufumgebung.
 int take(int anzahl)
          Nimmt die angegebene Anzahl von Koernern aus dem aktuellen Feld auf.
 void turn(int direction)
          Aendert die Laufrichtung, wobei das aktuelle Feld nicht verlassen wird.
 boolean verbose()
          Gibt an, ob der Hamster ausfuehrliche Meldungen geben soll.
 
Methods inherited from class java.lang.Object
, clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

engine

algds.c2002.MazeEngine engine
Speichert die verwendete MazeEngine, also die Umgebung, die den Hamster durchs Labyrinth bewegt. Ist package-private, darf vom Hamster nicht verwendet werden!

hse

algds.c2002.HamsterStopException hse
Wird geworfen, wenn die Engine null ist, weil der Hamster gestoppt werden soll. Ist package-private, darf vom Hamster nicht verwendet werden!
Constructor Detail

Hamster

public Hamster()
Konstruktor zum Erzeugen eines Hamster-Objektes. Sollte nichts tun. Alle Initialisierungen und Handlungen des Hamsters muessen in der Methode run() geschehen, denn die Hamsterbefehle funktionieren nicht, bevor run() aufgerufen wird.
Method Detail

atHome

public boolean atHome()
Gibt true zurueck, wenn der Hamster sich auf dem Heimatfeld befindet, false sonst.
Returns:
Hamster zuhause

dropHere

public int dropHere(int anzahl)
Legt die angegebene Anzahl von Koernern auf dem aktuellen Feld ab.
Wenn er weniger hat, legt er nur ab, was er hat. Wenn nicht alles aufs Feld passt, wird nur abgelegt, was draufpasst: Alle Felder ausser dem Heimatfeld haben nur Platz fuer CORNFIELD_MAX Koerner.
Parameters:
anzahl - die Anzahl der abzulegenden Koerner
Returns:
die Anzahl der tatsaechlich abgelegten Koerner
See Also:
Constants.CORNFIELD_MAX

forward

public boolean forward()
Bewegt den Hamster um einen Schritt in der aktuellen Richtung vorwaerts.

Bei einer Kollision mit einer Wand (Constants.WALL) wird der Hamster einmal nach links gedreht und bleibt auf dem Feld stehen.

Der Hamster hat stets eine Zeitspanne von Constants.INFINITE_LOOP Millisekunden, um den Befehl forward() aufzurufen. Nach einem solchen Aufruf hat er wieder soviel Zeit usw. Damit soll verhindert werden, dass ein Hamster ewig in einer Endlosschleife haengt.
Nach einer bestimmten Gesamtlaufzeit (Constants.TOTAL_RUNTIME) wird der Lauf des Hamster abgebrochen.

Returns:
true, wenn Schritt ausgefuehrt werden konnte, sonst false (Kollision).
See Also:
Hamster2.forward()

getAvailableCorn

public int getAvailableCorn()
Liefert die Anzahl der Koerner auf dem aktuellen Feld. (Also dem Feld, auf dem der Hamster gerade steht.)
Returns:
Anzahl der Koerner

getCarriedCorn

public int getCarriedCorn()
Liefert die Anzahl der Koerner, die der Hamster im Maul traegt.
Returns:
Anzahl der Koerner

getCollisions

public int getCollisions()
Liefert die Anzahl der bisher gemachten Kollisionen.
Returns:
Anzahl der Kollisionen

getHamsterAuthor

public java.lang.String getHamsterAuthor()
Autor(en) des Hamsters. Ihr koennt diese Methode ueberschreiben, um die Autoren zu setzen.
Returns:
Name des Autors als String

getHamsterDate

public java.lang.String getHamsterDate()
Datum der Hamsterversion. Ihr koennt diese Methode ueberschreiben, um das Datum zu setzen.
Returns:
Versionsdatum als String

getHamsterVersion

public java.lang.String getHamsterVersion()
Hamsterversion. Ihr koennt diese Methode ueberschreiben, um die Versionsnummer zu setzen.
Returns:
Versionsnummer als String

getPoints

public int getPoints()
Liefert die aktuelle Punktzahl des Hamsters.
P =
POINTS_CORN * gesammelteKoerner
+POINTS_STEP * gelaufeneSchritte
+POINTS_COLLISION * gemachteKollisionen
zusätzlich kommen nach Ende des Laufs hinzu (das wird der Hamster selbst dann nicht mehr abrufen koennen):
Wenn Absturz oder Zeitüberschreitung: POINTS_CRASH
sonst Wenn nicht auf Heimatfeld beendet: POINTS_NOTHOME
sonst 0
Um Hamster mit Endlosschleifen, in denen sie noch laufen, nicht zu sehr zu bestrafen, wird die Punktzahl nach unten begrenzt (unabhaengig davon, ob eine Endlosschleife auftrat oder nicht):
Punkte = max(P, POINTS_LOWERBOUND)
Returns:
aktuelle Punktzahl
See Also:
Constants.POINTS_CORN, Constants.POINTS_STEP, Constants.POINTS_COLLISION, Constants.POINTS_CRASH, Constants.POINTS_NOTHOME, Constants.POINTS_LOWERBOUND

getSteps

public int getSteps()
Liefert die Anzahl der bisher ausgefuehrten Schritte.
Returns:
Anzahl der Schritte

isEngineAlive

final boolean isEngineAlive()
Prueft, ob die Engine noch existiert. Wenn die Engine nicht mehr existiert, wird der Hamster beim naechsten Aufruf einer Methode durch eine HamsterStopException beendet. Ist package-private, darf vom Hamster nicht verwendet oder ueberschrieben werden!

log

public void log(java.lang.String msg)
Gibt eine Meldung in Form eines Strings im Meldungsfeld aus. (Ohne abschliessenden Zeilenwechsel!) Ob tatsaechlich eine Ausgabe erfolgen soll, kann in der "World" mit dem Menu-Eintrag Hamster/Mute eingestellt werden (auch waehrend der Hamster laeuft).
Parameters:
msg - die auszugegebende Nachricht
See Also:
logln(java.lang.String)

logln

public void logln(java.lang.String msg)
Gibt eine Meldung in Form eines Strings mit Zeilenwechsel im Meldungsfeld aus.
Fuehrt die folgende Anweisung aus:
log(msg+"\n");
Parameters:
msg - die auszugegebende Nachricht
See Also:
log(java.lang.String)

lookForward

public int lookForward()
Liefert Informationen ueber das in Blickrichtung angrenzende Feld. Gibt an, ob auf dem Nachbarfeld Getreide ist, und ob in Blickrichtung eine Wand ist. Wenn in Blickrichtung eine Wand ist, kann der Hamster nicht sehen, ob dahinter Getreide ist!

Es kann sein, dass in zukuenftigen Versionen noch weitere Informationen zurueckgegeben werden, daher sollte man keinesfalls die Werte direkt vergleichen, sondern stets bitweise.

Returns:
Eine bitweise oder-Kombination von Konstanten
See Also:
Constants.CORN, Constants.WALL, Hamster2.lookForward()

lookHere

public int lookHere()
Liefert Informationen ueber das Feld, auf dem der Hamster gerade steht.

Es kann sein, dass in zukuenftigen Versionen noch weitere Informationen zurueckgegeben werden, daher sollte man keinesfalls die Werte direkt vergleichen, sondern stets bitweise.

Returns:
Eine bitweise-oder-Kombination von Konstanten
See Also:
Constants.CORN

run

public abstract void run()
Die Hauptmethode des Hamsters. Durch Ueberschreiben dieser Methode erfolgt die Bewegung durch das Labyrinth.
Um seinen Lauf zu beenden, muss der Hamster einfach nur die run-Methode verlassen.

Soll der Hamster vom Benutzer gestoppt werden, dann wird eine algds.c2002.HamsterStopException geworfen, die den Hamster beim naechsten Aufruf einer der Hamster-Methoden beendet. Der Hamster darf diese Exception nicht abfangen.


setEngine

final void setEngine(algds.c2002.MazeEngine me)
Interne Methode fuer die Ablaufumgebung. Setzt oder entfernt die Engine des Hamster. Ist package-private, darf vom Hamster nicht verwendet oder ueberschrieben werden!
Parameters:
me - die Engine, oder null wenn sie entfernt werden soll.

take

public int take(int anzahl)
Nimmt die angegebene Anzahl von Koernern aus dem aktuellen Feld auf. Wenn weniger daliegt, nimmt er nur was da ist. Wenn er weniger ins Maul kriegt, nimmt er nur, was reinpasst: Seine Backen haben nur Platz fuer CORNCARRY_MAX Koerner.
Parameters:
anzahl - die Anzahl der aufzunehmenden Koerner
Returns:
die Anzahl der tatsaechlich aufgenommenen Koerner
See Also:
Constants.CORNCARRY_MAX

turn

public void turn(int direction)
Aendert die Laufrichtung, wobei das aktuelle Feld nicht verlassen wird. Obwohl die Drehungen nicht gezaehlt werden und nicht in die Wertung eingehen, sollte man doch versuchen, sich moeglichst wenig zu drehen. Denn zum einen kostet auch eine Drehung Zeit (besonders in Verbindung mit einer anschliessenden Pruefung der vielleicht bereits bekannten Nachbarschaft), und zum anderen sieht es einfach besser aus, wenn der Hamster sich nicht bei jedem Schritt einmal im Kreis dreht.
Parameters:
direction - Drehrichtung
TURN_LEFT, TURN_RIGHT
See Also:
Constants.TURN_LEFT, Constants.TURN_RIGHT

verbose

public boolean verbose()
Gibt an, ob der Hamster ausfuehrliche Meldungen geben soll. Der Wert dieser Funktion kann in der "World" mit dem Menu-Eintrag Hamster/Verbose eingestellt werden (auch waehrend der Hamster laeuft).
Programmcode fuer diese Ausgaben sieht etwa so aus:
if (verbose()) log(msg);
bzw.
if (verbose()) logln(msg);

Ihr solltet vermeiden, eine Methode zu schreiben und zu verwenden, die so aussieht:
void debuglog(String msg){ if (verbose()) log(msg);}
Denn dabei wuerde der String msg in jedem Fall erzeugt werden, was bei Debug-Ausgaben ziemlich komplex werden kann und also zusaetzlich Zeit verbraucht. Bei Verwendung wie oben tritt das Problem nicht auf.

Natuerlich hindert euch nichts daran, eine eigene debug-Variable zu verwenden.

Returns:
Ausfuehrliche Meldungen geben