🐍projets

Creer un jeu Snake en Python avec Pygame

30 mars 2026 5 min de lecture

Introduction : Pourquoi coder Snake en NSI ?

Salut futur développeur ! Si tu es en spécialité NSI, tu sais que la théorie c'est bien, mais la pratique c'est encore mieux. Créer un jeu vidéo classique comme Snake est un projet parfait pour consolider tes compétences en Python. Ce projet te permettra de manipuler :

  • Les structures de données (listes pour le corps du serpent).
  • La programmation orientée objet (une classe pour le serpent, une pour le jeu).
  • La logique algorithmique (gestion des collisions, déplacement).
  • Une bibliothèque graphique (Pygame).

À la fin de cet article, tu auras un jeu fonctionnel que tu pourras même personnaliser. C'est parti !

Mise en place : Installer Pygame et structurer le projet

Avant de coder, il faut préparer ton environnement. Pygame est une bibliothèque externe, il faut donc l'installer.

Installation de Pygame

Ouvre ton terminal ou l'invite de commandes et tape :

pip install pygame

Si tu utilises un environnement virtuel ou un IDE comme PyCharm, assure-toi de l'installer au bon endroit.

Architecture de base du code

Crée un nouveau fichier Python, par exemple snake_game.py. Nous allons structurer notre code avec une approche modulaire. On va créer :

  • Les constantes du jeu (couleurs, taille de la fenêtre, taille des blocs).
  • Une classe Serpent.
  • Une classe Jeu ou une fonction principale qui gère la boucle du jeu.

Cette structure est essentielle pour un code propre et maintenable, une compétence clé en NSI et dans le monde professionnel.

Le cœur du jeu : Coder la classe Serpent

Le serpent est l'élément central. Modélisons-le par une classe. Son état sera défini par une liste de segments (coordonnées x, y).

Voici le squelette de la classe :

class Serpent:
def __init__(self):
self.corps = [(100, 50), (90, 50), (80, 50)] # Liste de tuples (x, y)
self.direction = "DROITE" # Direction initiale
self.couleur = (0, 255, 0) # Vert en RVB

Maintenant, ajoutons les méthodes essentielles :

Méthode pour se déplacer

Le principe est simple : on ajoute une nouvelle "tête" dans la direction actuelle, et on retire la dernière partie de la queue (sauf si le serpent a mangé une pomme).

def avancer(self):
tete_x, tete_y = self.corps[0]
if self.direction == "DROITE":
nouvelle_tete = (tete_x + 10, tete_y)
elif self.direction == "GAUCHE":
nouvelle_tete = (tete_x - 10, tete_y)
elif self.direction == "HAUT":
nouvelle_tete = (tete_x, tete_y - 10)
elif self.direction == "BAS":
nouvelle_tete = (tete_x, tete_y + 10)
self.corps.insert(0, nouvelle_tete) # Ajoute la nouvelle tête
self.corps.pop() # Retire l'ancienne queue

Méthode pour changer de direction

Il faut empêcher le serpent de faire demi-tour sur lui-même (ex: aller à droite alors qu'il va à gauche).

def changer_direction(self, nouvelle_direction):
opposées = {"HAUT": "BAS", "BAS": "HAUT", "GAUCHE": "DROITE", "DROITE": "GAUCHE"}
if nouvelle_direction != opposées.get(self.direction):
self.direction = nouvelle_direction

Méthode pour grandir

Quand le serpent mange, on ne retire pas le dernier segment lors du prochain avancer(). On peut simplement ajouter un flag ou gérer cela dans la boucle principale.

Gestion du jeu : Boucle principale, nourriture et collisions

Maintenant, créons la logique qui fait tourner le jeu. On va initialiser Pygame, gérer les événements (touches du clavier), faire apparaître la nourriture aléatoirement et détecter les collisions.

Initialisation et boucle principale

import pygame
import random

# Initialisation et constantes
pygame.init()
TAILLE_FENETRE = 600
TAILLE_BLOC = 10
ecran = pygame.display.set_mode((TAILLE_FENETRE, TAILLE_FENETRE))
clock = pygame.time.Clock()

serpent = Serpent()
nourriture = (random.randrange(0, TAILLE_FENETRE, TAILLE_BLOC),
random.randrange(0, TAILLE_FENETRE, TAILLE_BLOC))

en_jeu = True
while en_jeu:
for event in pygame.event.get():
if event.type == pygame.QUIT:
en_jeu = False
# Gestion des touches pour changer la direction du serpent
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
serpent.changer_direction("DROITE")
elif event.key == pygame.K_LEFT:
serpent.changer_direction("GAUCHE")
# ... Gérer HAUT et BAS

# Logique du jeu
serpent.avancer()
# Vérifier si le serpent mange la nourriture
if serpent.corps[0] == nourriture:
# Faire grandir le serpent et repositionner la nourriture
nourriture = (random.randrange(0, TAILLE_FENETRE, TAILLE_BLOC),
random.randrange(0, TAILLE_FENETRE, TAILLE_BLOC))
# On ajoute un segment en ne le retirant pas au prochain avancer()

# Vérifier les collisions (murs ou avec soi-même)
tete_x, tete_y = serpent.corps[0]
if (tete_x < 0 or tete_x >= TAILLE_FENETRE or
tete_y < 0 or tete_y >= TAILLE_FENETRE or
serpent.corps[0] in serpent.corps[1:]):
en_jeu = False # Game Over

# Affichage
ecran.fill((0, 0, 0)) Fond noir
for segment in serpent.corps:
pygame.draw.rect(ecran, serpent.couleur, (segment[0], segment[1], TAILLE_BLOC, TAILLE_BLOC))
pygame.draw.rect(ecran, (255, 0, 0), (nourriture[0], nourriture[1], TAILLE_BLOC, TAILLE_BLOC))
pygame.display.update()
clock.tick(15) # Vitesse du jeu (images par seconde)

pygame.quit()

Améliorations et idées pour ton projet NSI

Félicitations, tu as une version basique de Snake ! Pour en faire un vrai projet NSI et impressionner ton professeur, voici des idées d'améliorations :

  • Ajouter un score : Incrémente un compteur à chaque pomme mangée et affiche-le à l'écran avec pygame.font.
  • Écran de démarrage et Game Over : Affiche des messages, propose de rejouer.
  • Augmenter la difficulté : Accélère progressivement le jeu (clock.tick(15 + score//5)).
  • Barrières ou obstacles : Ajoute des murs immobiles que le serpent doit éviter.
  • Personnalisation graphique : Remplace les carrés par des sprites, ajoute des sons avec pygame.mixer.
  • Mode deux joueurs : Un défi ambitieux ! Deux serpents contrôlés avec des touches différentes.

Ces ajouts te permettront de montrer que tu maîtrises non seulement la syntaxe Python, mais aussi la conception et l'optimisation d'un logiciel.

Conclusion et ressources

Tu viens de créer ton premier jeu vidéo en Python ! Ce projet Snake est une excellente synthèse des concepts vus en NSI : algorithmes, structures de données, gestion d'événements et programmation orientée objet. N'hésite pas à partager ton code avec tes camarades, à le commenter proprement et à expérimenter. La clé pour progresser est de pratiquer et de décortiquer le code des autres.

Pour aller plus loin, consulte la documentation officielle de Pygame. Bonne continuation dans ton apprentissage de la programmation !

📚 Pour aller plus loin

Questions fréquentes

Pourquoi utiliser Pygame et pas Turtle ou Tkinter pour ce projet ?

Pygame est plus adapté pour créer des jeux avec une boucle principale fluide, une gestion précise des événements et des rafraîchissements d'écran. Turtle est excellent pour débuter en graphisme, mais moins performant pour les jeux. Tkinter est fait pour des interfaces graphiques classiques. Pygame te donne une expérience plus proche du développement de jeu 'réel'.

Mon serpent peut traverser les murs, comment régler ce bug ?

C'est normal dans la version de base ! Pour ajouter des murs, il faut modifier la condition de collision. Remplace la vérification simple (si la tête sort de l'écran) par une vérification contre une liste de coordonnées de murs que tu auras définie. Tu peux aussi choisir de faire réapparaître le serpent de l'autre côté de l'écran (mode 'wrap-around') en recalculant sa position avec un modulo.

Comment faire pour que le serpent grandisse correctement quand il mange ?

Dans la boucle principale, quand tu détectes que la tête du serpent est sur la nourriture, ne retire PAS le dernier segment de son corps au prochain appel de `serpent.avancer()`. Une méthode simple est d'ajouter un attribut `a_mange = False` à la classe Serpent, le passer à `True` quand il mange, et dans `avancer()`, ne faire `self.corps.pop()` que si `a_mange` est `False`. N'oublie pas de le remettre à `False` après.

Le jeu est trop lent ou trop rapide sur mon ordinateur, comment l'ajuster ?

La vitesse est contrôlée par `clock.tick(FPS)` où FPS est le nombre d'images par seconde. La valeur 15 donne un rythme classique. Augmente cette valeur (ex: 25) pour un jeu plus rapide, ou diminue-la (ex: 10) pour un jeu plus lent. Tu peux aussi lier cette valeur au score pour augmenter la difficulté progressivement.

Bravo ! Tu as lu cet article
Inscris-toi pour sauvegarder ta progression et gagner des XP
Creer mon compte
Snake PythonPygame projet
Pixel