++++Unterrichtskonzeption|
* L1:
* Sequenz, Iteration (`while`)
* Einführung Bottom-Editor, Permalinks, Dokumentation
* L2:
* Vertiefung und Wiederholung Iteration
* Sequenz in Iteration
* Mehrere Iterationen
* Verschachtelte Iteration
* Selektion
* mit Blatt (`if kara.onLeaf()`)
* if-else (Blätter sammeln / legen)
* L3:
* Algorithmik
* Von der Idee zum Programm:
* Python lesen und beschreiben.
* Python-Programm in Natural Language (NL) beschreiben.
* NL Schritt-für-Schritt in Python übersetzen
* Selber ein NL-Programm aufschreiben
* Sequenz
* Iteration (was ist die Bedingung für `while`?)
* L4:
* Bool'sche Logik: `not`, `and`, `or`
* L5:
* Variablen
* Schleifen mit Zähler
++++
## Blätter 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.
### 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, "keine Blätter erwartet"
### 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`.
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"
Der Fachbegriff für eine Verzweigung ist **Selektion** (Auswahl einer Anweisung).
### Aufgabe: 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 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: 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: 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**:
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 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
T>LLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TLLLLLLLLLT
TTTTTTTTTTT
# Spirale laufen
kara.move()
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