26 KiB
26 KiB
In [ ]:
class Pokemon:
def __init__(self, nom, type_pokemon, niveau=1, pv_max=100, attaque=10):
"""
Constructeur de la classe Pokemon.
:param nom: (str) Nom du Pokémon
:param type_pokemon: (str) Type élémentaire
:param niveau: (int) Niveau du Pokémon
:param pv_max: (int) Points de vie maximum
:param attaque: (int) Puissance d'attaque
"""
# À compléter (exercice 1)
pass
def __repr__(self):
"""Représentation textuelle du Pokémon."""
# À compléter (exercice 1)
pass
def est_ko(self):
"""
Vérifie si le Pokémon est KO.
:return: (bool) True si PV <= 0, False sinon
"""
# À compléter (exercice 2)
pass
def subir_degats(self, degats):
"""
Inflige des dégâts au Pokémon.
Les PV ne peuvent pas descendre en dessous de 0.
:param degats: (int) Nombre de dégâts subis
"""
# À compléter (exercice 2)
pass
def attaquer(self, cible):
"""
Attaque un autre Pokémon.
Affiche un message et inflige des dégâts à la cible.
:param cible: (Pokemon) Pokémon ciblé par l'attaque
"""
# À compléter (exercice 2, puis exercice 3 en bonus)
pass
def soigner(self, soin):
"""
Soigne le Pokémon.
Les PV ne peuvent pas dépasser pv_max.
:param soin: (int) Nombre de PV récupérés
"""
# À compléter (exercice 2)
passIn [ ]:
pikachu = Pokemon("Pikachu", "Electrik", niveau=25, pv_max=80, attaque=15)
assert pikachu.nom == "Pikachu", "L'attribut nom est incorrect"
assert pikachu.type_pokemon == "Electrik", "L'attribut type_pokemon est incorrect"
assert pikachu.niveau == 25, "L'attribut niveau est incorrect"
assert pikachu.pv_max == 80, "L'attribut pv_max est incorrect"
assert pikachu.pv == 80, "Les PV doivent être initialisés à pv_max"
assert pikachu.attaque == 15, "L'attribut attaque est incorrect"
assert repr(pikachu) == "Pikachu (Electrik) - Nv.25 - 80/80 PV", "__repr__ ne renvoie pas le bon texte"
magicarpe = Pokemon("Magicarpe", "Eau")
assert magicarpe.niveau == 1 and magicarpe.pv_max == 100 and magicarpe.pv == 100 and magicarpe.attaque == 10, \
"Les valeurs par défaut sont incorrectes"
print(pikachu)
print("Exercice 1 : tous les tests sont passés.")In [ ]:
pikachu = Pokemon("Pikachu", "Electrik", niveau=25, pv_max=80, attaque=15)
salameche = Pokemon("Salamèche", "Feu", niveau=20, pv_max=70, attaque=12)
pikachu.attaquer(salameche)
print(salameche)
assert salameche.pv == 55, "attaquer doit retirer attaque PV à la cible"
assert pikachu.pv == 80, "attaquer ne doit pas modifier les PV de l'attaquant"
assert salameche.est_ko() is False, "est_ko doit renvoyer False quand il reste des PV"
salameche.subir_degats(100)
assert salameche.pv == 0, "Les PV ne doivent pas descendre en dessous de 0"
assert salameche.est_ko() is True, "est_ko doit renvoyer True quand les PV sont à 0"
salameche.soigner(30)
assert salameche.pv == 30, "soigner doit ajouter les PV indiqués"
salameche.soigner(100)
assert salameche.pv == 70, "Les PV ne doivent pas dépasser pv_max"
print("Exercice 2 : tous les tests sont passés.")In [ ]:
# Dictionnaire des faiblesses : type_attaquant -> liste des types faibles
FAIBLESSES = {
"Eau": ["Feu"],
"Feu": ["Plante"],
"Plante": ["Eau"],
"Electrik": ["Eau"]
}In [ ]:
carapuce = Pokemon("Carapuce", "Eau", niveau=15, pv_max=75, attaque=10)
salameche = Pokemon("Salamèche", "Feu", niveau=15, pv_max=70, attaque=12)
carapuce.attaquer(salameche)
assert salameche.pv == 50, "Eau contre Feu : les dégâts doivent être doublés"
salameche.attaquer(carapuce)
assert carapuce.pv == 63, "Feu contre Eau : les dégâts ne doivent pas être doublés"
print("Exercice 3 : tous les tests sont passés.")In [ ]:
class Dresseur:
def __init__(self, nom):
"""
Constructeur de la classe Dresseur.
:param nom: (str) Nom du dresseur
"""
# À compléter
pass
def ajouter_pokemon(self, pokemon):
"""
Ajoute un Pokémon à l'équipe si possible (max 6).
:param pokemon: (Pokemon) Pokémon à ajouter
:return: (bool) True si ajouté, False sinon
"""
# À compléter
pass
def pokemon_disponibles(self):
"""
Renvoie la liste des Pokémon non KO.
:return: (list) Liste des Pokémon encore en état de combattre
"""
# À compléter
pass
def premier_pokemon_dispo(self):
"""
Renvoie le premier Pokémon non KO.
:return: (Pokemon/None) Premier Pokémon dispo ou None
"""
# À compléter
pass
def tous_ko(self):
"""
Vérifie si tous les Pokémon sont KO.
:return: (bool) True si tous KO, False sinon
"""
# À compléter
pass
def __repr__(self):
"""Représentation du dresseur."""
# À compléter
passIn [ ]:
sacha = Dresseur("Sacha")
assert sacha.nom == "Sacha" and sacha.equipe == [], "Un dresseur commence avec une équipe vide"
assert sacha.ajouter_pokemon(Pokemon("Pikachu", "Electrik", 25, 80, 15)) is True
assert sacha.ajouter_pokemon(Pokemon("Dracaufeu", "Feu", 50, 150, 25)) is True
assert repr(sacha) == "Dresseur Sacha - 2 Pokémon\n - Pikachu (Electrik) - Nv.25 - 80/80 PV\n - Dracaufeu (Feu) - Nv.50 - 150/150 PV", \
"__repr__ ne renvoie pas le bon texte"
print(sacha)
assert sacha.tous_ko() is False
sacha.equipe[0].subir_degats(100)
assert sacha.premier_pokemon_dispo().nom == "Dracaufeu", "Pikachu est KO, le premier disponible est Dracaufeu"
assert len(sacha.pokemon_disponibles()) == 1, "Un seul Pokémon est encore disponible"
sacha.equipe[1].subir_degats(200)
assert sacha.tous_ko() is True, "Tous les Pokémon sont KO"
assert sacha.premier_pokemon_dispo() is None, "Aucun Pokémon disponible : il faut renvoyer None"
for i in range(4):
sacha.ajouter_pokemon(Pokemon(f"Pokémon {i}", "Normal"))
assert sacha.ajouter_pokemon(Pokemon("Septième", "Normal")) is False, "Une équipe est limitée à 6 Pokémon"
assert len(sacha.equipe) == 6
print("Exercice 4 : tous les tests sont passés.")In [ ]:
class Combat:
def __init__(self, dresseur1, dresseur2):
"""
Constructeur de la classe Combat.
:param dresseur1: (Dresseur) Premier dresseur
:param dresseur2: (Dresseur) Second dresseur
"""
# À compléter
pass
def afficher_etat(self):
"""Affiche l'état actuel du combat."""
print(f"\n{'='*40}")
print(f"Tour {self.tour}")
print(f"{'='*40}")
# Afficher les Pokémon actifs
# À compléter
pass
def lancer_combat(self):
"""
Lance le combat tour par tour.
Chaque tour, les deux Pokémon actifs s'attaquent.
Quand un Pokémon est KO, le suivant prend sa place.
Le combat s'arrête quand un dresseur n'a plus de Pokémon.
"""
print(f"\n*** COMBAT : {self.dresseur1.nom} VS {self.dresseur2.nom} ***")
while not self.dresseur1.tous_ko() and not self.dresseur2.tous_ko():
self.tour += 1
self.afficher_etat()
# Récupérer les Pokémon actifs
poke1 = self.dresseur1.premier_pokemon_dispo()
poke2 = self.dresseur2.premier_pokemon_dispo()
# Le Pokémon 1 attaque
# À compléter
# Vérifier si Pokémon 2 est KO
# À compléter
# Le Pokémon 2 attaque (s'il n'est pas KO)
# À compléter
# Vérifier si Pokémon 1 est KO
# À compléter
# Afficher le vainqueur
# À compléter
passIn [ ]:
sacha = Dresseur("Sacha")
sacha.ajouter_pokemon(Pokemon("Pikachu", "Electrik", 25, 80, 15))
sacha.ajouter_pokemon(Pokemon("Dracaufeu", "Feu", 50, 150, 25))
sacha.ajouter_pokemon(Pokemon("Tortank", "Eau", 45, 140, 22))
pierre = Dresseur("Pierre")
pierre.ajouter_pokemon(Pokemon("Onix", "Roche", 30, 120, 18))
pierre.ajouter_pokemon(Pokemon("Racaillou", "Roche", 20, 80, 12))
combat = Combat(sacha, pierre)
combat.lancer_combat()
assert pierre.tous_ko() is True, "Pierre doit avoir perdu tous ses Pokémon"
assert sacha.tous_ko() is False, "Sacha doit avoir encore au moins un Pokémon"
assert combat.tour == 11, "Le nombre de tours n'est pas le bon"
print("\nExercice 5 : tous les tests sont passés.")In [ ]:
class CentrePokemon:
def __init__(self, ville):
"""
:param ville: (str) Ville où se trouve le centre
"""
self.ville = ville
def soigner_equipe(self, dresseur):
"""
Soigne tous les Pokémon d'un dresseur à 100% de leurs PV.
:param dresseur: (Dresseur) Dresseur dont l'équipe doit être soignée
"""
# À compléter
passIn [ ]:
sacha = Dresseur("Sacha")
sacha.ajouter_pokemon(Pokemon("Pikachu", "Electrik", 25, 80, 15))
sacha.ajouter_pokemon(Pokemon("Dracaufeu", "Feu", 50, 150, 25))
sacha.equipe[0].subir_degats(100)
sacha.equipe[1].subir_degats(40)
centre = CentrePokemon("Argenta")
centre.soigner_equipe(sacha)
print(sacha)
assert sacha.equipe[0].pv == 80, "Pikachu doit retrouver tous ses PV"
assert sacha.equipe[1].pv == 150, "Dracaufeu doit retrouver tous ses PV"
print("Exercice 6 : tous les tests sont passés.")In [ ]:
class Capacite:
def __init__(self, nom, puissance, type_capacite, pp_max):
"""
:param nom: (str) Nom de la capacité
:param puissance: (int) Puissance de base
:param type_capacite: (str) Type de la capacité
:param pp_max: (int) Nombre d'utilisations max
"""
self.nom = nom
self.puissance = puissance
self.type_capacite = type_capacite
self.pp_max = pp_max
self.pp = pp_maxIn [ ]:
# Création des Pokémon
pikachu = Pokemon("Pikachu", "Electrik", 25, 80, 15)
dracaufeu = Pokemon("Dracaufeu", "Feu", 50, 150, 25)
tortank = Pokemon("Tortank", "Eau", 45, 140, 22)
onix = Pokemon("Onix", "Roche", 30, 120, 18)
racaillou = Pokemon("Racaillou", "Roche", 20, 80, 12)
# Création des dresseurs
sacha = Dresseur("Sacha")
sacha.ajouter_pokemon(pikachu)
sacha.ajouter_pokemon(dracaufeu)
sacha.ajouter_pokemon(tortank)
pierre = Dresseur("Pierre")
pierre.ajouter_pokemon(onix)
pierre.ajouter_pokemon(racaillou)
# Lancement du combat
combat = Combat(sacha, pierre)
combat.lancer_combat()
# Soins au Centre Pokémon
centre = CentrePokemon("Argenta")
centre.soigner_equipe(sacha)
print()
print(sacha)