Skip to content

📝 Mini-projet : Snake et Listes en Python

🎯 Objectif

Nous allons programmer le célÚbre jeu Snake en Python.

Le but est de guider un serpent pour qu'il mange des pommes. À chaque pomme mangĂ©e, le serpent grandit. Si le serpent touche un mur ou sa propre queue, la partie est perdue.

Ce projet a pour but principal de vous faire manipuler les listes en Python, car le corps du serpent est représenté par une liste de coordonnées.

Dans ce TP, vous compléterez les fonctions manquantes dans le fichier logique.py, tandis que l'interface graphique est déjà fournie dans main.py.

Organisation des fichiers 📂

Pour que votre projet fonctionne correctement, vous devez placer tous les fichiers dans un mĂȘme rĂ©pertoire (dossier).

Les fichiers nécessaires sont :

  • logique.py : contient les fonctions que vous devez complĂ©ter.
  • main.py : l'interface graphique (ne pas modifier).
  • requirements.txt : les bibliothĂšques nĂ©cessaires.
  • console.py : contient les fonctions que vous devez complĂ©ter.

👉 Arborescence attendue :

mon_projet_snake/
│
├── logique.py
├── main.py
└── requirements.txt

1. Représentation du Serpent

Le serpent est une liste de tuples. Chaque tuple (x, y) reprĂ©sente une case de la grille. - Le premier Ă©lĂ©ment de la liste (index 0) est la tĂȘte du serpent. - Le dernier Ă©lĂ©ment est le bout de la queue.

Exemple:
serpent = [
    (10, 10),  # TĂȘte
    (10, 11),  # Corps
    (10, 12)   # Queue
]

👉 À vous d’écrire la fonction :

def creer_serpent()->list:
    """
    Crée la liste initiale représentant le serpent.
    Retour: list, une liste de tuples (x, y)
    """

2. Calculer la nouvelle tĂȘte

Quand le serpent avance, on doit calculer la position de sa nouvelle tĂȘte en fonction de la direction. La direction est donnĂ©e par un tuple (dx, dy).

Exemple:

Si la tĂȘte est en (10, 10) et la direction est (0, -1) (haut) : La nouvelle tĂȘte sera (10 + 0, 10 - 1) = (10, 9).

👉 ComplĂ©tez la fonction :

def calculer_nouvelle_tete(serpent:list, direction:tuple)->tuple:
    """
    Calcule la position de la nouvelle tĂȘte du serpent.

    ParamĂštres: serpent, la liste du serpent
                direction, le tuple (dx, dy)
    Retour:     tuple, la nouvelle position (x, y)
    """

3. Faire avancer le serpent (Insertion)

Pour faire avancer le serpent, on ajoute la nouvelle tĂȘte au dĂ©but de la liste. Quelle mĂ©thode de liste permet d'ajouter un Ă©lĂ©ment Ă  une position prĂ©cise (ici l'index 0) ?

👉 ComplĂ©tez la fonction :

def inserer_tete(serpent:list, nouvelle_tete:tuple)->None:
    """
    InsĂšre la nouvelle tĂȘte au dĂ©but de la liste du serpent.
    La modification se fait en place (pas de retour).
    """

4. Gérer la queue (Suppression)

Si le serpent ne mange pas de pomme, il doit garder la mĂȘme taille. Comme on a ajoutĂ© une tĂȘte, il faut supprimer le dernier Ă©lĂ©ment de la queue.

👉 ComplĂ©tez la fonction :

def supprimer_queue(serpent:list)->None:
    """
    Supprime le dernier élément de la liste du serpent.
    La modification se fait en place.
    """

5. VĂ©rifier les collisions đŸ’„

Le jeu s'arrĂȘte si : 1. La tĂȘte sort de la grille (coordonnĂ©es < 0 ou >= taille). 2. La tĂȘte touche une autre partie du corps du serpent.

👉 ComplĂ©tez la fonction :

def verifier_collision(serpent:list, largeur_grille:int, hauteur_grille:int)->bool:
    """
    VĂ©rifie si la tĂȘte du serpent (serpent[0]) est en collision.
    Retour: True si collision, False sinon.
    """

6. Lancer le jeu 🎼

Une fois vos fonctions complétées, lancez le fichier main.py pour tester votre jeu !

python main.py

Si tout fonctionne, vous verrez votre serpent bouger et la liste se mettre à jour en temps réel sur le cÎté de l'écran.

👉 Question : Observez la liste affichĂ©e Ă  droite pendant que vous jouez. Que se passe-t-il dans la liste quand vous mangez une pomme ?

7. Bonus : Interface Console / Texte 📟

Pour bien comprendre que la logique du jeu (les listes) est indépendante de l'interface graphique, nous allons créer un affichage simple dans la console.

Ouvrez le fichier console.py. Vous y trouverez une structure de jeu alternative qui utilise les mĂȘmes fonctions de logique.py !

👉 Votre mission :

  1. Complétez la fonction afficher_grille(serpent, pomme, largeur, hauteur) pour dessiner le jeu avec des caractÚres :
    • O pour la tĂȘte
    • o pour le corps
    • X pour la pomme
    • . pour le vide
  2. Complétez demander_direction() pour gérer les touches z, q, s, d.
  3. (Optionnel) Intégrez la gestion de la collision et de la pomme (copiez la logique du main.py).

Lancez le jeu avec :

python console.py

Accueil