Turtle Snake – von Bewegung zum Spiel
Programmieren Sie mit turtle ein Snake-Spiel in drei Ausbaustufen: Bewegung → Fressen & Wachsen → eigene Spiel-Features. Sie lernen Game-Loop mit tracer(0)/update(), Event-Steuerung und einfache Kollisionen.
- Sie benennen die Funktion von tracer(0) und update()Erinnern
- Sie erklären den Unterschied zwischen kontinuierlichem Zeichnen und manuellem Aktualisieren.Verstehen
- Sie setzen Tastenevents (onkey) ein, um die Schlange zu steuern.Anwenden
- Sie zerlegen das Snake-Spiel in Teilprobleme (Bewegung, Kollision, Wachstum).Analysieren
- Sie entwerfen eigene Spielideen (z. B. Hindernisse, Booster).Kreieren
Snake ist ein Klassiker der Spieleentwicklung und ideal, um alle wichtigen Konzepte zu lernen: Game-Loop, Tastatursteuerung, Kollisionserkennung und dynamische Datenstrukturen.
In diesem Modul bauen Sie Snake Schritt für Schritt auf – von der einfachen Bewegung bis zum vollständigen Spiel mit Wachstum und Game Over.
💡 Hinweis: Dieses Modul gibt Ihnen die Struktur und Bausteine. Die vollständige Implementierung liegt bei Ihnen – so lernen Sie am meisten!
Theorie: Animation mit Turtle
-
tracer(0)schaltet das automatische Zeichnen ab. Dadurch wird das Bild nur aktualisiert, wenn Sieturtle.update()aufrufen. -
Game-Loop: Mit
ontimer(funktion, delay)erstellen Sie einen wiederholten „Tick“, in dem Spiellogik und Zeichnen passieren. -
Raster: Die Schlange bewegt sich nicht pixelweise, sondern in Schritten (z. B. 20px).
Aufgaben
Schritt 1 – Bewegung
-
Zeichnen Sie ein Spielfeld (z. B. Quadrat mit Rand).
-
Erstellen Sie eine Schlange aus einem Rechteck oder mehreren Segmenten.
-
Implementieren Sie eine Richtungsvariable (rechts, links, oben, unten).
-
Nutzen Sie
onkey, um die Richtung mit den Pfeiltasten zu ändern. -
Lassen Sie die Schlange in regelmäßigen Schritten fortbewegen (
ontimer).
👉 Frage: Wie verhindern Sie, dass die Schlange sofort eine 180°-Wende macht?
Schritt 2 – Essen & Wachsen
-
Platzieren Sie ein zufälliges „Essen“-Objekt im Spielfeld (z. B. Kreis).
-
Wenn der Kopf der Schlange auf dem Essen landet →
-
Verlängern Sie die Schlange um ein Segment.
-
Platzieren Sie neues Essen an einer freien Stelle.
-
-
Prüfen Sie Kollisionen mit dem Rand und mit sich selbst → Spielende.
👉 Frage: Wie stellen Sie sicher, dass das neue Essen nicht in der Schlange erscheint?
Schritt 3 – Erweiterungen (Ihre Wahl)
-
Schlange wird mit jedem Punkt schneller.
-
„Wrap-Around“: Schlange geht auf der anderen Seite weiter.
-
Hindernisse im Spielfeld.
-
Verschiedene Essen-Typen mit unterschiedlicher Wirkung (z. B. Bonuspunkte, Speed).
-
Score-Anzeige oben im Fenster.
👉 Challenge: Entwickeln Sie ein eigenes Feature, das die Spielmechanik verändert (z. B. Zeitlimit, Level).
🎮 Tastatursteuerung verstehen
Die Tastatursteuerung funktioniert in zwei Schritten:
- Event-Handler definieren: Funktionen, die bei Tastendruck aufgerufen werden
- Events registrieren: Mit
screen.onkeypress(funktion, taste)
Wichtig:
- Die Funktionen ändern nur die
richtung-Variable - Die eigentliche Bewegung passiert im Game-Loop
screen.listen()aktiviert die Tastaturerkennungonkeypress()reagiert beim Drücken → besseres Spielgefühl alsonkey()
💡 Tipp: Verwenden Sie global richtung in den Funktionen, um die Variable zu ändern.
Note
📐 Raster-System verstehen
Snake bewegt sich nicht pixelweise, sondern in festen Schritten (z.B. 20 Pixel). Das ist wichtig für:
- Saubere Kollisionserkennung: Kopf und Essen sind immer exakt ausgerichtet
- Segmente: Jedes Teil ist gleich groß und passt perfekt aneinander
- Performance: Weniger Berechnungen nötig
Raster-Ausrichtung:
# Beliebige Koordinate auf 20er-Raster ausrichten
x = (x // 20) * 20 # z.B. 137 → 140
y = (y // 20) * 20
🚀 Erweiterungsideen
Ihr Snake-Spiel funktioniert! Jetzt können Sie es individuell gestalten:
💯 Score-Anzeige
score_display = turtle.Turtle()
score_display.color("white")
score_display.penup()
score_display.hideturtle()
score_display.goto(0, 260)
def update_score():
score_display.clear()
score_display.write(f"Score: {score}", align="center", font=("Arial", 16, "normal"))
⚡ Geschwindigkeitssteigerung
# Je höher der Score, desto kürzer die Pause
verzoegerung = max(0.05, 0.15 - score * 0.01)
time.sleep(verzoegerung)
🌀 Wrap-Around (durch Wände)
if kopf.xcor() > 290:
kopf.setx(-290)
elif kopf.xcor() < -290:
kopf.setx(290)
# Gleiches für y-Koordinate
🎨 Farb-Animation
farben = ["red", "orange", "yellow", "green", "blue", "purple"]
for i, segment in enumerate(segmente):
segment.color(farben[i % len(farben)])