## Labyrinthe (Bonus)
Mit unserem Wissen über Schleifen und Verzweigungen können wir bereits aus einem einfachen Labyrinth finden.
### Aufgabe L1
Schreibe möglichst kompakten Code, der aus dem Labyrinth findet. Schau falls nötig bei [[.:loops]] oder [[.:verzweigungen]] nach, wie diese im Code umgesetzt werden.
TTTTTTTTT
T> T
TTTTTTT T
T T T
TTT TTT T
T M
T TTTT T
T T
TTTTTTTTT
while not kara.mushroomFront():
if kara.treeFront():
kara.turnRight()
else:
kara.move()
### Aufgabe L2
Schwieriger wird es, wenn je nach Situation nach links statt nach rechts gewendet werden soll. Wie wird sich Kara mit dem Code von Aufgabe 7 bewegen? Findet Kara zum Pilz? Was musst du ändern, um ins Ziel zu kommen? Denk dran, dass sich Verzweigungen (`if`) und Schleifen (`while`) beliebig ineinander verschachteln lassen!
# Lösung von Aufgabe 7 - was passiert?
while not kara.mushroomFront():
if kara.treeFront():
kara.turnRight()
else:
kara.move()
TTTTTTTTT
T> T
TTTTTTT T
T T
T TTTTTTT
T T
TTTTTTT T
M T
TTTTTTTTT
while not kara.mushroomFront():
if kara.treeFront():
kara.turnRight()
if kara.treeFront():
# Umdrehen, wenn die Rechtsdrehung nichts gebracht hat.
kara.turnLeft()
kara.turnLeft()
else:
kara.move()
### Mehr Bedingungen
Damit wir Kara nicht die ganze Zeit umdrehen müssen, können wir sie auch zusätzlich fragen, ob links oder rechts von ihr ein Baum ist:
* `kara.treeLeft()` trifft zu, falls links von Kara (in Laufrichtung) ein Baum steht.
* `kara.treeRight()` trifft zu, falls links von Kara (in Laufrichtung) ein Baum steht.
### Aufgabe L3
Schreibe die Lösung zu Aufgabe 8 um, indem du die neuen Bedingungen einbaust!
++++Lösung L3|
while not kara.mushroomFront():
if kara.treeFront():
if kara.treeLeft():
kara.turnRight()
else:
kara.turnLeft()
else:
kara.move()
++++
### Aufgabe L4
Reicht das bereits, um aus jedem Labyrinth hinauszufinden? Zu früh gefreut, hier wartet die nächste Herausforderung! Überlege dir zuerst, wie du aus einem Labyrinth finden würdest, bevor du dich an den Code wagst!
# Lösung von Aufgabe L1 - was passiert?
while not kara.mushroomFront():
if kara.treeFront():
kara.turnRight()
else:
kara.move()
TTTTTTTTT
T> T
TTTTTTT T
T T T
T T TT TT
T T T
T TTTTTTT
M T
TTTTTTTTT
while not kara.mushroomFront():
# Wir folgen der rechten Wand
if not kara.treeRight():
kara.turnRight()
kara.move()
else:
if not kara.treeFront():
kara.move()
else:
kara.turnLeft()
++++Ideen|
* ... einfach mal die Hand an die Wand legen und nie loslassen!
++++
### Wie weiter?
Gratulation, du hast das Kara-Labyrinth Dossier fertig bearbeitet!
Aber halt! Gibt es Labyrinthe, aus denen wir mit dem Wand-Folge-Algorithmus nicht hinausfinden? Was könnte man in dieser Situation tun?
++++Ideen|
* Wenn Kara mitten im Raum steht, müssen wir zuerst eine Wand finden!
* Wenn die gefolgte Wand eine Insel im Labyrinth bildet, so laufen wir im Kreis.
* Abhilfe:
* Wir könnten uns merken, wo wir bereits durchgelaufen sind, und allenfalls eine andere Abzweigung nehmen ([[wpde>Ariadnefaden]]).
* Wir könnten Kara auch einfach eine Zufallswahl treffen lassen und hoffen, dass wir irgendwann zum Pilz finden...
* Mehr Ideen: [[wpde>Lösungsalgorithmen_für_Irrgärten]]
++++
### Aufgabe L5 (Challenge)
Finde aus dem untenstehenden Labyrinth!
#####################
#.#.....#.#.........#
#.###.#.#.#.###.###.#
#.#...#...#.#..v#.#.#
#.#.###.###.#.###.#.#
#...#...#.....#.#...#
#####.###.###.#.#.###
#...#.#.....#.....#.#
#.###.#####.#.#####.#
#.....#...#.#.......#
#.#.#####.#.#######.#
#.#.......#.......#.#
#.###############.#.#
#.#.#...........#...#
#.#.#.#.#######.#.#.#
#...#.#.....#.#...#.#
#.###.#####.#.#.###.#
#.#.....#...#...#...#
#.#######.###.###.###
#.........#.........#
#########M###########
# Pledge-Algorithmus
angle = 0
while not kara.mushroomFront():
# 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