Java Hamster Labyrinth
Ich habe ein Problem mit folgendem Java Hamster Programm:
void main() {
/*class*/
{
if(linksFrei()) {
vor();
} else {
if(vornFrei()) {
vor();
} else {
rechtsUm();
}
}
if(!kornDa()) { main(); }
}
void rechtsUm(); {
linksUm();
linksUm();
linksUm();
}
boolean linksFrei() {
linksUm();
if(vornFrei()) {
return true;
}
rechtsUm();
return false;
}
}
}
}
Kann mir jemand sagen, was daran flasch ist? Wäre nice.
Danke schonmal, Haribo.
4 Antworten
Was genau ist das Problem?
Mir ist aufgefallen das nach dem /*class*/ noch ein Block mit geschweifter Klammer anfängt. Der ist soweit unnötig und evtl Fehler Potential.
Würde nur als persönliche Empfehlung die Methode linksFrei() noch so ändern, das du auf jeden Fall in die Ausgangsposition zurück kommst. (also vor dem return true noch ein rechtUm(), denn sonst vergisst man vlt mal das man sich bei true schon nach links gedreht hat. Eine boolean-Abfrage sollte nicht die Ausgangslage verändern.
Ja die Optimierung der Schritte ist logisch, daher habe ich es auch nicht als Fehler sondern als Empfehlung formuliert.
Wie du auch sagst, klingt linksFrei nach einer Prüfroutine und es ist für "richtige" Programmierung sauberer wenn Dinge die wie Prüfroutinen klingen auch welche sind und somit nicht den Ausgangszustand ändern. Es ist wie du sagst irritierend, nicht falsch.
____________________________________________________
Soweit ich weiß (habe auch mal kurz mit dem Hamster gearbeitet) kann der Hamster nur als vorgefertigte Methoden: vor(), vornFrei() und linksUm(). Daher muss man um nach rechts zu drehen drei links Drehungen machen
Ein weiteres Fehlerpotential das ich sehe ist, das wann immer die Felder um deinen Hamster (speziell das links von ihm, schräg hinter ihm und hinter ihm) frei sind (nicht belegt und ohne Korn) ein endloser Kreislauf entsteht in dem er immer diese Felder abläuft aber keinen Fortschritt macht.
Diese Situation kann aber nur eintreffen, wenn der Hamster genau dort plaziert wird. Sonst wäre der Hamster bereits auf dem Feld hinter ihm links abgebogen.
Stimmt, gut bemerkt. Sonst wenn er an einem Rand ist läuft er an dem Entlang bis er nach links kann.
Also mir fällt schon mal auf, dass linksFrei() IMMER false zurückgeben wird, weil das - ohne Bedingung - als letzter Befehl in der Methode steht.
Es ist ein bisschen verwirrend. Das sieht nach einem Lehrbuchbeispiel aus.
Wer so programmiert, der wird Probleme bekommen, es zu verstehen, wenn sein Programm größere Ausmaße annimmt, vor allem, wenn man eine Zeit lang nicht im Thema steckt.
Stimmt, der Code bricht ja nach "return" ab und fällt nicht durch (wie z.B. bei switch()). Da habe ich nicht richtig nachgedacht.
Man sollte so ja auch schulmäßig nicht programmieren, dass mitten in einer Methode sie verlassen wird, sondern schön mit if-else oder switch arbeiten.
Es ist aber gängige Praxis, nach Validierungen direkt auszusteigen.
Was für eine Fehlermeldung bekommst du denn, bzw. wie äußert sich dein Problem denn? An welcher Funktion hakt es? Hast du schon gedebuggt?
Ich würde dir empfehlen, Prüfmethoden und Bewegungsmethoden zu trennen.
boolean istFrei(Richtung)
und
void bewegeHamster(Richtung)
Probiere es mal auf diese Weise.
Das Programm wird zwar nicht von der Laufzeit optimiert, aber dafür sehr viel leserlicher.
Ein Problem könntest du bekommen, wenn du den Hamster in einem Kreis entgegen des Uhrzeigersinns einsetzt.
Er wird immer im Kreis laufen => Endlosschleife.
Startet der Hamster am Rand und ist das Futter auch am Rand, wird er es finden.
Es müsste noch eine Funktion geben (war ich schon hier? Wenn ja, gibt es noch einen anderen Weg, als den beschrittenen? Wenn ja, wähle diesen. Also vorstellbar mit einer Schnur, die am Bein des Hamsters befestigt ist.
Er wollte wahrscheinlich dem Hamster ersparen, nach links drehen, gucken, ob frei ist, nach rechts drehen. Dann wenn frei ist, wieder nach links drehen und nach vorne rücken.
Das irritiert wirklich gewaltig.Es ist, wie er es gemacht hat zwar unübersichtlich, weil linksFrei wie eine reine Prüfroutine klingt, aber von der Anzahl an Zügen effizienter.
Auf der anderen Seite dreht er den Hamster lieber dreimal nach links, anstelle einmal nach rechts. Hier führt er lieber seine Programmierung auf etwas Bekanntes zurück, anstelle die Anzahl an Schritten zu reduzieren.
Einen logischen Fehler kann ich aber auch nicht erkennen.