Java Hamster Labyrinth

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.

Suboptimierer  22.05.2015, 10:27

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.

if(linksFrei()) {
    vor();

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.

2
TUrabbIT  22.05.2015, 10:32
@Suboptimierer

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

2

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.

Suboptimierer  22.05.2015, 13:15

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.

0
TUrabbIT  22.05.2015, 18:46
@Suboptimierer

Stimmt, gut bemerkt. Sonst wenn er an einem Rand ist läuft er an dem Entlang bis er nach links kann.

0

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.

Suboptimierer  22.05.2015, 11:42

Nee, linksFrei gibt true zurück, wenn vornFrei() true zurück gibt.

0
Oubyi, UserMod Light  23.05.2015, 18:37
@Suboptimierer

Stimmt, der Code bricht ja nach "return" ab und fällt nicht durch (wie z.B. bei switch()). Da habe ich nicht richtig nachgedacht.

1
Suboptimierer  23.05.2015, 18:42
@Oubyi, UserMod Light

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.

1
Suboptimierer  22.05.2015, 11:46

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.

0

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?

Woher ich das weiß:Berufserfahrung – Programmierer
Suboptimierer  22.05.2015, 10:31

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.
1
Suboptimierer  22.05.2015, 11:52

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.

0