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’objet

  • description : la description de l’objet

  • weight : 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.

  1. Quelle est la classe concernée par cette modification ?

  2. La structure de données à utiliser pour mettre en oeuvre un inventaire doit elle permettre un ordonnancement ?

  3. 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 ?

  4. 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.

  1. Quelle est la classe concernée par cette modification ?

  2. La structure de données à utiliser pour mettre en oeuvre un inventaire doit elle permettre un ordonnancement ?

  3. 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 ?

  4. 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.

  1. Quelle est la classe concernée par l’ajout de cette fonction ?

  2. Quels sont les paramètres de cette fonction ?

  3. 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.

  1. Quelle est la classe concernée par l’ajout de cette fonction ?

  2. Quels sont les paramètres de cette fonction ?

  3. Quel est l’objet à modifier pour ajouter un item à l’inventaire du joueur ?

  4. 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.

  1. Quelle est la classe concernée par l’ajout de cette fonction ?

  2. Quels sont les paramètres de cette fonction ?

  3. Quel est l’objet à modifier pour retirer un item à l’inventaire du joueur ?

  4. 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.

  1. Quelle est la classe concernée par l’ajout de cette fonction ?

  2. Quels sont les paramètres de cette fonction ?

  3. 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 attribut locked ;

  • la torche nécessite de modifier la classe Room qui y ajouter un attribut dark ;

  • la potion de soin nécessite de modifier la classe Player pour y ajouter un attribut health ;

  • 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.