## Selektion mit Verzweigungen
### Blätter legen und sammeln
Neben Pilzen gibt es in der Kara-Welt auch Kleeblätter (en. _leaf_). Während ein einzelner Pilz von Kara herumgeschoben werden kann, können Blätter gelegt und aufgenommen werden. Die folgenden Funktionen stehen zur Verfügung:
* `kara.onLeaf()` ist genau dann wahr (`True`), falls sich Kara auf einem Kleeblatt befindet, sonst falsch (`False`).
* `kara.putLeaf()` legt ein Blatt ab.
* Schlägt fehlt und beendet das Programm, wenn bereits ein Blatt vorhanden ist.
* `kara.removeLeaf()` nimmt ein Blatt auf.
* Schlägt fehlt und beendet das Programm, wenn kein Blatt vorhanden ist.
#### Aufgabe C1: Blätter sammeln
Schreibe Code, um alle bestehenden Blätter aufzusammeln. Achtung, auf dem Startfeld hat es kein Blatt!
TTTTTTTTT
T>LLLLLLT
TTTTTTTTT
while not kara.treeFront():
kara.move()
kara.removeLeaf()
assert world_leaves() == 0, f"Es hat noch {world_leaves()} Blätter!"
### Verzweigungen
Wir können nur Blätter aufnehmen, wenn eines vorhanden ist. Um eine Anweisung nur dann auszuführen, wenn eine Bedingung wahr ist, verwenden wir eine Verzweigung. Das Schlüsselwort in Python lautet `if` (_en._ falls).
Der Fachbegriff für eine Verzweigung ist **Selektion** (Auswahl eines Ausführungspfades).
Beispiel: Der folgende Code sammelt nur dann ein Blatt, wenn `kara.onLeaf()` wahr ist. Beachte: Der bedingt ausgeführte Code-Block muss **eingerückt** sein.
TTTTTTTTT
T>L L L T
TTTTTTTTT
while not kara.treeFront():
kara.move()
if kara.onLeaf():
kara.removeLeaf()
assert world_leaves() == 0, "keine Blätter erwartet"
#### Aufgabe C2: Blätter verteilen
Schreibe Code, der gerade umgekehrt funktioniert: Überall, wo **kein** Blatt ist, soll eines hingelegt werden - auch im Startfeld.
TTTTTTTTTT
T>L L L LT
TTTTTTTTTT
assert world_leaves() == 8, "8 Blätter erwartet"
while not kara.treeFront():
if not kara.onLeaf():
kara.putLeaf()
kara.move()
#### Aufgabe C3: Labyrinth-Gärtner
Schreibe Code mit `while` und `if`, um alle Blätter aufzusammeln. Kara stoppt, wenn Sie einen Pilz erreicht.
TTTTTTTTTTT
T>L L L L T
TTTTTTTTTLT
TLLL LLT T
TLTTTTTLTLT
TLTLLMTLTLT
TLTLTTTLTLT
TLT TLT
TLTTTTTTTLT
TLLLLLLLLLT
TTTTTTTTTTT
while not kara.mushroomFront():
if kara.treeFront():
kara.turnRight()
kara.move()
if kara.onLeaf():
kara.removeLeaf()
assert world_leaves() == 0, "alle Blätter sollten entfernt sein"
### Verzweigung mit Alternative
Wenn Kara entweder je nach Bedingung die eine oder andere Anweisung ausführen soll, so können wir `if` zusammen mit `else` benützen.
Der folgende Code sammelt die bestehenden Blätter und legt ein neues Blatt hin, falls es keines hat (ausser im letzten Feld):
TTTTTTTTT
T>L L L T
TTTTTTTTT
while not kara.treeFront():
if kara.onLeaf():
kara.removeLeaf()
else:
kara.putLeaf()
kara.move()
assert world_leaves() == 3
#### Aufgabe C4: Blattwanderung
Schreibe Python-Code mit folgenden Eigenschaften:
* Kara soll folgende Anweisungen befolgen, solange sie auf keinen Pilz stösst.
* Wenn Kara auf einem Blatt steht,
* soll sie nach links wenden;
* andernfalls:
* soll Kara nach rechts wenden.
* Dann soll Kara einen Schritt nach vorne machen.
Bei welchem Pilz landet Kara?
TTTTTTTTTTT
TM MT
T L LL L T
TL LLLLL T
T L T
TL >L LL T
T LL L T
T L L T
TM L MT
TTTTTTTTTTT
while not kara.mushroomFront():
if kara.onLeaf():
kara.turnLeft()
else:
kara.turnRight()
kara.move()
assert kara.x == 8, "Kara sollte links neben dem Pilz in der rechten, oberen Ecke sein."
assert kara.y == 1, "Kara sollte links neben dem Pilz in der rechten, oberen Ecke sein."
#### Aufgabe C5: Pilzsuche
Lies das folgende Python-Programm für Kara und beschreibe es in natürlicher Sprache. Bestimme, auf welchem Feld Kara landen wird.
while not kara.treeFront():
if kara.onLeaf():
kara.turnLeft()
if kara.mushroomFront():
kara.turnRight()
kara.move()
{{.:leaves:pasted:20260828-062628.png?nolink&407|}}
++++Lösung|
Kara landet auf dem Feld **B6**.
Eine Beschreibung könnte so aussehen:
* Solange Kara nicht vor einem Baum steht:
* Falls Kara auf einem Blatt steht:
* ... wendet sie nach links.
* Falls Kara vor einem Pilz steht:
* ... wendet sie nach rechts.
* So oder so geht Kara einen Schritt weiter.
TTTTTTTTTTT
T L L T
T M T
T M ML T
T T
T LM L T
T v L T
T L M T
T L L T
T T
TTTTTTTTTTT
while not kara.treeFront():
if kara.onLeaf():
kara.turnLeft()
if kara.mushroomFront():
kara.turnRight()
kara.move()
++++
#### Aufgabe C6: Golfplatz (schwierig)
Der Golf-Rasen ist voller Blätter - schreibe Code, um alle Blätter aufzusammeln!
++++Hinweise:|
* Idee 1: Einmal links, einmal rechts wenden. Dafür benötigen wir für jede Strecke eine while not `kara.treeFront()` Schleife.
* Idee 2: Spirale laufen. Wenn ein Feld ohne Blatt erreicht wird, müssen wir zurück und wenden.
++++
TTTTTTTTTTT
TeLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TTTTTTTTTTT
# Spirale laufen
while kara.onLeaf():
kara.removeLeaf()
# Wenden beim Baum.
if kara.treeFront():
kara.turnRight()
kara.move()
if not kara.onLeaf():
# zu weit! Aus Kara's Sicht hinten rechts weitersuchen.
kara.turnRight()
kara.move()
kara.turnRight()
kara.move()
kara.turnLeft()
assert world_leaves() == 0
### Weiter
Weiter gehts mit [[.:logik]].