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 formatstr
), - une
energie
(au formatint
, compris entre0
et500
), - un
inventaire
(au formatlist
).
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 untruc
(de typeChose
),mange
:perso
mange untruc
(de typeChose
),parle
:perso
parle avec une autrepersonne
(de typePersonnage
),donne
:perso
donne untruc
à une autrepersonne
(respectivement de typesChose
etPersonnage
).
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 :
#--- 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