Lektion 11: Projekt: Snake

Das große Finale: Snake, das Kult-Spiel. Dafür verlässt du zum ersten Mal den Browser, denn ein echtes Spiel mit Grafik und Tastatursteuerung braucht Python auf deinem eigenen Rechner. Genau so arbeitest du später auch im Betrieb, das gehört also sowieso ins Repertoire.

Schritt 1: Python installieren (einmalig, 5 Minuten)

Lade Python von python.org/downloads herunter und starte den Installer. Wichtig bei Windows: Setz im ersten Fenster den Haken bei "Add python.exe to PATH", sonst findet die Kommandozeile Python später nicht. Danach prüfst du die Installation: Eingabeaufforderung öffnen (Windows-Taste, "cmd" tippen) und eingeben:

Prüfbefehl
python --version
# Ausgabe z. B.: Python 3.12.4

Schritt 2: Eine Code-Datei anlegen

Erstelle einen Ordner, z. B. snake, und darin eine Datei snake.py. Am bequemsten geht das mit einem Editor wie VS Code (kostenlos), zur Not reicht sogar der Windows-Editor. Ausgeführt wird die Datei in der Eingabeaufforderung mit:

Ausführen
cd snake
python snake.py

Schritt 3: Das Spiel

Wir nutzen das turtle-Modul, das bei Python schon dabei ist (nichts extra zu installieren). Kopiere den kompletten Code in deine snake.py und starte sie. Steuerung: Pfeiltasten.

snake.py (kompletter Code)
import turtle
import random

# ─── Fenster ───────────────────────────────
fenster = turtle.Screen()
fenster.title("Snake - Lernarena Edition")
fenster.bgcolor("#0D1117")
fenster.setup(width=600, height=600)
fenster.tracer(0)   # wir zeichnen selbst, wann wir wollen

# ─── Schlange ──────────────────────────────
kopf = turtle.Turtle()
kopf.shape("square")
kopf.color("#5FD98A")
kopf.penup()
kopf.goto(0, 0)
richtung = "stop"

koerper = []   # Liste der Koerper-Segmente (Lektion 7!)

# ─── Futter ────────────────────────────────
futter = turtle.Turtle()
futter.shape("circle")
futter.color("#FF6B63")
futter.penup()
futter.goto(0, 100)

# ─── Punkte ────────────────────────────────
punkte = 0
anzeige = turtle.Turtle()
anzeige.hideturtle()
anzeige.penup()
anzeige.color("white")
anzeige.goto(0, 260)
anzeige.write("Punkte: 0", align="center", font=("Arial", 16, "bold"))

# ─── Steuerung (Funktionen, Lektion 8!) ────
def hoch():
    global richtung
    if richtung != "runter":
        richtung = "hoch"

def runter():
    global richtung
    if richtung != "hoch":
        richtung = "runter"

def links():
    global richtung
    if richtung != "rechts":
        richtung = "links"

def rechts():
    global richtung
    if richtung != "links":
        richtung = "rechts"

fenster.listen()
fenster.onkey(hoch, "Up")
fenster.onkey(runter, "Down")
fenster.onkey(links, "Left")
fenster.onkey(rechts, "Right")

# ─── Spiel-Schleife (Lektion 5!) ───────────
def spiel_schritt():
    global punkte, richtung

    # Koerper folgt dem Kopf (von hinten nach vorne)
    for i in range(len(koerper) - 1, 0, -1):
        x = koerper[i - 1].xcor()
        y = koerper[i - 1].ycor()
        koerper[i].goto(x, y)
    if koerper:
        koerper[0].goto(kopf.xcor(), kopf.ycor())

    # Kopf bewegen
    if richtung == "hoch":
        kopf.sety(kopf.ycor() + 20)
    elif richtung == "runter":
        kopf.sety(kopf.ycor() - 20)
    elif richtung == "links":
        kopf.setx(kopf.xcor() - 20)
    elif richtung == "rechts":
        kopf.setx(kopf.xcor() + 20)

    # Futter gefressen? (if/else, Lektion 4!)
    if kopf.distance(futter) < 20:
        futter.goto(random.randint(-280, 280), random.randint(-280, 280))
        neu = turtle.Turtle()
        neu.shape("square")
        neu.color("#B8F0C4")
        neu.penup()
        koerper.append(neu)
        punkte = punkte + 10
        anzeige.clear()
        anzeige.write(f"Punkte: {punkte}", align="center",
                      font=("Arial", 16, "bold"))

    # Wand beruehrt? -> Game over
    if (abs(kopf.xcor()) > 290 or abs(kopf.ycor()) > 290):
        anzeige.clear()
        anzeige.write(f"GAME OVER - {punkte} Punkte", align="center",
                      font=("Arial", 16, "bold"))
        return   # Schleife stoppt

    # Sich selbst beruehrt? -> Game over
    for segment in koerper:
        if kopf.distance(segment) < 10:
            anzeige.clear()
            anzeige.write(f"GAME OVER - {punkte} Punkte", align="center",
                          font=("Arial", 16, "bold"))
            return

    fenster.update()
    fenster.ontimer(spiel_schritt, 120)   # naechster Schritt in 120 ms

spiel_schritt()
fenster.mainloop()

Schau dir den Code in Ruhe an: Da steckt alles aus dem Kurs drin. Die Segmentliste ist Lektion 7, die Steuerungsfunktionen sind Lektion 8, die Spiel-Schleife ist Lektion 5, die Kollisionsprüfungen sind Lektion 4, und random kennst du aus Lektion 6.

Falls etwas nicht läuft: Lies die Fehlermeldung (Lektion 9!). Häufigste Ursachen: Tippfehler beim Abtippen (deshalb: kopieren), oder auf manchen Linux-Systemen fehlt turtle/tkinter (dann sudo apt install python3-tk).

Übung 11.1: Mach das Spiel schneller oder langsamer: Ändere den Wert 120 beim ontimer-Aufruf und finde deine Lieblingsgeschwindigkeit.

Übung 11.2: Jedes gefressene Futter soll das Spiel um 2 ms schneller machen. Tipp: Mach aus der 120 eine Variable tempo (mit global tempo in der Funktion) und verringere sie beim Fressen.

Übung 11.3 (Königsklasse): Bau einen Highscore ein, der auch nach Game Over stehen bleibt, oder lass die Schlange bei Wandberührung auf der gegenüberliegenden Seite wieder erscheinen statt zu sterben.