Die Klasse dieRennsemmel.java
Dies bildet die Hauptklasse des Hamsters.
public Field feld
enthält das aktuell besetzte Feld
Node2 root
speichert das Beginnfeld des Laufens
Node2 alleElemente
dies ist Ausgangspunkt für eine einfache simple Liste aller Besuchter Felder
Node 2 unvis
ist Ausgangspunkt für eine Liste mit allen Feldern, die den Status "!visited" haben. (Bemerkung: die angedeutete Methode wird noch nicht genutzt, ist aber schon vorhanden)
boolean do_log;
Sollen das Logging in Form einer Datei erfolgen?
boolean madestep
keine Funktion mehr
boolean finished
wenn sie true ist, so wird der Hamsterlauf als beendet betrachtet.
int posX, int posY
speichern die aktuellen Koordinaten des Hamsters (nicht des Feldes)
int steps - Zählvariable für gemachte Schrittanzahl
int stepsMax - die Maximale Schrittanzahl, bevor der Hamster zurücklaufen soll
boolean a = false; entpricht up
boolean b = false; entpricht lup
boolean c = false; entpricht rup
boolean d = false; entpricht rdn
boolean e = false; entpricht ldn
boolean f = false; entpricht dn
diese werden z.b. in der Methode alreadyVisited benötigt, sie legen fest, in welche Richtung der Hamster schauen darf
public boolean fLog(String s, boolean Zeilenumbruch);
dies ist eine einfache Ausgabe der Logdaten als Datei.
Bei der Anzahl der vorhandenen Felder ist das auch dringend nötig.
"String s" ist der zu schreibende Text
"boolean Zeilenumbruch" gibt an, ob ein Zeilenumbruch geschrieben werden soll
weiterhin kann fLog auch als fLog(String s) aufgerufen, wobei fLog(s,true) neu aufgerufen wird.
Die Methode liefert false, falls das Schreiben in die Datei fehlschlug.
public boolean areBound(Field a1, Field a2)
überprüft, ob zwei Felder eine Vebindung zueinander haben.
Diese Methode wird im Moment nicht benutzt.
public Field checkField(Field f)
überprüft anhand der Koordinaten, ob ein Feld schon in der Liste der besuchten Felder ist (über root, also die Liste, wo jedes Feld nur ein mal drin steht) und gibt null aus, wenn das Feld noch nicht drin ist in der Liste.
Ansonsten wird das Feld aus der Liste ausgegeben.
Dies ist notwendig, da bei jedem umschauen ein neues Feld gesehen wird. (Also wenn ich auf Feld A stehe, und nach Feld B gehe, mich dann rumdrehe und zu A schaue, so würde A nicht mehr gesehen werden)
public void saveUnvisited(Field f)
sie überprüft zuerst, ob das Feld f (!visited), wenn das so ist, so wird geschaut, ob
das Feld schon in der Liste drin ist.
Falls es noch nicht drin ist, so wird es aufgenommen.
Weiterhin wird bei jedem Aufruf dieser Methode überprüft, ob sich irgendwas geändert hat, also, ob noch immer die entsprechenden Felder (!visited) sind, oder nicht.
Falls ein Feld inzwischen schon zu (visited) geworden ist, so wird es aus der Liste entfernt.
public void lookAround()
diese Methode tut folgendes:
Schaut nach oben - Feld bekannt? Wenn ja: mittels checkField() das Up des
aktuellen Feldes auf dieses bekannte Feld setzen.
Wenn nicht, dann soll es einfach neu erstellt werden. (und entsprechend in die laufenden
Listen eingefügt)
(in dieser Methode ist die saveUnvisited Methode auskommentiert, zu testzwecken kann sie aktiviert werden)
public void circleSolver()
Diese Methode hat mich die meiste Zeit gekostet.
Was tun, wenn man auf einen Donut stößt?
Die Idee dafür fand ich erst sehr spät:
Das Unterste Feld hat mindestens 3 Ausgänge (mit feld.exits() bestimmbar), während
die anderen Felder nur 2 haben dürfen.
Darauf beruht mein Vorgehen in diesem Fall:
Wenn alle Bedingungen zutreffen, so muß es sich um einen Kreis handeln.
Daraufhin werden alle diese Felder aus der Liste gelöscht.
public void pathFinder(int x, int y);
erstellt eine Liste vom (besuchten!) Feldern, die zu einem beliebigen Ziel führen.
Danach geht der Hamster ohne Umschweife den kürzesten bekannten Weg zu diesem Feld.
(Hierfür werden die Methoden goUp2() usw benutzt.)
Diese Methode wollte ich mit den Feldern aus saveUnvisited() benutzen, so daß letzten
Endes alle Felder, die möglich waren, besucht wurden.
Jedoch wird die Methode bisher nur für (0,0) aufgerufen. (ZEITMANGEL!)
public boolean goUp();
liefert immer true
nimmt Korn, falls die Anzahl der getragenen Körner <20 ist.
setzt die aktuellen Koordinaten entsprechend der Gangrichtung, sowie die neuen Koordinaten des neuen Feldes.
mittels checkField wird wieder überprüft, ob das Zielfeld schon in der Liste ist, falls ja, wird dieses Feld gesetzt.
wenn bei einem Feld den Status visited hat, so setzt er das Feld hinter sich auf null. (siehe Quellcode: if (b) { feld.setNextDnNull } )
public boolean goUp2();
nimmt mittels checkfield das schon bekannte Feld, ändert die Koordinaten auf das Zielfeld und geht da hin
boolean alreadyVisited();
gibt in a bis f an, welche der Richtungen schon besucht wurde,
setzt das Feld auf visited==true;
public void switchField();
dies ist die haupt-geh-Methode.
zuerst wird überprüft, ob das
Feld != null, !visited und Zielkoordinaten != Vorgängerkoordinaten sind.
Diese Überprüfungen werden nach unten im Quellcode immer weiter abgeschwächt.
Konnte dennoch kein Schritt gemacht werden, so geht er ganz einfach wieder nach Hause. (mit pathFinder(0,0))