## 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]].