Ajouter des objets
L’objectif de cette partie est d’ajouter des objets dans les différents lieux de la map, et de permettre au joueur de les prendre pour les utiliser ultérieurement. Le joueur devra également avoir la possibilité de les déposer dans la pièce où il se trouve.
GitHub stuff
Ouvrir la [REPOSITORY_HOMEPAGE]
et démarrer le codespace associé :
Code Codespaces
A partir du terminal du codespace, récupérer la dernière version du jeu depuis votre dépôt
$ git pull
Utiliser l’extension GitLens
pour examiner l’historique des commits, et en particulier les différences entre la version actuelle et la version précédente.
Construire un item
Pour éviter la confusion entre l’objet en tant qu’instance d’une classe et l’objet manipulé par le joueur, par la suite, nous allons utiliser le terme item
pour désigner ce dernier.
A faire
Créer un fichier item.py
dans le répertoire v4
. Ce fichier contiendra la classe Item
. Cette classe sera utilisée pour représenter les différents objets que le joueur pourra trouver dans les différents lieux de la map. Elle contiendra les attributs suivants :
name
: le nom de l’objetdescription
: la description de l’objetweight
: le poids de l’objet
Redéfinir la méthode __str__()
pour qu’elle retourne une représentation textuelle de l’objet. Un exemple:
>>> from item import Item
>>> sword = Item("sword", "une épée au fil tranchant comme un rasoir", 2)
>>> print(sword)
sword : une épée au fil tranchant comme un rasoir (2 kg)
Ajouter un inventaire au joueur
On est maintenant capable de créer des items. Il faut permettre de les associer au joueur en lui ajoutant un inventaire.
Quelle est la classe concernée par cette modification ?
La structure de données à utiliser pour mettre en oeuvre un inventaire doit elle permettre un ordonnancement ?
La structure de données à utiliser pour mettre en oeuvre un inventaire doit elle permettre d’associer un item à une chaîne de caractères pour le désigner ?
En fonction de la réponse ci dessus, quelle est la structure de données la plus adaptée pour mettre en oeuvre cet inventaire ?
A faire
Modifier la classe identifiée ci dessus pour qu’elle contienne un attribut inventory
de type la structure de donnée choisie. Cette structure de donnée doit être initialisée à vide.
A faire
Ecrire une méthode get_inventory()
pour produire une chaine de caractère représentative de ce que contient l’inventaire du joueur. Cette méthode sera appelée à la demande par le joueur. Un exemple d’exécution est donné ci-dessous:
Vous disposez des items suivants :
- sword : une épée au fil tranchant comme un rasoir (2 kg)
S’il n’y a rien dans l’inventaire:
Votre inventaire est vide.
Astuce
Vous pouvez vous inspirer de la méthode get_history()
écrite précédemment.
Ajouter un inventaire aux lieux
Il faut maintenant permettre d’associer des items aux lieux de la map. La démarche est la même que pour le joueur.
Quelle est la classe concernée par cette modification ?
La structure de données à utiliser pour mettre en oeuvre un inventaire doit elle permettre un ordonnancement ?
La structure de données à utiliser pour mettre en oeuvre un inventaire doit elle permettre d’associer un item à une chaîne de caractères pour le désigner ?
En fonction de la réponse ci dessus, quelle est la structure de données la plus adaptée pour mettre en oeuvre cet inventaire ?
A faire
Modifier la classe identifiée ci dessus pour qu’elle contienne un attribut inventory
de type la structure de donnée choisie. Cette structure de donnée doit être initialisée à vide.
A faire
Ecrire également une méthode get_inventory()
pour produire un affichage de ce que contient la pièce visitée par le joueur. Cette méthode est identique à celle écrite pour le joueur. Un exemple d’exécution est donné ci-dessous:
La pièce contient :
- shield : un bouclier léger et résistant (1 kg)
- helmet : un casque en métal (1 kg)
Si le lieu est vide :
Il n'y a rien ici.
Note
Il y a là une redondance de code puisque la méthode get_inventory()
écrite pour le joueur est identique à celle écrite pour les lieux. Il faudrait donc pouvoir réutiliser cette méthode. Pour cela, il faudrait construire une classe spécifique pour l’inventaire qui serait réutilisée à la fois dans la classe Player
et dans la classe Room
. Ce peut être une amélioration à apporter au jeu.
Observer l’environnement
Il faut maintenant permettre au joueur de voir les items présents dans la pièce où il se trouve. Pour cela, il faut créer une fonction look()
déclenchée par la commande look
. Cette fonction doit afficher la description de la pièce et la liste des items présents dans la pièce.
Quelle est la classe concernée par l’ajout de cette fonction ?
Quels sont les paramètres de cette fonction ?
Quel est l’objet à interroger pour connaitre l’environnement ?
A faire
Modifier la classe identifiée ci dessus pour qu’elle contienne une fonction look()
. Cette méthode doit afficher la liste des items présents dans cette pièce.
A faire
Déclarer la commande look
dans la classe/méthode appropriée. Ajouter quelques items dans les lieux de votre map. Déplacez vous dans la map et vérifier que la commande look
affiche bien la liste des items présents dans la pièce que le joueur visite.
Prendre / reposer un item
Il faut maintenant permettre au joueur de pouvoir prendre un item présent dans la pièce où il se trouve. Pour cela, il faut créer une fonction take()
déclenchée par la commande take
. Cette fonction doit permettre de prendre un item et de le mettre dans l’inventaire du joueur. Et bien sur de le retirer de la liste des items présents dans la pièce.
Quelle est la classe concernée par l’ajout de cette fonction ?
Quels sont les paramètres de cette fonction ?
Quel est l’objet à modifier pour ajouter un item à l’inventaire du joueur ?
Quel est l’objet à modifier pour retirer un item à la liste des items du lieu visité ?
A faire
Modifier la classe identifiée ci dessus pour qu’elle contienne une fonction take()
. Cette méthode doit permettre de prendre un item et de le mettre dans l’inventaire du joueur. Et bien sur de le retirer de la liste des items présents dans la pièce.
A faire
Déclarer la commande take
dans la classe/méthode appropriée. Parcourir la map et vérifier que la commande take
permet bien de prendre les items présents dans la pièce que le joueur visite.
Il faut également permettre de reposer un item dans la pièce où se trouve le joueur. Pour cela, on va créer une fonction drop()
déclenchée par la commande drop
. Cette fonction doit permettre de reposer un item et de le mettre dans la liste des items présents dans la pièce du joueur. Et bien sur de le retirer de l’inventaire du joueur.
Quelle est la classe concernée par l’ajout de cette fonction ?
Quels sont les paramètres de cette fonction ?
Quel est l’objet à modifier pour retirer un item à l’inventaire du joueur ?
Quel est l’objet à modifier pour ajouter un item à la liste des items du lieu visité ?
A faire
Modifier la classe identifiée ci dessus pour qu’elle contienne une fonction drop()
. Cette méthode doit permettre de prendre un item dans l’inventaire du joueur et de le remettre dans le lieu visité. Utiliser la commande look
pour vérifier.
A faire
Déclarer la commande drop
dans la classe/méthode appropriée. Parcourir la map et vérifier que la commande drop
permet bien de reposer les items présents dans l’inventaire du joueur dans la pièce où il se trouve. Utiliser la commande look
pour vérifier.
Vérifier son inventaire
Il faut maintenant permettre au joueur de vérifier ce que contient son inventaire. Pour cela, il faut créer une fonction check()
déclenchée par la commande check
. Cette fonction doit afficher la liste des items contenus dans l’inventaire.
Quelle est la classe concernée par l’ajout de cette fonction ?
Quels sont les paramètres de cette fonction ?
Quel est l’objet à interroger pour connaitre l’environnement ?
A faire
Modifier la classe identifiée ci dessus pour qu’elle contienne une fonction check()
. Cette méthode doit afficher la liste des items présents dans l’inventaire du joueur.
A faire
Déclarer la commande check
dans la classe/méthode appropriée. Parcourir la map en prenant et déposant des items et vérifier que la commande check
reflète bien la liste des items présents dans l’inventaire du joueur.
Vérification
Voilà un exemple d’exécution du jeu lorsque les fonctions précédentes ont été mises en oeuvre :
Vous êtes dans un marécage sombre et ténébreux. L'eau bouillonne, les abords sont vaseux.
Sorties: N, O
> look
On voit:
- sword : une épée au fil tranchant comme un rasoir (2 kg)
> take sword
> look
Il n'y a rien ici.
> check
Vous disposez des items suivants:
- sword : une épée au fil tranchant comme un rasoir (2 kg)
> go n
Vous êtes dans une immense tour en pierre qui s'élève au dessus des nuages.
Sorties: N, S, O
Vous avez déja visité les pièces suivantes:
- un marécage sombre et ténébreux
> look
On voit:
- shield : un bouclier léger et résistant (1 kg)
> check
Vous disposez des items suivants:
- sword : une épée au fil tranchant comme un rasoir (2 kg)
> take shield
> look
Il n'y a rien ici.
> check
Vous disposez des items suivants:
- sword : une épée au fil tranchant comme un rasoir (2 kg)
- shield : un bouclier léger et résistant (1 kg)
> go n
Vous êtes dans un petit chalet pittoresque avec un toit de chaume. Une épaisse fumée verte sort de la cheminée.
Sorties: S, O
Vous avez déja visité les pièces suivantes:
- un marécage sombre et ténébreux
- une immense tour en pierre qui s'élève au dessus des nuages
> look
On voit:
- helmet : un casque en métal (1 kg)
> take helmet
> look
Il n'y a rien ici.
> check
Vous disposez des items suivants:
- sword : une épée au fil tranchant comme un rasoir (2 kg)
- shield : un bouclier léger et résistant (1 kg)
- helmet : un casque en métal (1 kg)
> go o
Vous êtes dans une grotte profonde et sombre. Des voix semblent provenir des profondeurs.
Sorties: E, S
Vous avez déja visité les pièces suivantes:
- un marécage sombre et ténébreux
- une immense tour en pierre qui s'élève au dessus des nuages
- un petit chalet pittoresque avec un toit de chaume
> check
Vous disposez des items suivants:
- sword : une épée au fil tranchant comme un rasoir (2 kg)
- shield : un bouclier léger et résistant (1 kg)
- helmet : un casque en métal (1 kg)
> drop sword
> check
Vous disposez des items suivants:
- shield : un bouclier léger et résistant (1 kg)
- helmet : un casque en métal (1 kg)
> look
On voit:
- sword : une épée au fil tranchant comme un rasoir (2 kg)
> drop shield
> drop helmet
> look
On voit:
- sword : une épée au fil tranchant comme un rasoir (2 kg)
- shield : un bouclier léger et résistant (1 kg)
- helmet : un casque en métal (1 kg)
> check
Votre inventaire est vide.
> drop sword
L'objet 'sword' n'est pas dans l'inventaire'.
> take ammo
L'objet 'ammo' n'est pas dans la pièce.
>
A faire
Les commandes take
et drop
sont muettes en ce sens qu’elles ne valident pas dans la console le succès (ou non) les actions qu’elles réalisent. Modifier le code pour obtenir l’affichage suivant
> take sword
Vous avez pris l'objet 'sword'.
> drop sword
Vous avez déposé l'objet 'sword'.
On peut également envisager d’afficher un message d’erreur si l’objet n’est pas présent (ou est déjà présent) dans la pièce ou dans l’inventaire du joueur.
A faire
Actuellement le joueur peut prendre autant d’objets qu’il le souhaite. Il serait intéressant de limiter le nombre d’objets ou le poids total des objets que le joueur peut transporter. Pour cela, ajouter un attribut max_weight
à la classe Player
qui représente le poids maximum que le joueur peut transporter. Modifier la méthode take()
pour qu’elle vérifie que le joueur peut prendre l’objet en fonction de son poids et de la capacité de son inventaire. Si le joueur ne peut pas prendre l’objet, afficher un message d’erreur.
A faire
Quelques objets particuliers peuvent être intéressants dans le cas d’un jeu de ce type.
Implémenter un objet magique (beamer) qui permet de se téléporter dans une pièce déjà visitée. Son fonctionnement est le suivant :
le joueur peut prendre le beamer quelquepart dans la map ;
le joueur peut charger le beamer dans une pièce de la map pour mémoriser cette pièce ;
le joueur peut utiliser le beamer dans une autre pièce pour se téléporter dans la pièce dans laquelle il a été chargé.
Si le temps vous le permet, vous pouvez également implémenter un ou plusieurs objets parmi la liste suivante (liste non exhaustive) :
une clé qui permet d’ouvrir une porte ;
une torche qui permet d’éclairer une pièce sombre ;
une potion de soin qui permet de récupérer des points de vie ;
un parchemin qui contient une information importante ;
une carte qui permet de se repérer dans la map ;
Attention, certains objets nécessitent de modifier certaines classes :
la clé nécessite de créer une classe
Door
qui contient un attributlocked
;la torche nécessite de modifier la classe
Room
qui y ajouter un attributdark
;la potion de soin nécessite de modifier la classe
Player
pour y ajouter un attributhealth
;etc.
La suite…
A cette étape, votre dépôt doit contenir les seuls fichiers suivants :
actions.py
command.py
game.py
item.py
player.py
room.py
Le jeu doit être fonctionnel et avoir intégré les consignes précédentes. La commande
$ python game.py
doit pouvoir permettre d’activer les fonctions take
, drop
, look
et check
sans erreur.
GitHub stuff
Enregistrer les modifications apportées aux fichiers dans le repo local au codespace
$ git add .
$ git commit -m "Ajouter des objets"
Pour référencer plus facilement cette version dans le futur, créer un tag
$ git tag v4
Synchroniser votre codespace avec votre dépôt GitHub
$ git push
Vérifier que les modifications sont bien présentes dans le dépôt GitHub.