Unterrichtskonzeption
L1:
Sequenz, Iteration (while)
Einführung Bottom-Editor, Permalinks, Dokumentation
L2:
L3:
L4:
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.
kara.removeLeaf() nimmt ein Blatt auf.
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:
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()
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