Turtle Snake – von Bewegung zum Spiel

lock
Bevorstehend

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.

Ziele dieses Moduls
  • 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 Sie turtle.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:

  1. Event-Handler definieren: Funktionen, die bei Tastendruck aufgerufen werden
  2. 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 Tastaturerkennung
  • onkeypress() reagiert beim Drücken → besseres Spielgefühl als onkey()

💡 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)])

Checklist

0/5