Comment faire un jeu de serpent en Python



Si l’idée de jouer au jeu du serpent vous séduit, ce qui suit devrait retenir votre attention.

Dans cet exposé, je vais vous guider pas à pas dans la création d’un jeu de serpent simple, conçu pour être accessible même aux personnes débutant avec Python.

Il existe diverses manières de réaliser ce jeu, l’une d’elles impliquant l’utilisation de la bibliothèque PyGame de Python, un outil de choix pour le développement de jeux.

Une autre approche consiste à employer la bibliothèque turtle. Ce module, intégré à Python, met à disposition un canevas virtuel permettant de générer des formes et des images.

Par conséquent, nous allons utiliser la bibliothèque turtle pour donner vie à notre jeu de serpent, une solution idéale pour les débutants et les développeurs Python novices.

En sus de ce module, nous solliciterons également deux autres modules :

  • Le module time – Il nous permettra de suivre le temps écoulé en secondes.
  • Le module random – Il génère des nombres de façon aléatoire au sein de Python.

Pour ce faire, vous aurez besoin d’un éditeur de texte de votre choix, j’utiliserai VSCode. Assurez-vous également d’avoir Python 3 installé sur votre machine, sinon, vous pouvez vous servir du compilateur toptips.fr.

Ça promet d’être amusant !

Fonctionnement du jeu du serpent

L’objectif principal de ce jeu est pour le joueur d’obtenir le meilleur score possible en guidant le serpent pour collecter la nourriture affichée à l’écran.

Le joueur contrôle le serpent via quatre touches directionnelles, qui correspondent aux directions de déplacement du serpent. Une collision du serpent avec un bloc ou avec lui-même entraîne la défaite du joueur.

Voici les étapes à suivre pour la mise en œuvre de ce jeu :

  • Importer les modules préinstallés nécessaires (turtle, time et random).
  • Créer l’interface du jeu à l’aide du module turtle.
  • Configurer les touches pour le déplacement du serpent sur l’écran.
  • Implémenter le déroulement du jeu.

Créez un fichier nommé snakegame.py pour accueillir notre code.

Importation des modules

Cette section du code a pour but d’importer les modules turtle, time et random, intégrés par défaut à Python. De plus, nous allons définir des valeurs initiales pour le score du joueur, le score maximal potentiel et le délai entre les mouvements. Le module time est essentiel pour gérer ce délai.

Ajoutez ce code à votre fichier snakegame.py.

import turtle
import random
import time

player_score = 0
highest_score = 0
delay_time = 0.1

Mise en place de l’interface du jeu

Le module turtle nous permettra de créer un canevas virtuel qui servira d’écran de jeu. C’est sur ce canevas que nous allons créer le corps du serpent et la nourriture à collecter. L’écran affichera également le score actuel du joueur et son score maximal.

Ajoutez ce code à votre fichier Python.

# Création de l'écran de jeu
wind = turtle.Screen()
wind.title("Snake Maze🐍")
wind.bgcolor("red")

# Définition de la taille de l'écran
wind.setup(width=600, height=600)


# Création du serpent
snake = turtle.Turtle()
snake.shape("square")
snake.color("black")
snake.penup()
snake.goto(0, 0)
snake.direction = "Stop"

# Création de la nourriture
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("Votre_score: 0 Meilleur_score : 0", align="center", 
font=("Arial", 24, "normal"))
turtle.mainloop()

Ce bloc de code commence par initialiser l’écran turtle, en lui attribuant un titre et une couleur d’arrière-plan. Après avoir défini les dimensions de notre fenêtre de jeu, nous dessinons la forme du serpent sur le canevas.

La méthode penup() permet de lever le stylo de la tortue, évitant ainsi le tracé d’une ligne lors de ses déplacements. La méthode goto(x,y) déplace la tortue vers des coordonnées spécifiques.

Nous créons ensuite la nourriture que le serpent doit ramasser. Nous allons afficher le score du joueur et son score maximal à chaque collecte de nourriture. Pour cela, nous utilisons la méthode pen.write(). La méthode hideturtle() dissimule l’icône de la tortue dans la zone d’en-tête.

L’ajout de turtle.mainloop() à la fin de votre code est essentiel pour que l’écran reste visible et que l’utilisateur puisse interagir.

En lançant le fichier, vous devriez obtenir le résultat suivant :

Configuration des touches de direction pour le serpent

Ici, nous allons associer des touches spécifiques à la direction du mouvement du serpent. Nous utiliserons ‘L’ pour la gauche, ‘R’ pour la droite, ‘U’ pour le haut, et ‘D’ pour le bas. Ces directions seront gérées via la propriété direction de la tortue, que nous allons activer pour le serpent.

Ajoutez le code suivant.

# Attribution des 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')

La fonction move() définit le déplacement du serpent dans la position définie, avec des valeurs de coordonnées précises.

La fonction listen() est un détecteur d’événements qui appelle les fonctions de déplacement du serpent lorsqu’une touche est pressée.

Implémentation du gameplay du jeu du serpent

Maintenant que nous avons mis en place les bases de notre jeu de serpent, nous allons le rendre interactif en temps réel.

Cela implique les éléments suivants :

  • Augmenter la longueur du serpent à chaque collecte de nourriture, en utilisant une couleur différente.
  • Incrémenter le score du joueur à chaque collecte et suivre le score maximal.
  • Empêcher le serpent d’entrer en collision avec le mur ou avec lui-même.
  • Redémarrer le jeu en cas de collision.
  • Remettre le score du joueur à zéro au redémarrage, tout en conservant le score maximal.

Ajoutez le reste du code à votre fichier python.

segments = []

#Implémentation du déroulement du jeu
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("Score_du_joueur: {} Meilleur_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)

        # Ajout de 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("Score_du_joueur: {} Meilleur_score: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

    # Gestion des 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)
            segments.clear()
            player_score = 0
            delay_time = 0.1
            pen.clear()
            pen.write("Score_du_joueur: {} Meilleur_score: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

    time.sleep(delay_time)

turtle.mainloop()

Dans ce code, nous attribuons une position aléatoire à la nourriture sur l’écran. À chaque collecte de nourriture, le serpent s’allonge d’un segment corporel de couleur blanche, permettant de visualiser sa croissance.

Après une collecte réussie, la nourriture est replacée de manière aléatoire dans une zone définie par une plage de coordonnées de 270. Chaque collecte augmente le score du joueur de 5 points. En cas de collision, le score du joueur est remis à zéro, tandis que l’écran conserve le score maximal enregistré.

Relancez le fichier Python, et votre écran de jeu devrait ressembler à ceci :

Conclusion 🐍

L’utilisation de la bibliothèque turtle offre une méthode simple et ludique pour créer le jeu du serpent, comme nous l’avons démontré. Vous pouvez également explorer une implémentation avec la bibliothèque PyGame. Vous trouverez un tutoriel PyGame ici qui vous montrera comment réaliser le jeu d’une autre manière.

Vous pouvez également vous pencher sur la création d’un jeu de devinettes en Python ou apprendre à manipuler des données JSON. Amusez-vous bien avec le codage !