đ 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 :
- Complétez la fonction
afficher_grille(serpent, pomme, largeur, hauteur)pour dessiner le jeu avec des caractĂšres :Opour la tĂȘteopour le corpsXpour la pomme.pour le vide
- Complétez
demander_direction()pour gérer les touchesz, q, s, d. - (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