Exercice 01 : Hiérarchie de Personnages de Jeu Vidéo
Objectif
Cet exercice a pour but de vous faire pratiquer l'héritage en créant une hiérarchie de classes pour des personnages de jeu vidéo. Vous créerez une classe de base Character et deux classes enfants Warrior et Mage qui en hériteront et la spécialiseront.
Contexte
Dans un jeu, tous les personnages partagent des caractéristiques communes (un nom, des points de vie). Cependant, des classes spécifiques comme les guerriers et les mages ont des compétences et des attributs uniques.
- Character (Parent) :
- Attributs :
name,health(points de vie),level. - Méthodes :
attack(),show_info().
- Attributs :
- Warrior (Enfant) :
- Hérite de
Character. - Attribut supplémentaire :
rage. - Redéfinit
attack()pour utiliser la rage.
- Hérite de
- Mage (Enfant) :
- Hérite de
Character. - Attribut supplémentaire :
mana. - Redéfinit
attack()pour utiliser le mana.
- Hérite de
Énoncé
Partie 1 : La Classe Parente Character
- Créez un nouveau fichier Python nommé
game_characters.py. - Définissez la classe
Character:- Son constructeur
__init__doit prendrenameetlevelcomme arguments. - Il doit initialiser
self.name,self.level, etself.health(initialisez la vie àlevel * 10). - Créez une méthode
attack()qui affiche :f"{self.name} performs a basic attack.". - Créez une méthode
show_info()qui affiche les informations du personnage (nom, niveau, vie).
- Son constructeur
Partie 2 : La Classe Enfant Warrior
- Définissez la classe
Warriorqui hérite deCharacter. - Étendez le constructeur
__init__:- Il doit prendre
nameetlevelen arguments. - Utilisez
super().__init__()pour appeler le constructeur du parent. - Ajoutez un nouvel attribut
self.rage, initialisé à100.
- Il doit prendre
- Redéfinissez la méthode
attack():- Elle doit vérifier si
self.rageest supérieur ou égal à 10. - Si oui, elle affiche
f"{self.name} swings their mighty axe!"et décrémenteself.ragede 10. - Sinon, elle affiche
f"{self.name} is out of rage.".
- Elle doit vérifier si
Partie 3 : La Classe Enfant Mage
- Définissez la classe
Magequi hérite deCharacter. - Étendez le constructeur
__init__:- Il doit prendre
nameetlevelen arguments. - Utilisez
super().__init__(). - Ajoutez un nouvel attribut
self.mana, initialisé à50.
- Il doit prendre
- Redéfinissez la méthode
attack():- Elle doit vérifier si
self.manaest supérieur ou égal à 20. - Si oui, elle affiche
f"{self.name} casts a powerful fireball!"et décrémenteself.manade 20. - Sinon, elle affiche
f"{self.name} is out of mana.".
- Elle doit vérifier si
Partie 4 : Test
- Créez une instance de
Warrioret une instance deMage. - Affichez les informations de chaque personnage.
- Faites-les attaquer plusieurs fois pour voir leurs ressources (rage/mana) diminuer et le message changer lorsqu'ils n'en ont plus assez.
Résultat Attendu
--- Character Info ---
Name: Conan, Level: 5, Health: 50
Name: Gandalf, Level: 6, Health: 60
--- Combat ---
Conan swings their mighty axe!
Gandalf casts a powerful fireball!
Conan swings their mighty axe!
Gandalf casts a powerful fireball!
Gandalf is out of mana.
Cliquez ici pour voir un exemple de code de solution
# game_characters.py
# 1. Classe Parente
class Character:
def __init__(self, name, level):
self.name = name
self.level = level
self.health = level * 10
def attack(self):
print(f"{self.name} performs a basic attack.")
def show_info(self):
print(f"Name: {self.name}, Level: {self.level}, Health: {self.health}")
# 2. Classe Enfant Warrior
class Warrior(Character):
def __init__(self, name, level):
super().__init__(name, level)
self.rage = 100
def attack(self):
if self.rage >= 10:
print(f"{self.name} swings their mighty axe!")
self.rage -= 10
else:
print(f"{self.name} is out of rage.")
# 3. Classe Enfant Mage
class Mage(Character):
def __init__(self, name, level):
super().__init__(name, level)
self.mana = 50
def attack(self):
if self.mana >= 20:
print(f"{self.name} casts a powerful fireball!")
self.mana -= 20
else:
print(f"{self.name} is out of mana.")
# 4. Test
warrior = Warrior("Conan", 5)
mage = Mage("Gandalf", 6)
print("--- Character Info ---")
warrior.show_info()
mage.show_info()
print("\n--- Combat ---")
warrior.attack()
mage.attack()
warrior.attack()
mage.attack()
mage.attack() # Le mage ne devrait plus avoir assez de mana