Aller au contenu

Snake en Pygame

Codez un Snake complet en Pygame pour mettre en pratique déplacements, collisions, listes et logique de jeu.

Dans ce mini-projet, on va coder un jeu Snake complet en Pygame, en réutilisant tout ce qu’on a vu jusqu’ici :

  • affichage
  • boucle de jeu
  • clavier
  • rectangles
  • collisions
  • états simples
  • listes

Si vous bloquez, c’est normal. Snake est simple à jouer, mais très formateur à coder.

pygame snake
Snake en Pygame

Règles du jeu

  • Le serpent se déplace automatiquement
  • Le joueur change la direction avec les flèches
  • Le serpent mange de la nourriture
  • À chaque nourriture mangée, il grandit
  • Si le serpent touche un mur ou lui-même : game over

Représenter le serpent

Un serpent, c’est simplement :

  • une liste de rectangles
  • chaque rectangle représente un segment du corps

Par exemple :

snake = [
    pygame.Rect(400, 300, 20, 20),
    pygame.Rect(380, 300, 20, 20),
    pygame.Rect(360, 300, 20, 20),
]

Le premier élément de la liste est la tête.


Direction du serpent

On va stocker la direction sous forme de vecteur :

direction = (1, 0)  # vers la droite

Exemples :

  • (1, 0) → droite
  • (-1, 0) → gauche
  • (0, -1) → haut
  • (0, 1) → bas

Quand on appuie sur une touche, on change la direction.

Interdiction de faire demi-tour directement (sinon le serpent se mord).


Déplacement du serpent

À chaque “tick” du jeu :

  1. On crée une nouvelle tête
  2. On l’ajoute au début de la liste
  3. On supprime la dernière case (sauf si on mange)

Exemple :

new_head = snake[0].copy()
new_head.x += direction[0] * 20
new_head.y += direction[1] * 20

snake.insert(0, new_head)
snake.pop()

La nourriture

La nourriture est un simple rectangle :

food = pygame.Rect(200, 200, 20, 20)

Quand la tête touche la nourriture :

  • on ne supprime pas la queue
  • le serpent grandit
  • on replace la nourriture ailleurs

Collisions importantes

Vous devez gérer trois types de collisions :

1. Mur

if head.x < 0 or head.x >= 800 or head.y < 0 or head.y >= 600:
    game_over = True

Ou alors ayez du bon goût et faites en sorte que quand on arrive au bord de l'écran on se téléporte de l'autre côté.

2. Nourriture

if head.colliderect(food):
    grow = True

3. Avec soi-même

for segment in snake[1:]:
    if head.colliderect(segment):
        game_over = True

Quand vous générez le nouvel emplacement de la nourriture, vérifiez bien qu'elle ne se trouve pas déjà en contact avec le serpent.


Structure minimale du jeu

Voici la structure générale attendue (sans tous les détails) :

state = "playing"

while running:
    if state == "playing":
        # gérer clavier
        # déplacer le serpent
        # tester collisions
    elif state == "game_over":
        # afficher écran de fin
        # attendre redémarrage

Objectif du projet

Votre jeu Snake doit :

  1. Avoir une fenêtre Pygame
  2. Déplacer le serpent automatiquement
  3. Permettre de changer de direction au clavier
  4. Faire apparaître une nourriture
  5. Faire grandir le serpent
  6. Détecter la collision avec les murs
  7. Détecter la collision avec lui-même
  8. Afficher un game over
  9. Permettre de rejouer

Contraintes techniques

  • Le serpent avance à vitesse constante
  • La taille d’une case est la même partout (par exemple 20x20)
  • Le serpent ne peut pas faire demi-tour directement
  • Le code doit utiliser :

  • des listes

  • des pygame.Rect
  • une boucle de jeu propre

Aide (si vous êtes bloqué)

  • Commencez par un serpent de longueur 1
  • Faites-le avancer sans clavier
  • Ajoutez ensuite le changement de direction
  • Puis la nourriture
  • Puis la croissance
  • Puis les collisions
  • Puis le game over

Ne cherchez pas à tout coder d’un coup.



En résumé

Avec ce mini-projet, vous avez appris à :

  • Gérer un jeu complet de A à Z
  • Utiliser des listes pour représenter des objets complexes
  • Implémenter un gameplay classique
  • Décomposer un problème en sous-problèmes
  • Debugger un vrai jeu

Si vous avez réussi Snake, vous êtes largement prêts pour la suite.

Dans la partie intermédiaire, on va maintenant apprendre à écrire des jeux plus propres, plus grands, et plus stylés.