Aller au contenu

programmeur.saisit(code)⚓︎

On travaille dans cet exercice sur deux classes :

  • la classe Chose permet de décrire une chose (objet, élément du décor...) dans le jeu.
  • la classe Personnage permet de représenter un personnage d'un jeu vidéo,

Une Chose est caractérisée par un unique attribut, son genre de type str. Ce genre doit impérativement appartenir à la liste ["livre", "pioche", "pierre", "gateau", "diamant"].

classDiagram
class Chose{
       genre : str
}

Un Personnage est caractérisé par des attributs :

  • un nom(au format str),
  • une energie (au format int, compris entre 0 et 500),
  • un inventaire (au format list).

Lors de la création d'un objet type Personnage on passe en arguments son nom puis son énergie : bruce = Personnage('Batman', 450). L'inventaire est créé automatiquement et vide au début.

Il est possible d'appliquer des méthodes à un Personnage. Si perso est un objet de la classe Personnage :

  • prend : perso prend un truc (de type Chose),
  • mange : perso mange un truc (de type Chose),
  • parle : perso parle avec une autre personne (de type Personnage),
  • donne : perso donne un truc à une autre personne (respectivement de types Chose et Personnage).

Remarque

La documentation officielle de Python utilise un vocabulaire différent : les attributs et les méthodes d'un objet sont tous dénommés attributs. La documentation distingue alors attributs données et méthodes.

Toutes ces méthodes renvoient des chaînes de caractères décrivant le résultat de l'action.

Certaines actions sont impossibles. Par exemple perso ne peut pas manger un truc du genre "diamant".

classDiagram
class Personnage{
       nom : str
       energie : int
       inventaire : list
       prend(truc : Chose) str
       mange(truc : Chose) str
       parle(personne : Personnage) str
       donne(truc : Chose, personne : Personnage) str
}

Remarque

Dans le diagramme précédent le texte prend(truc : Chose) : str signifie que la classe Personnage possède une méthode prend prenant un argument nommé truc de type Chose et qui renvoie une chaîne de caractère (str).

Syntaxe

Il est possible de créer une Chose en saisissant l'instruction truc = Chose("pierre").

De plus, si untel et unetelle sont des objets de type Personnage et truc un objet de type Chose, il est par exemple possible :

  • d'accéder à la valeur d'un attribut en saisissant inv = untel.inventaire,

  • de modifier la valeur d'un attribut en saisissant unetelle.energie = 125,

  • d'utiliser une méthode en saisissant untel.donne(truc, unetelle).

Compléter le code ci-dessous avec les instructions valides :

###
# Tests supplémentairesbksl-nlassert helaine.energie == 200, "Erreur avec l'attribut 'nrj'"bksl-nlassert diamant in helaine.inventaire, "Erreur avec l'attribut 'inventaire'"bksl-nlbksl-nl 5/5

#--- HDR ---#bksl-nlGENRESpy-undOBJETS = {bksl-nl "livre": {"utilisable", "peut être pris"},bksl-nl "pioche": {"utilisable", "peut être pris"},bksl-nl "pierre": {"cassable", "utilisable"},bksl-nl "gateau": {"comestible", "peut être pris"},bksl-nl "diamant": {"peut être pris"},bksl-nl}bksl-nlbksl-nlbksl-nlclass Personnage:bksl-nl def py-undpy-undinitpy-undpy-und(self, nom, energie):bksl-nl self.py-undnom = nombksl-nl self.py-undenergie = energiebksl-nl self.py-undinventaire = []bksl-nlbksl-nl @propertybksl-nl def nom(self):bksl-nl return self.py-undnombksl-nlbksl-nl @propertybksl-nl def energie(self):bksl-nl return self.py-undenergiebksl-nlbksl-nl @energie.setterbksl-nl def energie(self, valeur):bksl-nl if not 0 <= valeur <= 500:bksl-nl return "L'énergie est toujours comprise entre 0 et 500"bksl-nl self.py-undenergie = valeurbksl-nlbksl-nl @propertybksl-nl def inventaire(self):bksl-nl return self.py-undinventairebksl-nlbksl-nl def prend(self, truc):bksl-nl if not isinstance(truc, Chose):bksl-nl return f"{self.py-undnom} ne peut pas prendre un(e) {truc}"bksl-nl if not ("peut être pris" in GENRESpy-undOBJETS[truc.genre]):bksl-nl return f"{self.py-undnom} ne peut pas prendre un(e) {truc}"bksl-nl if (truc in self.inventaire):bksl-nl return f"{truc} est déjà dans l'inventaire"bksl-nl self.py-undinventaire.append(truc)bksl-nl return f"{self.nom} prend un(e) {truc}"bksl-nlbksl-nl def mange(self, truc):bksl-nl if truc not in self.py-undinventaire:bksl-nl return f"{truc} n'est pas dans l'inventaire"bksl-nl if not ("comestible" in GENRESpy-undOBJETS[truc.genre]):bksl-nl return f"{self.py-undnom} ne peut pas manger {truc} !"bksl-nl self.py-undinventaire.remove(truc)bksl-nl return f"{self.nom} mange un(e) {self.truc}"bksl-nlbksl-nl def parle(self, personne):bksl-nl if not isinstance(personne, Personnage):bksl-nl return f"{self.py-undnom} ne peut pas parler à {personne}"bksl-nl return f"{self.py-undnom} et {personne.nom} discutent"bksl-nlbksl-nl def donne(self, truc, personne):bksl-nl if not isinstance(personne, Personnage):bksl-nl return f"{self.py-undnom} ne peut pas donner {truc} à {personne}"bksl-nl if not isinstance(truc, Chose):bksl-nl return f"{self.py-undnom} ne peut pas donner {truc} à {personne}"bksl-nl if not ("peut être pris" in GENRESpy-undOBJETS[truc.genre]):bksl-nl return f"{self.py-undnom} ne peut pas donner un(e) {truc}"bksl-nlbksl-nl self.py-undinventaire.remove(truc)bksl-nl personne.py-undinventaire.append(truc)bksl-nl return f"{self.nom} donne un(e) {truc} à {personne}"bksl-nlbksl-nl def py-undpy-undstrpy-undpy-und(self):bksl-nl return f"{self.py-undnom} ({self.py-undenergie}, {list(self.py-undinventaire)})"bksl-nlbksl-nl def py-undpy-undreprpy-undpy-und(self):bksl-nl return self.py-undpy-undstrpy-undpy-und()bksl-nlbksl-nlbksl-nlclass Chose:bksl-nl def py-undpy-undinitpy-undpy-und(self, genre):bksl-nl if not (genre.lower() in GENRESpy-undOBJETS):bksl-nl return f"Le genre doit être dans {', '.join([g for g in GENRESpy-undOBJETS])}"bksl-nl self.py-undgenre = genre.lower()bksl-nlbksl-nl @propertybksl-nl def genre(self):bksl-nl return self.py-undgenrebksl-nlbksl-nl def py-undpy-undstrpy-undpy-und(self):bksl-nl return f"Un(e) {self.py-undgenre}"bksl-nlbksl-nl def py-undpy-undreprpy-undpy-und(self):bksl-nl return self.py-undpy-undstrpy-undpy-und()bksl-nlbksl-nlbksl-nl#--- HDR ---#bksl-nlbksl-nlbksl-nl# Créez un personnage nommé "Guybrush" qui a 100 d'énergiebksl-nl# Ce Personnage doit être affecté à la variable guybksl-nl... = ...bksl-nlassert str(guy) == "Guybrush (100, [])", "Erreur avec la méthode 'py-undpy-undinitpy-undpy-und'"bksl-nlbksl-nl# Créez un personnage nommé "Helaine" qui a 200 d'énergiebksl-nl# Ce Personnage doit être affecté à la variable helainebksl-nl...bksl-nlassert str(helaine) == "Helaine (200, [])", "Erreur avec la méthode 'py-undpy-undinitpy-undpy-und'"bksl-nlbksl-nl# Faites parler Guybrush et Helainebksl-nlresultat = ...bksl-nlassert resultat == "Guybrush et Helaine discutent", "Erreur avec la méthode 'parle'"bksl-nlbksl-nl# Faites parler Helaine et Guybrushbksl-nlresultat = ...bksl-nlassert resultat == "Helaine et Guybrush discutent", "Erreur avec la méthode 'parle'"bksl-nlbksl-nl# Affectez l'énergie de Guybrush à la variable 'nrj'bksl-nl...bksl-nlassert nrj == 100, "Erreur avec l'attribut 'nrj'"bksl-nlbksl-nl# Faites en sorte que Guybrush ait 199 d'énergiebksl-nl...bksl-nlassert guy.energie == 199, "Erreur avec l'attribut 'nrj'"bksl-nlbksl-nl# Créez une chose du genre diamantbksl-nl# Affectez le à la variable diamantbksl-nl...bksl-nlassert diamant.genre == "diamant", "Erreur avec l'attribut 'genre'"bksl-nlbksl-nl# Faites en sorte que Guybrush prenne le diamantbksl-nl...bksl-nlassert (diamant in guy.inventaire) == True, "Erreur avec la méthode 'prend'"bksl-nlbksl-nl# Faites en sorte que Guybrush donne le diamant à Helainebksl-nl...bksl-nl# Vérifiez à l'aide de deux assertions que :bksl-nl# - Guybrush ne possède plus le diamantbksl-nl# - Helaine possède le diamantbksl-nl...bksl-nl...bksl-nl# Créez un personnage nommé "Guybrush" qui a 100 d'énergiebksl-nl# Ce Personnage doit être affecté à la variable guybksl-nlguy = Personnage("Guybrush", 100)bksl-nlassert str(guy) == "Guybrush (100, [])"bksl-nlbksl-nl# Créez un personnage nommé "Helaine" qui a 200 d'énergiebksl-nl# Ce Personnage doit être affecté à la variable helainebksl-nlhelaine = Personnage("Helaine", 200)bksl-nlassert str(helaine) == "Helaine (200, [])"bksl-nlbksl-nl# Faites parler Guybrush et Helainebksl-nlresultat = guy.parle(helaine)bksl-nlprint(resultat)bksl-nlassert resultat == "Guybrush et Helaine discutent"bksl-nlbksl-nl# Faites parler Helaine et Guybrushbksl-nlresultat = helaine.parle(guy)bksl-nlassert resultat == "Helaine et Guybrush discutent"bksl-nlbksl-nl# Affectez l'énergie de Guybrush à la variable 'nrj'bksl-nlnrj = guy.energiebksl-nlassert nrj == 100bksl-nlbksl-nl# Faites en sorte que Guybrush ait 199 d'énergiebksl-nlguy.energie = 199bksl-nlassert guy.energie == 199bksl-nlbksl-nl# Créez une chose du genre diamantbksl-nl# Affectez le à la variable diamantbksl-nldiamant = Chose("diamant")bksl-nlassert diamant.genre == "diamant"bksl-nlbksl-nl# Faites en sorte que Guybrush prenne le diamantbksl-nlguy.prend(diamant)bksl-nlassert (diamant in guy.inventaire) == Truebksl-nlbksl-nl# Faites en sorte que Guybrush donne le diamant à Helainebksl-nlguy.donne(diamant, helaine)bksl-nl# Vérifiez à l'aide de deux assertions que :bksl-nl# - Guybrush ne possède plus le diamantbksl-nl# - Helaine possède le diamantbksl-nlassert (diamant in guy.inventaire) == Falsebksl-nlassert (diamant in helaine.inventaire) == Truebksl-nlbksl-nl

A

On notera que pour nommer les méthodes, l'usage est d'utiliser des verbes conjugués à l'impératif : guy.donne(truc) et non guy.donner(truc).

Z