Wie erstelle ich ein Snake-Spiel in Python?

Einführung in die Entwicklung eines Schlangenspiels mit Python

Sind Sie ein Fan des klassischen Schlangenspiels? Dann wird Sie dieser Artikel sicherlich begeistern! Wir werden gemeinsam ein einfaches Schlangenspiel entwickeln, das auch für Python-Anfänger leicht umzusetzen ist.

Es gibt unterschiedliche Ansätze zur Erstellung eines solchen Spiels. Eine Möglichkeit ist die Verwendung der PyGame-Bibliothek, einer leistungsstarken Python-Bibliothek für die Spieleentwicklung. Eine andere, einfachere Methode nutzt die Turtle-Bibliothek. Dieses Modul ist standardmäßig in Python enthalten und bietet eine virtuelle Leinwand zum Zeichnen von Formen und Bildern.

In diesem Tutorial werden wir die Turtle-Bibliothek nutzen, um ein anfängerfreundliches Schlangenspiel zu programmieren. Dies ist besonders geeignet für Python-Neulinge.

Zusätzlich zur Turtle-Bibliothek werden wir zwei weitere wichtige Module verwenden:

  • Das Zeitmodul: Ermöglicht die Messung von Zeitintervallen, was für die Spielsteuerung unerlässlich ist.
  • Das Zufallsmodul: Erzeugt Zufallszahlen, die wir für die Positionierung des Futters der Schlange benötigen.

Neben diesen Modulen benötigen Sie einen Texteditor Ihrer Wahl. Ich empfehle VSCode. Stellen Sie sicher, dass Python 3 auf Ihrem Rechner installiert ist. Alternativ können Sie auch Online-Compiler wie wdzwdz verwenden.

Legen wir los und haben Spaß beim Programmieren!

Spielmechanik des Schlangenspiels

Ziel des Spiels ist es, die Schlange mithilfe von Richtungstasten so zu steuern, dass sie das auf dem Bildschirm erscheinende Futter sammelt. Dabei geht es darum, den höchstmöglichen Punktestand zu erzielen. Die Schlange bewegt sich entsprechend den Eingaben des Spielers. Berührt die Schlange einen Bildschirmrand oder sich selbst, ist das Spiel verloren.

Für die Umsetzung des Spiels werden wir die folgenden Schritte befolgen:

  • Import der erforderlichen Module (Turtle, Time und Random).
  • Einrichtung des Spielbildschirms mit dem Turtle-Modul.
  • Festlegung der Tasten für die Bewegungsrichtung der Schlange.
  • Implementierung der Spiellogik.

Erstellen Sie eine neue Datei mit dem Namen `snakegame.py`. Hier werden wir den Code für das Spiel einfügen.

Import der benötigten Module

Zunächst importieren wir die standardmäßig in Python verfügbaren Module `turtle`, `random` und `time`. Darüber hinaus definieren wir Variablen für den aktuellen Punktestand, den höchsten Punktestand und die Verzögerungszeit. Die Verzögerungszeit steuert das Tempo des Spiels und wird durch das `time`-Modul realisiert.


import turtle
import random
import time

player_score = 0
highest_score = 0
delay_time = 0.1
    

Erstellung der Spieloberfläche

Das `turtle`-Modul ermöglicht die Erstellung einer virtuellen Leinwand, die als Spielfenster dient. Hier werden wir die Schlange, das Futter und die Spielergebnisse darstellen. Das Fenster erhält einen Titel und eine Hintergrundfarbe. Die Größe wird ebenfalls festgelegt.


# window screen created
wind = turtle.Screen()
wind.title("Snake Maze🐍")
wind.bgcolor("red")

# The screen size
wind.setup(width=600, height=600)


# creating the snake 
snake = turtle.Turtle()
snake.shape("square")
snake.color("black")
snake.penup()
snake.goto(0, 0)
snake.direction = "Stop"

# creating the food
snake_food = turtle.Turtle()
shapes = random.choice(['triangle','circle'])
snake_food.shape(shapes)
snake_food.color("blue")
snake_food.speed(0)
snake_food.penup()
snake_food.goto(0, 100)

pen = turtle.Turtle()
pen.speed(0)
pen.shape('square')
pen.color('white')
pen.penup()
pen.hideturtle()
pen.goto(0, 250)
pen.write("Your_score: 0 Highest_Score : 0", align="center", 
font=("Arial", 24, "normal"))
turtle.mainloop()
    

Wir initialisieren den Turtle-Bildschirm und setzen Titel sowie Hintergrundfarbe. Nach der Definition der Fenstergröße zeichnen wir die Schlange auf der Leinwand. Die `penup()`-Methode hebt den Stift der Schildkröte auf, sodass keine Linien gezeichnet werden, wenn sich die Schlange bewegt. Die `goto(x, y)`-Methode positioniert die Schildkröte an einer bestimmten Stelle auf dem Bildschirm.

Als Nächstes erstellen wir das Futter, das die Schlange einsammeln soll. Zudem zeigen wir den aktuellen Punktestand und den Highscore des Spielers an. Die `pen.write()`-Methode realisiert die Anzeige des Textes. `hideturtle()` verbirgt das Turtle-Symbol im oberen Bereich des Bildschirms, wo der Text geschrieben wird.

Am Ende des Codes muss `turtle.mainloop()` hinzugefügt werden, damit das Fenster nicht sofort geschlossen wird und Sie als Nutzer mit der Anwendung interagieren können.

Wenn Sie die Datei ausführen, sollten Sie folgendes Bild sehen:

Konfiguration der Richtungstasten für die Schlange

Hier definieren wir Tasten zur Steuerung der Schlange. ‚L‘ steht für links, ‚R‘ für rechts, ‚U‘ für oben und ‚D‘ für unten. Diese Anweisungen werden über die Bewegungsfunktion der Turtle-Bibliothek für die Schlange umgesetzt.


# Assigning directions
def moveleft():
    if snake.direction != "right":
        snake.direction = "left"

def moveright():
    if snake.direction != "left":
        snake.direction = "right"

def moveup():
    if snake.direction != "down":
        snake.direction = "up"

def movedown():
    if snake.direction != "up":
        snake.direction = "down"

def move():
    if snake.direction == "up":
        coord_y = snake.ycor()
        snake.sety(coord_y+20)

    if snake.direction == "down":
        coord_y = snake.ycor()
        snake.sety(coord_y-20)

    if snake.direction == "right":
        coord_x = snake.xcor()
        snake.setx(coord_x+20)

    if snake.direction == "left":
        coord_x = snake.xcor()
        snake.setx(coord_x-20)

wind.listen()
wind.onkeypress(moveleft, 'L')
wind.onkeypress(moveright, 'R')
wind.onkeypress(moveup, 'U')
wind.onkeypress(movedown, 'D')
    

Die `move()`-Funktion bewegt die Schlange in die gewünschte Richtung, jeweils um einen bestimmten Wert. Die `listen()`-Funktion ist ein Event-Listener, der die entsprechenden Bewegungsfunktionen aufruft, wenn der Spieler eine der Pfeiltasten betätigt.

Implementierung der Spiellogik

Nachdem wir die grundlegende Struktur des Spiels erstellt haben, müssen wir die Spielmechanik in Echtzeit umsetzen. Dazu gehören:

  • Verlängerung der Schlange bei jedem Einsammeln des Futters, mit einer neuen Farbe.
  • Erhöhung des Spielerpunktestands bei jedem gefressenen Futter und Speichern des Highscores.
  • Kollisionserkennung der Schlange mit den Rändern des Spielfeldes oder mit sich selbst.
  • Neustart des Spiels nach einer Kollision.
  • Zurücksetzen des Spielerpunktestands bei einem Neustart, während der Highscore erhalten bleibt.

segments = []

#Implementing the gameplay
while True:
    wind.update()
    if snake.xcor() > 290 or snake.xcor() < -290 or snake.ycor() > 290 or snake.ycor() < -290:
        time.sleep(1)
        snake.goto(0, 0)
        snake.direction = "Stop"
        snake.shape("square")
        snake.color("green")

        for segment in segments:
            segment.goto(1000, 1000)
        segments.clear()
        player_score = 0
        delay_time = 0.1
        pen.clear()
        pen.write("Player's_score: {} Highest_score: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

    if snake.distance(snake_food) < 20:
        coord_x = random.randint(-270, 270)
        coord_y = random.randint(-270, 270)
        snake_food.goto(coord_x, coord_y)

        # Adding segment
        added_segment = turtle.Turtle()
        added_segment.speed(0)
        added_segment.shape("square")
        added_segment.color("white")
        added_segment.penup()
        segments.append(added_segment)
        delay_time -= 0.001
        player_score += 5

        if player_score > highest_score:
            highest_score = player_score
            pen.clear()
            pen.write("Player's_score: {} Highest_score: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

    # checking for collisions
    for i in range(len(segments)-1, 0, -1):
        coord_x = segments[i-1].xcor()
        coord_y = segments[i-1].ycor()
        segments[i].goto(coord_x, coord_y)

    if len(segments) > 0:
        coord_x = snake.xcor()
        coord_y = snake.ycor()
        segments[0].goto(coord_x, coord_y)
    move()

    for segment in segments:
        if segment.distance(snake) < 20:
            time.sleep(1)
            snake.goto(0, 0)
            snake.direction = "stop"
            snake.color('white')
            snake.shape('square')

            for segment in segments:
                segment.goto(1000, 1000)
                segment.clear()
                player_score = 0
                delay_time = 0.1
                pen.clear()
                pen.write("Player's_score: {} Highest_score: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

    time.sleep(delay_time)

turtle.mainloop()
    

In diesem Codeausschnitt wird eine zufällige Position für das Futter festgelegt. Jedes Mal, wenn die Schlange das Futter einsammelt, wächst ihr Körper um ein weiteres Segment mit einer anderen Farbe (in diesem Fall weiß). Nach dem Sammeln des Futters wird dieses auf einer neuen zufälligen Position platziert. Die Punktzahl des Spielers wird bei jeder Futteraufnahme um 5 erhöht. Bei einer Kollision wird der Punktestand auf 0 gesetzt, während der Highscore erhalten bleibt.

Wenn Sie die Python-Datei jetzt ausführen, sollten Sie ein funktionierendes Schlangenspiel haben!

Zusammenfassung

Die Verwendung der Turtle-Bibliothek ist eine einfache und unterhaltsame Art, das Schlangenspiel zu erstellen. Alternativ können Sie die gleiche Funktion auch mit der PyGame-Bibliothek implementieren. Ein PyGame-Tutorial finden Sie hier. Sie können das Spiel auf unterschiedliche Art und Weise implementieren.

Zusätzlich können Sie versuchen, ein Zahlenratespiel in Python zu programmieren oder zu lernen, wie Sie JSON-Daten in Python parsen. Viel Spaß beim Programmieren!