Lösungsidee zum Hamsterlabyrinth

Es kam ja letztends eine Anfrage, ob ich nicht ein Programm für den Java-Hamster vorschlagen könnte, den ich bereits vorgestellt hatte. Das mache ich natürlich gerne und ich hoffe, dass auch jene, die sich nicht mit einer ähnlichen Aufgabe beschäftigen, etwas lernen können … oder wenigstens einen besseren Einblick in die Programmierung mit dem Hamster bekommen. 

Die Aufgabe lauterte Folgendermaßen: Es geht dabei um Verweigungen, auch bekannt als if-else-Anweisungen. Der Hamster soll durch ein Labyrinth laufen und ein Korn suchen. Dort soll er stehen bleiben. Natürlich soll das Programm für alle möglichen Labyrinthe (mit einer Gangbreite von genau einem Kästchen) funktionieren. Hier einmal ein Beispiel:

Für die Aufgabe sind die vier Grundbefehle, die drei Testanweisungen, Schleifen und die neuen If-Else-Anweisungen bekannt und zu verwenden.

Wie jedes Hamsterprogramm startet auch dieses, indem die Main-Prozedur ausgeführt wird. Deshalb erstmal:

void main(){

}

Der Hamster soll so lange suchen, bis er das Korn gefunden hat. Also brauchen wir eine Schleife, die testet, ob er das Korn gefunden hat, oder nicht. Dafür nehmen wir eine while-Schleife und den Test-Befehl kornDa(). Dieser liegert true zurück, wenn der Hamster auf einem Feld mit mindestens einem Korn steht. Da die Schleife aber laufen soll, solange er dies NICHT tut, müssen wir das Ergebnis des Tests mit dem !-Operator umdrehen. Dann liefert der Test solange true, wie auf dem Feld, auf welchem der Hamster steht, kein Korn liegt.

while(!kornDa()){

}

Wir sagen: Der Hamster soll immer an der rechtsnWand entlang laufen. Da das Labyrinth nur ein Feld breite Gänge haben darf, funktioniert das. Er soll also immer testen, ob er nach rechtsgehen kann. Wenn ja, dann soll er diesen Weg nehmen, wenn nicht, soll er geradeaus gehen, sofern das geht. Geht es nicht, probiert er es mit der linkenSeite. Geht auch das nicht, bleibt nur der Weg zurück.

also:

linksUm();
linksUm();
linksUm();
if(vornFrei()){
  vor();
  } else {
    linksUm();
    if(vornFrei()){
      vor();
    }  else {
      linksUm();
      if(vornFrei()){
        vor();
      } else {
        linksUm();
        vor();
      }
   }
}

und das war es auch schon … ich weiß, die vielen linksUm() und if-else-Anweisungen sind nicht sonderlich schön. Es ginge auch einfacher, aber ich wollte möglichst einfache Mittel verwenden, die für diese Aufgabe auch zugelassen waren.

Nochmal zusammengefasst:

void main() {
 while(!kornDa()){
   linksUm();
   linksUm();
   linksUm();
   if(vornFrei()){
    vor();
   } else {
     linksUm();
     if(vornFrei()){
      vor();
     } else {
       linksUm();
       if(vornFrei()){
         vor();
       } else {
       linksUm();
       vor();
       }
     }
    }
  }
}

Für diejenigen, die schon komplexere Strukturen gewöhnt sind: Natürlich kann vieles auch in externe Proeduren auslagern. Ich werde das nicht mehr genau kommentieren. Hier nur mal ein Beispiel:

Achtung: Die linksFrei()-Funktion taugt nur für diese Aufgabe, da sie Nebeneffekte erzeugt. Bitte nicht kopieren und für andere Programme verwenden.

void main(){
  while(!kornDa()){
    kehrt();
    while(!linksFrei()){}
      vor();
    }
  }
}

boolean linksFrei(){
  linksUm();
  return vornFrei();
}

void kehrt(){
  linksUm();
  linksUm();
}

ich habe beide Programme getestet und sie funktionieren einwandfrei. In beiden verhält sich der Hamster absolut gleich. ich hoffe, ich konnte euch helfen. Wenn nicht, einfach weiterhin Kommentare schreiben.

4 comments on “Lösungsidee zum Hamsterlabyrinth
  1. # void main(){
    # while(!kornDa()){
    # kehrt();
    # while(!linksFrei()){}
    # vor();
    # } //<—- die klammer ist zuviel
    # }
    # }

  2. das hamstersoll die körner aunehmen, aber wenn er wieder umkert, stoppt das programm, da ja da ein leeres feld da ist und der befehl ja ”false” ist, da er nur weite´rgehen soll, wenn ein feld mit mind. einem korn besteht

Leave a Reply

Your email address will not be published. Required fields are marked *