Aktueller Stand: Erste Steuerung für eine Turtle
import gturtle # Helfervariabeln für uns Menschen KEY_LEFT = 37 KEY_RIGHT = 39 KEY_UP = 38 KEY_DOWN = 40 # Steuert beide Turtle bei keypressed-Event def steuern(key): if key.keyCode == KEY_RIGHT: eva.right(90) if key.keyCode == KEY_UP: eva.forward(10) if key.keyCode == KEY_LEFT: eva.left(90) if key.keyCode == KEY_DOWN: eva.back(10) tf = gturtle.TurtleFrame(keyPressed = steuern) # Erste Spiel-Turtle eva = gturtle.Turtle(tf) eva.setColor("green") eva.setPenColor("green") eva.setPenWidth(10) eva.setPos(115,-50) # Zweite Spiel-Turtle joe = gturtle.Turtle(tf) joe.setColor("red") joe.setPenColor("red") joe.setPenWidth(10) joe.setPos(-135, -50)
Repetition if … elif … else
Zunächst repetieren wir die if...elif...else
-Struktur. Lesen Sie dazu den Eintrag im Grundkurs durch.
Übung 1
Input mit
if ... elif ... else
auswertenNehmen Sie folgendes Programm als Basis, bei dem ein Input in der Variabel
figur
gespeichert und ausgegeben wird.import gturtle eva = gturtle.Turtle() figur = input("Welche Figur wollen Sie zeichnen?") print(figur)
Erweitern Sie das Programm so, dass:
- wenn der User “dreieck” schreibt, macht eva ein Dreieck
- wenn der User “viereck” schreibt, macht eva ein Viereck
- wenn der User etwas Anderes schreibt, macht eva nichts und wir zeigen die Nachricht “unbekannte Figur” mit print()
Übung 2
Optimieren wir unsere Steuerung
Mit diesem Wissen der
if...elif...else
-Struktur überlegen Sie sich, was wir an unserer Steuerung optimieren könnten.Bis jetzt haben wir die Steuerung ja so gemacht:
... def steuern(key): if key.keyCode == KEY_RIGHT: eva.right(90) if key.keyCode == KEY_UP: eva.forward(10) if key.keyCode == KEY_LEFT: eva.left(90) if key.keyCode == KEY_DOWN: eva.back(10) ...
Eine Steuerung wie bei Snake
Unsere Steuerung funktioniert bis jetzt ganz anders als bei Snake…
Übung 3
Zu zweit oder zu dritt
- Überlegen Sie sich genau, wie die Steuerung bei Snake funktioniert. Spielen Sie hierzu ein Snake-Spiel und überlegen Sie sich: Wie funktioniert die Steuerung genau?
- Finden Sie in TigerJython unter
Hilfe > APLU-Dokumentation > Befehle
geeignetere Kommandos für ein Snake-Spiel alseva.right(...)
undeva.left(...)
?- Haben Sie eine Idee, wie wir es schaffen könnten, dass sich die Turlte immer vorwärts bewegt? Formulieren Sie Ihre Ideen in Python oder Pseudocode.
Wie ist eine Snake-Steuerung anders?
- Die Steuerung bei Snake ist absolut. Die Pfeiltaste nach rechts lässt die Schlange auf dem Bildschirm nach rechts kriechen, anstatt dass die Schlange relativ zu ihrer Position rechts dreht, wie bei uns.
- Bei Snake bewegt sich die Schlange immer vorwärts.
Dazu haben wir in TigerJython folgende Lösungen gefunden:
- In der Dokumentation haben wir die Funktion
eva.setHeading(...)
gefunden, mit der man der Turtle einen absoluten Winkel vorgeben kann.eva.setHeading(90)
richtet die Turtle auf dem Bildschirm nach rechts aus.- Wir können eine lange Wiederholungsschleife brauchen, damit die Turtle einfach vorwärts läuft. Das funktioniert, aber wir lernen noch eine bessere Lösung kennen.
... for i in range(100000000): eva.forward(10) ...
”Solange”-Schleife mit while
Eine lange Wiederholungsschleife ist nicht optimal, weil wir ja nicht wissen, wie lange das Spiel dauert. Da gibt es eine besser Lösung…
Die while
-Schleife in Python ermöglicht es, einen Block von Anweisungen wiederholt auszuführen, solange eine bestimmte Bedingung True
ist. Die Bedingung funktioniert genau gleich, wie bei der if
-Selektion.
while Bedingung:
# Auszuführende Anweisungen, solange die Bedingung wahr ist
Die while
-Schleife ist nützlich, wenn man nicht im Voraus weiss, wie oft der Codeblock ausgeführt werden muss. Aber Vorsicht: Wenn die Bedingung immer wahr bleibt, führt das zu einer Endlosschleife.
Übung 4
Zu zweit oder zu dritt
Wir bauen eine
while
-Schleife, damit die Turtle so lange vorwärts geht, bis ESC gedrückt wird. Wir erstellen dazu eine HelfervariabelRUNNING
, die standardmässigTrue
speichert, aber dann aufFalse
gesetzt wird, sobald ESC gedrückt wird.
- Erstellen Sie am Anfang eine Helfervariabel
RUNNING = True
.- Erstellen Sie am Ende des Programms eine
while
-Schleife, die folgenden Pseudocode umsetzt:Solange RUNNING True ist: Bewege eva ein bisschen nach vorn
- In der Funktion
steuern()
müssen Sie dem Computer erklären, dass Sie eine “globale” Variabel aus dem Hauptprogramm gebrauchen wollen. Fügen Sie dazu ganz am Anfang der Funktion die Linieglobal RUNNING
hinzu. Danach können Sie die Variabel in der Funktion normal gebrauchen.- Versuchen Sie in der Funktion folgenden Pseudocode umzusetzen:
Falls die aktuelle Taste ESC ist: Gib der Variabel RUNNING den Wert False
Zusammenfassung
Theorie: Einfache Steuerung
- Mit
eva.setHeading(...)
haben wir der Turtle einen absoluten Winkel auf dem Bildschirm vorgegeben –0
ist nach oben,90
nach rechts,180
nach unten,270
nach links, etc.def steuern(key): if key.keyCode == KEY_UP: eva.setHeading(0) elif key.keyCode == KEY_RIGHT: eva.setHeading(90) elif key.keyCode == KEY_DOWN: eva.setHeading(180) elif key.keyCode == KEY_LEFT: eva.setHeading(270) else: print("Unbekannte Taste")
- Damit die Turtle konstant vorwärts geht, haben wir am Ende des Programms eine Schleife gemacht. (Das verbessern wir in der nächsten Lektion)
Weil in RUNNING bereitswhile RUNNING == True: eva.forward(10)
True
oderFalse
gespeichert ist, kann man das auch abkürzen:while RUNNING: eva.forward(10)
- Wenn ESC gedrückt wird, ändern wir den Wert von RUNNING zu
False
. Damit endet dann diewhile
-Schleife und das Programm.