Die Klasse dieRennsemmel.java

Dies bildet die Hauptklasse des Hamsters.

Variablen
Methoden

Variablen:


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


 

Methoden:


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?

donut.gif (5941 Byte)

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))


zurück