**Dies ist eine alte Version des Dokuments!**
Kara-Labyrinth
Ziel: Viel Programmieren.
Wir steuern Kara, den Marienkäfer, durch ein Labyrinth. Kara kann vorwärts laufen und drehen — er sieht jedoch nur, ob direkt vor ihm, links oder rechts ein Baum steht.
| Befehl | Wirkung |
|---|---|
kara.move() | Einen Schritt vorwärts |
kara.turnLeft() | Um 90° nach links drehen |
kara.turnRight() | Um 90° nach rechts drehen |
kara.treeFront() | True, wenn ein Baum vor Kara steht |
kara.treeLeft() | True, wenn ein Baum links von Kara steht |
kara.treeRight() | True, wenn ein Baum rechts von Kara steht |
kara.onLeaf() | True, wenn Kara auf einem Blatt steht |
Aufgabe 1: Erste Schritte
Führe Kara durch das Labyrinth bis zum Blatt. Schreibe dazu die nötigen Befehle — einen nach dem anderen.
Aufgabe 2: Mit Schleife
Das Labyrinth ist jetzt länger. Statt jeden einzelnen Schritt aufzuschreiben, benutzen wir eine Schleife.
Tipp: Kara soll laufen, bis er das Blatt erreicht:
while not kara.onLeaf(): if not kara.treeFront(): kara.move() elif ...: ... else: ...
Überlege: Was soll Kara tun, wenn er an eine Wand stösst? Nutze kara.treeFront(), kara.treeLeft() und kara.treeRight(), um zu entscheiden, wann Kara abbiegen muss.
Aufgabe 3: Grosses Labyrinth
Jetzt das grosse Labyrinth! An jeder Kreuzung muss Kara selbst entscheiden, wohin er geht.
Tipp: Wandfolger-Strategie
Kara hält die Wand immer auf einer Seite (z.B. links).
Siehst du Situationen in diesem Labyrinth, die beim Wandfolge-Algorithmus Probleme bereiten könnten?
Aufgabe 4: Labyrinth mit Inseln
Und hier? Ideen gibts bei Wikipedia.
Additum 1: Kara in der freien Wildbahn
Kara steht diesmal mitten im offenen Feld — nicht an einer Wand. Der Wandfolger-Algorithmus aus Aufgabe 3 funktioniert nur, wenn Kara bereits an einer Wand ist.
Aufgabe: Schreibe ein Programm in drei Phasen:
- Phase 1: Kara läuft geradeaus, bis er eine Wand erreicht
- Phase 2: Kara dreht sich, damit die Wand auf einer Seite ist
- Phase 3: Kara folgt der Wand bis zum Blatt (wie in Aufgabe 3)
Additum 2: Kompakte Lösungssprache
Ziel: Den Weg aus dem Labyrinth als kompakte Anweisung codieren. Beispiel: Der String 'L---R-R--' steht für „Links, 3x vorwärts, rechts, 1x vorwärts, rechts, 2x vorwärts“.
Schreibe einen Interpreter für die obige Anweisungssprache für Kara. Ein Interpreter ist eine Funktion, die einen String erhält und den Käfer entsprechend bewegt.
Wie wärs mit einer noch kompakteren Sprache, z.B. 'L3R1R2'? Was, wenn mehr als 9 Schritte gemacht werden sollen?
Additum 3: Sokoban!
Ziel: Aus dem Labyrinth finden (also auf das Blatt). Verschiebe Pilze, die im Weg sind…