Vorlesung Algorithmen und Datenstrukturen
2001
zurueck zur Wettbewerbsseite
Beschreibung des Programms World
Das Programm World erlaubt das Erstellen und Verändern von Labyrinthen,
und die Auswahl und den Lauf der Hamster.
Starten könnt ihr es so (oder mit dem
Script world):
Unix/Linux:
java -classpath contest.jar:hamster algds.contest.World
Windows:
java -classpath contest.jar;hamster algds.contest.World
Es hat die Menus World, Maze und Hamster.
World:
About... |
Autor und Version des Programms. |
Clear log |
Leert das Feld mit den Statusanzeigen. |
Pack |
Setzt die Grösse des World-Fensters auf einen optimalen Wert.
Diese Optimalgrösse hängt vom Status der Auswahllisten ab, ist
Edit Wall ausgewaehlt, sind die Listen am breitesten. Auch die
Grösse des Labyrinth-Fensters wird angepasst.
|
Exit |
Beendet das Programm. Ein verändertes Labyrinth wird NICHT
automatisch gespeichert. |
Maze:
New... |
Erzeugt ein neues Labyrinth mit anzugebender Grösse. Ein neues
leeres Labyrinth hat nur eine Ebene, keine Wände, keinen Mais und keine
Beamer, Heimatfeld und (0,0)-Feld sind links oben.
Die Grösse eines Labyrinths kann derzeit nicht nachträglich
geändert werden.
|
Load... |
Lädt ein Labyrinth. Öffnet ein Dialogfenster, in dem man
es auswählen kann. |
Reload |
Lädt das erfolgreich geladene Layrinth nochmal. Nach einem Lauf
des Hamsters wird das Labyrinth nicht automatisch neu geladen. |
Save |
Speichert das Labyrinth unter dem aktuellen Namen. Ist das Labyrinth
neu, kann man einen Namen auswählen wie bei Save as... |
Save as... |
Speichert das Labyrinth unter einem neuen Namen. Öffnet ein Dialogfenster,
in dem man den Namen auswählen kann.
Die Labyrinth-Dateien (mit der Endung ".maze") sollten im
Verzeichnis "mazes" abgelegt werden, weil MazeRunner und
MazeRunnerX sie von dort laden. |
Visible |
Setzt im Labyrinth den Status "gesehen". Wenn der Hamster seinen Lauf
beginnt, wird im Labyrinth der Status "ungesehen" gesetzt. Dadurch kann
man verfolgen, wo der Hamster schon war. |
Properties |
Setzt einige Eigenschaften des Programms. Beschreibung ist ein
Stück weiter unten. |
Hamster:
Load... |
Lädt einen Hamster, dessen Klassennamen man angibt.
|
Reload |
Lädt den Hamster nochmal. Wenn der Hamster seinen Lauf beendet,
wird er nicht automatisch neu geladen.
|
Mute |
Der Hamster produziert mit seinen log-Methoden (z.B. log(String))
nur dann eine Ausgabe, wenn diese Option ausgeschaltet ist.
Damit kann der Hamster "stummgeschaltet" werden.
|
Verbose |
Die Hamster-Methode debuglog(String) produziert nur dann
eine Ausgabe, wenn diese Option eingeschaltet ist. |
Follow |
Ist diese Option aktiviert, folgt die Labyrinth-Anzeige dem Hamster,
wenn er den gerade angezeigten Bereich verlässt. |
Beim ersten Start der World erscheint die Meldung
"cannot read world.ini".
Das bedeutet, dass die Ini-Datei noch nicht existiert. Geht ins Menu
Maze/Properties, tragt euren Namen als Creator ein und
klickt auf Save und dann auf OK. Eine Beschreibung der
Elemente dieses Dialogfensters ist nachstehend.
Der Menu-Eintrag Maze/Properties öffnet ein Dialogfenster,
das bestimmte Eigenschaften des Programms setzt:
- Creator: Name des Labyrinth-Konstrukteurs.
Wird fuer neu erzeugte Labyrinthe verwendet.
- Author: Konstrukteur des aktuell geladenen Labyrinths.
Wird sofort geaendert.
- SloMo: Angabe, ob jede Bewegung des Hamsters angezeigt werden soll.
Wird sofort wirksam.
- AutoResize: Angabe, ob das Labyrinth-Fenster seine Groesse
automatisch anpassen soll.
Wird sofort wirksam.
- Docking: Angabe, ob das Labyrinth-Fenster seine Position an das
World-Fenster anpassen soll.
Wird sofort wirksam.
- HamsterImage: Angabe, ob im Labyrinth-Fenster ein Hamsterbild
oder der rote Cursor angezeigt werden soll.
Wird sofort wirksam.
- System Dialogs: Angabe, ob zum Laden und Speichern der Labyrinthe
ein Systemdialog oder ein JAVA-Dialog verwendet werden soll.
Unter Windows empfehle ich den Systemdialog, unter Solaris den
JAVA-Dialog.
Wird sofort wirksam.
- Standard Loader: Angabe, ob zum Laden der Hamster der
Standard-ClassLoader oder der eigene Loader verwendet werden soll.
Der Standard-Loader erkennt keine zwischenzeitlichen Neukompilierungen
des Hamsters, verlangt aber die Klassen nicht explizit auf der Festplatte.
Er sucht nicht nur im Verzeichnis hamster, sondern im gesamten
classpath. Einige IDEs (z.B. IBM VAJA) speichern ihre Klassen nicht
direkt auf der Platte, so dass ihr, wenn ihr die verwendet, nur den
Standard-Loader nutzen koennt.
Der eigene Loader erkennt, wenn der Hamster zwischendurch rekompiliert
wird und laedt mit Load oder Reload den neuen Hamster (und alle seine
Unterklassen) von der Platte. Er nimmt dabei an, dass die Klassendateien
im Unterverzeichnis hamster liegen.
Solange ihr euren Hamster programmiert und austestet, empfehle ich den
eigenen Loader.
Wird wirksam beim naechsten Laden eines Hamsters.
- Sleep: Auswahl der voreingestellten Laufgeschwindigkeit.
Gibt die Wartezeit nach jedem Schritt in Milli-Sekunden an.
Wird wirksam mit dem naechsten Laden eines Labyrinths.
- Size: Auswahl der voreingestellten Zellengroesse.
Wird wirksam mit dem naechsten Laden eines Labyrinths.
- OK: Einstellungen uebernehmen und Dialog schliessen.
- Cancel: Einstellungen verwerfen und Dialog schliessen.
- Load: Einstellungen laden.
Einstellungen werden beim Programmstart automatisch geladen.
- Save: Einstellungen speichern in world.ini.
Einstellungen werden beim Programmende NICHT automatisch gespeichert.
Das Dateiformat kann sich in Updateversionen noch ändern, so dass die
Properties dann vielleicht neu gespeichert werden müssen.
Einige der Einstellungen werden auch vom MazeRunnerX verwendet.
Wenn ihr ein Labyrinth geladen habt, öffnet sich ein Fenster, in dem es
angezeigt wird.
Ihr könnt nun einen Hamster laden oder das Labyrinth editieren.
Labyrinthkomponenten
Weisse Felder sind leer, auf orangen Feldern liegt Mais, der
durch einen Kreis angezeigt wird. Die Grösse des Kreises hängt vom
Maisvolumen auf dem Feld ab. Es wird aber ab einem Volumen von 20 nichts
grösseres mehr angezeigt. Graue Linien bezeichnen einen
Durchgang zwischen zwei Feldern, blaue Linien repräsentieren
Wände. Das gekreuzte Feld (hier in der Mitte) ist das Feld, das
die logischen Koordinaten (0,0) in der Ebene hat, der Mauscursor ist hier
z.B. über dem Feld (9,6), der Hamster würde auf dem Feld aber als
Koordinaten die Werte (4,1) übergeben kriegen. Das umrahmte Feld
(hier rechts oben) ist das Heimatfeld des Hamsters. Auf dem startet er, und
da muss er den Mais hinbringen. Der rote Dreiviertelkreis stellt den
Hamster dar, wobei die Öffnung des Kreises in seine aktuelle
Blickrichtung weist. Ihr könnt in den
Properties auch einstellen, dass der Hamster durch
ein Hamsterbild dargestellt wird.
Rote Zahlen bezeichnen Beamer.
Der Wert -1 steht für einen halben Beamer (diese werden beim Lauf
ignoriert), Zahlen ab 0 treten paarweise auf und bezeichnen die beiden Enden
eines Beamers.
Wenn ihr mit der Maus über das Labyrinth geht, wird in der
untersten Zeile der Statusanzeige der Mais und die Koordinaten des
Feldes angezeigt, über dem die Maus gerade ist. Der Rest der
Statusanzeige ist weiter unten erklärt.
|
Editieren
Mit Add könnt ihr ein leeres Level oben hinzufügen,
mit Del das aktuelle entfernen. Wenn nur noch ein Level da ist,
kann das nicht geloescht werden.
Swap dient zum Vertauschen zweier Level (was eigentlich nicht
noetig ist, und wenn man mich fragt, warum die Funktion drin ist, sage ich:
Weils moeglich war *lach*): Ein Level auswaehlen, dann Swap klicken, dann
das andere Level auswaehlen, und nochmal Swap klicken.
In der linken von den drei Auswahl-Listen könnt ihr das angezeigte Level
auswählen.
Zum Editieren der Level wählt ihr eine Funktion aus der mittleren
Liste aus.
Edit Wall:
Klickt mit links auf einen Zellenrand, um eine Wand zu setzen, mit
rechts, um sie zu entfernen. |
Edit Corn:
Wählt aus der rechten Liste die Korngrösse und -anzahl aus,
die ihr pro Klick setzen oder löschen wollt. Mit der linken Maustaste
könnt ihr Mais ablegen, mit der rechten entfernen. Das Maisvolumen
wird durch die Grösse des Kreises angezeigt. |
Edit Beamer:
Wählt aus der rechten Liste eine Funktion aus:
New Beamer:
Klickt auf ein Feld, um dort einen neuen halben Beamer zu setzen. Er
hat noch kein Ziel, ist aber zum Verbinden ausgewaehlt (Connect (x,y,z)),
und kann durch einen Klick in ein anderes Feld direkt mit einem neuen Ziel
verbunden werden. Ist auf dem angeklickten Feld bereits ein kompletter
Beamer, dann passiert nichts, ist dort ein halber Beamer, wird dieser zum
Verbinden ausgewählt. |
Del Beamer:
Klickt auf ein Feld, um den dort liegenden Beamer inclusive seinem
Ziel zu löschen. |
Disconnect:
Klickt auf ein Feld, um den dort liegenden Beamer von seinem Ziel zu
trennen. Die Beamer bleiben da, sind aber nun zwei halbe. Der angeklickte
ist zum Verbinden ausgewählt (Connect (x,y,z)), und kann
durch einen Klick in ein anderes Feld direkt mit einem neuen Ziel verbunden
werden. |
Connect (x,y,z):
Klickt auf ein Feld, um den in der Liste ausgewaehlten halben Beamer
mit einem neu erzeugten oder vorhandenen halben Beamer auf dem angeklickten
Feld zu verbinden.
Ihr könnt keinen Beamer mit sich selbst oder mit einem kompletten
Beamer verbinden. |
Halbe Beamer haben alle die Nummer -1, komplette Beamer werden fortlaufend
nummeriert, beide Hälften des Beamers haben die gleiche Nummer. Die
Nummern gelöschter oder getrennter Beamer werden nicht neu vergeben.
Erst beim Laden oder Neuanlegen eines Labyrinths werden die Beamer neu
durchnummeriert.
Halbe Beamer werden beim Lauf ignoriert und dem Hamster nicht angezeigt. |
Edit Home:
Wählt aus der rechten Liste, ob ihr das Heimatfeld oder
das Zentrum der Ebene setzen wollt. Vom Heimatfeld startet der Hamster und
dorthin bringt er seinen Mais, das Zentrum einer Ebene ist das Feld, das
die logischen Koordinaten 0,0 hat.
|
Lauf des Hamsters
Ladet einen Hamster mit File/Load Hamster.
Ist bereits ein Labyrinth geladen, wird er als Hamsterbild oder als
Kreisbogen angezeigt. Es ist egal, ob ihr zuerst den Hamster oder das
Labyrinth ladet. Klickt ihr auf den Startbutton, so beginnt
der Hamster seine Suche im Labyrinth.
Habt ihr das
Labyrinth verändert, dann speichert es, bevor ihr den Hamster startet,
denn das Labyrinth wird vom Hamster verändert und nicht zwischengespeichert!!
Statusanzeige
energy: |
Die aktuelle Energie des Hamsters |
score: |
aktuelle Punktzahl |
carry: |
Mais, den der Hamster trägt |
steps: |
aktuelle Schrittzahl |
avail: |
Mais, der auf dem Feld liegt, auf dem der Hamster gerade ist |
turns: |
aktuelle Anzahl der Drehungen |
coll: |
Mais, den der Hamster auf dem Heimatfeld angesammelt hat |
|
logische Koordinaten und Richtung des Hamsters |
field: |
Mais, der auf dem Feld liegt, auf das die Maus zeigt |
|
Koordinaten des Feldes, auf das die Maus zeigt, als Realkoordinaten
und als logische Koordinaten |
Die Mais-Anzeige enthält die Gesamtgrösse und in den Klammern die
einzelnen Körner-Anzahlen von 1 bis CORNSIZE_MAX. Logische
Koordinaten sind die, die der Hamster erhält, wenn er getX(),
getY() und getLevel() aufruft (wobei die logische Levelnummer mit der realen
übereinstimmt).
Wenn der Hamster beginnt, wird das Labyrinth grau eingefärbt, um
anzuzeigen, dass er noch nirgends war. Während der Hamster läuft,
werden die Felder hellgrau, die er gesehen hat, und die Felder, die
er bereits betreten hat, werden weiss. |
Die Bedeutung der Symbole im Labyrinth ist weiter
oben erklärt.
Wenn der Hamster seine Suche beendet, muss man ihn oder einen anderen
neu laden, damit man wieder einen Hamster durchs Labyrinth schicken kann.
Ausserdem muss man das Labyrinth neu laden. Das geschieht nicht automatisch,
damit man sehen kann, was der Hamster "angerichtet" hat.
Ihr könnt den Hamster auch mit dem Stopbutton stoppen. Wenn euer
Hamster so funktioniert wie er soll, dann beendet er kurz danach seinen
Lauf. Wenn nicht, dann klickt nochmal auf Stop, und der Hamster wird
gekillt. Das funktioniert jedenfalls mit unseren Testhamstern unter Windows.
Seitenanfang
Status vom 12.03.2001, Stephan Finn, Christian Semrau