# 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. ###### #>...# ####.# #L...# ###### ## 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. ######## #>.....# ######.# ######.# ######.# #....L.# ######## ## 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). ++++Lösung:| while not kara.onLeaf(): if not kara.treeLeft(): # Links ist frei → links abbiegen und vorwärts gehen kara.turnLeft() kara.move() elif not kara.treeFront(): # Geradeaus ist frei → vorwärts gehen kara.move() else: # Sackgasse → nach rechts drehen (und weiter prüfen) kara.turnRight() ++++ ###v################# #.#.....#.#.........# #.###.#.#.#.###.###.# #.#...#...#.#...#.#.# #.#.###.#####.###.#.# #...#...#.....#.#...# #####.###.###.#.#.### #...#.#.....#.....#.# #.###.#####.#.#####.# #.....#...#.#.......# #.#.#####.#.#######.# #.#.......#.......#.# #.###############.#.# #.#.#...........#...# #.#.#.#.#######.#.#.# #...#.#.....#.#...#.# #.###.#####.#.#.###.# #.#.....#...#...#...# #.#######.###.###.### #.........#.........# #########L########### Siehst du Situationen in diesem Labyrinth, die beim Wandfolge-Algorithmus Probleme bereiten könnten? ## Aufgabe 4: Labyrinth mit Inseln Und hier? Ideen gibts bei [[wpde>Lösungsalgorithmen_für_Irrgärten#Pledge-Algorithmus|Wikipedia]]. ++++Lösung| # Pledge-Algorithmus angle = 0 while not kara.onLeaf(): # Wir verlassen die Wand, wenn wir in der Ursprungsrichtung # laufen. if not kara.treeLeft() and angle != 0: kara.turnLeft() angle += 90 kara.move() elif not kara.treeFront(): kara.move() else: kara.turnRight() angle -= 90 ++++ ##################### #.#.....#.#.........# #.###.#.#.#.###.###.# #.#...#...#.#..v#.#.# #.#.###.###.#.###.#.# #...#...#.....#.#...# #####.###.###.#.#.### #...#.#.....#.....#.# #.###.#####.#.#####.# #.....#...#.#.......# #.#.#####.#.#######.# #.#.......#.......#.# #.###############.#.# #.#.#...........#...# #.#.#.#.#######.#.#.# #...#.#.....#.#...#.# #.###.#####.#.#.###.# #.#.....#...#...#...# #.#######.###.###.### #.........#.........# #########L########### ## Additum 1: Kara in der freien Wildbahn Kara steht diesmal mitten im offenen Feld — nicht an einer Aussenwand. Funktioniert der Pledge-Algorithmus aus Aufgabe 4 hier auch? ##############################L## #...............................# #...............................# #...............................# #............#######............# #............#.....#............# #............#.....#............# #............#.#.#.#............# #............###.###............# #...............................# #...............................# #...............................# #...........####.####...........# #...#####...#..#.#..#...#####...# #...#...#...#..#>#..#...#...#...# #...#..##...####.####...##..#...# #...#.......................#...# #...#..##...####.####...##..#...# #...#...#...#..#.#..#...#...#...# #...#####...#..#.#..#...#####...# #...........####.####...........# #...............................# #...............................# #...............................# #............###.###............# #............#.#.#.#............# #............#.....#............# #............#.....#............# #............#######............# #...............................# #...............................# #...............................# ################################# ## 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... ####### #.....# #.>.#.# #....ML #.....# #.....# ####### ############# #>.M....##### ####.######## ####.######## ####M######## ####...M....# ####.###.#### ########.#### ########.#### ########L#### ######### #>......# #...M...# ####.#### ####M### ####.#### #.......# #.......# #.L.....# ######### ######### #>......# #.......# #..MM...# ###.M#### #..M..### ##.#..### ##.###### #.......# #.......# #.L.....# #########