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.
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 :
- On crée une nouvelle tête
- On l’ajoute au début de la liste
- 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 :
- Avoir une fenêtre Pygame
- Déplacer le serpent automatiquement
- Permettre de changer de direction au clavier
- Faire apparaître une nourriture
- Faire grandir le serpent
- Détecter la collision avec les murs
- Détecter la collision avec lui-même
- Afficher un game over
- 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.