# Importation import random as rd import time # Déclaration des CONSTANTES # Déclaration Classes class Monstre : def __init__(self, nom, dsc, img=None, obj=None) -> None: self.nom = nom self.dsc = dsc self.img = img self.obj = obj self.habilite = rd.randint(1,10) self.endurance_max = 15 self.endurance = self.endurance_max self.force = 2 self.courage = rd.randint(1,10) self.objet = [] if "Squelette" in self.nom: self.habilite = rd.randint(1,7) self.endurance = rd.randint(1,4) self.force = rd.randint(1,2) self.courage = rd.randint(1,10) if 'Chauve-souris' in self.nom: self.habilite = rd.randint(5,10) self.endurance = rd.randint(1,3) self.force = 1 self.courage = 10 self.objet = ['clé cadena'] if 'Limace-geante' in self.nom: self.habilite = 1 self.endurance = 7 self.force = 1 self.courage = 10 if 'Zombie' in self.nom: self.habilite = rd.randint(1,4) self.endurance = 7 self.force = 1 self.courage = 8 if 'Zombie_sur_poulet'in self.nom: self.habilite = rd.randint(4,7) self.endurance = 4 self.force = 2 self.courage = 8 if 'Hydra' in self.nom: self.habilite = rd.randint(8,10) self.endurance = 10 self.force = 3 self.courage = 10 if 'Poutine' in self.nom: self.habilite = 10 self.endurance = 12 self.force = 4 self.courage = 10 def modifier_endurance(self:'Monstre', modificateur): endurance_modifie = self.endurance + modificateur if endurance_modifie < 0: self.endurance = 0 elif endurance_modifie > self.endurance_max: self.endurance = self.endurance_max else: self.endurance = endurance_modifie def subir_degats(self:'Monstre', degats:int) -> None: if degats > 0: self.modifier_endurance(-degats) def get_description(self:'Monstre') -> str: return self.dsc def get_carac(self:'Montres') -> str: return f"{self.nom} H{self.habilite} E{self.endurance} F{self.force} C{self.courage}" def est_hs(self:'Monstre') -> bool: if self.endurance <= 0: return True else: return False class Personnage: def __init__(self, nom='Aucun'): self.nom = nom self.habilite = 5 + rd.randint(1,4) self.endurance_max = 7 + rd.randint(1,8) self.endurance = self.endurance_max self.force = 2 self.charisme = rd.randint(1,10) self.vigilance = rd.randint(1,10) self.discretion = False self.lieu = None self.lieu_precedents = [] self.objet = [] def modifier_endurance(self:'Personnage', modificateur): endurance_modifie = self.endurance + modificateur if endurance_modifie < 0: self.endurance = 0 elif endurance_modifie > self.endurance_max: self.endurance = self.endurance_max else: self.endurance = endurance_modifie def subir_degats(self:'Personnage', degats:int) -> None: if degats > 0: self.modifier_endurance(-degats) def est_hs(self:'Personnage') -> bool : if self.endurance == 0: return True else: return False def get_carac(self:'Personnage') -> str: return f"{self.nom} H{self.habilite} E{self.endurance} F{self.force} C{self.charisme} V{self.vigilance}" def combattre(self:'Personnage', adversaire:'Monstre') -> tuple: """ Effectue un combat entre le personnage et un monstre. Parameters: - self ('Personnage'): L'instance du personnage effectuant l'attaque. - adversaire ('Monstre'): L'instance du monstre contre lequel le personnage se bat. Returns: - tuple: Un tuple contenant le code de résultat et la description du combat. Code de Résultat : - 'x': Le combat n'est pas encore terminé. - 'MP': Les deux participants sont hors combat. - 'P': Le personnage est hors combat. - 'M': Le monstre est hors combat. Description : Le combat consiste en plusieurs étapes, où les scores de combat sont comparés, et des dégâts sont infligés en fonction du résultat. Les participants peuvent également subir des dégâts critiques ou être hors combat. """ score_personnage = rd.randint(1, 6) + rd.randint(1, 6) + self.habilite score_monstre = rd.randint(1, 6) + rd.randint(1, 6) + adversaire.habilite result_code = 'x' while result_code == 'x': if score_personnage == score_monstre: self.subir_degats(1) adversaire.subir_degats(1) result_code = "x" result_desc = f"{self.nom} et {adversaire.nom} se blessent mutuellement." time.sleep(1) print(result_desc) elif score_personnage > score_monstre: adversaire.subir_degats(self.force) result_code = "x" result_desc = f"{self.nom} inflige {self.force} points de dégâts au {adversaire.nom}." time.sleep(1) print(result_desc) else: self.subir_degats(adversaire.force) result_code = "x" result_desc = f"{adversaire.nom} inflige {adversaire.force} points de dégâts au {self.nom}." time.sleep(0.5) print(result_desc) if rd.randint(1, 6) == rd.randint(1, 6): double_damage = self.force * 2 adversaire.subir_degats(double_damage) result_desc += f" Coup critique ! {self.nom} inflige {double_damage} points de dégâts supplémentaires au {adversaire.nom}." time.sleep(0.5) print(result_desc) elif self.est_hs() and adversaire.est_hs(): result_code = "MP" result_desc = f"{self.nom} et {adversaire.nom} sont tous les deux hors combat." time.sleep(0.5) print(result_desc) elif self.est_hs(): result_code = "P" result_desc = f"{self.nom} est hors combat." elif adversaire.est_hs(): result_code = "M" result_desc = f"{adversaire.nom} est hors combat." time.sleep(0.5) print(result_desc) return result_code, result_desc def observer(self:'Personnage') -> str: if self.lieu: return self.lieu.decrire_lieu() def reflechir(self:'Personnage') -> str: if self.lieu: return self.lieu.decrire_actions_possibles() def combattre_monstre_actuel(self): rep = self.combattre(self.lieu.occupant) if self.lieu.occupant.est_hs(): self.lieu.set_occupant(None) return rep def aller_nord(self): if self.lieu.nord and (not self.lieu.occupant or self.lieu.occupant.est_hs()): self.lieux_precedents.append(self.lieu) self.lieu = self.lieu.nord return True else: return False def aller_sud(self): if self.lieu.sud and (not self.lieu.occupant or self.lieu.occupant.est_hs()): self.lieux_precedents.append(self.lieu) self.lieu = self.lieu.sud return True else: return False def aller_ouest(self): if self.lieu.ouest and (not self.lieu.occupant or self.lieu.occupant.est_hs()): self.lieux_precedents.append(self.lieu) self.lieu = self.lieu.ouest return True else: return False def aller_est(self): if self.lieu.est and (not self.lieu.occupant or self.lieu.occupant.est_hs()): self.lieux_precedents.append(self.lieu) self.lieu = self.lieu.est return True else: return False class Lieu: def __init__(self, nom, dsc, img=None) -> None: self.nom = nom self.dsc = dsc self.image = None self.nord = None self.sud = None self.est = None self.ouest = None self.occupant = None self.objets = [] self.action_supp = None def decrire_lieu(self): """Renvoie une description de la salle et le monstre éventuellement présent :: param self(Lieu) :: une instance de Lieu :: return (str) :: un string contenant la description globale """ reponse = self.dsc if self.occupant: # cela veut dire si self.occupant existe (n'est pas 0, vide ou None) reponse = reponse + f" \nLa salle contient également un(e) {self.occupant.nom} : {self.occupant.get_description()}" return reponse def decrire_actions_possibles(self:'Lieu') -> str: """Renvoie un string de toutes les actions possibles""" actions_possibles = "" if self.occupant: actions_possibles =+ "C : Combattre" actions_possibles =+ "F : Fuire" if self.objets: actions_possibles =+ "R : Ramasser" if self.nord: actions_possibles =+ "Z : Porte Nord" if self.sud: actions_possibles =+ "S : Porte Sud" if self.ouest: actions_possibles =+ "D : Porte Ouest" if self.est: actions_possibles =+ "Q : Porte Est" if self.objet: actions_possibles =+ "U : utiliser objet" def set_occupant(self:'Lieu', occupant:'None|Monstre|Personnage') -> bool: '''Cette méthode permet de mettre en place un occupant dasn un lieu''' if not self.occupant or occupant.est_hs(): self.occupant = occupant def ouvrir(self:'Personnage', lieu:'Lieu'): '''permet de verifier si on a un objet dans l'inventaire pour ouvrir''' if self.objet == 'clé cadena': entree.nord = couloire_sud couloire_sud.sud = entree class Manoir: def __init__(self): self.heros = None self.depart = None self.lieux = [] self.monstres = [] def peupler_manoir(): # Création du personnage du joueur aventurier = Personnage("Alice") # Création et agencement des lieux entree = Lieu("Entrée", "Une entrée délabrée et poussiéreuse. Une porte entrouverte se trouve à l'ouest. Une porte verouillée avec un cadena au nord et une petite salle a l'est.") garage = Lieu("Garage", "Un garage sans dessus-dessous avec une chauve-souris qui a une clé entre ses griffes. Une porte mène à l'est vers l'Entrée") vestibule = Lieu("Vestibule", "Une petite pièce dans la quelle est entreposée une armure rouillée. aller vers l'ouest pour retourner dans l'Entrée.") couloire_sud = Lieu("Couloire Sud","") chambre_du_gardien = Lieu("Chambre du gardien", "") toilette_usagée = Lieu("Toilette usagée", "Peuve toujours servir") Hub = Lieu("Jardin couvert", "") couloire_nord = Lieu("Couloire Nord","") couloire_est = Lieu("Couloire Est","") couloire_ouest = Lieu("Couloire Ouest","") cuisine = Lieu("Cuisine","") picine = Lieu("Picine","Zone de boss") salle_arcade = Lieu("Salle d'arcade","") bureau = Lieu("Bureau","") salle_NSI = Lieu("Salle de NSI","Zone de bossssss... !!!!!") entree.ouest = garage entree.est = vestibule garage.est = entree garage.objet = ['cle cadena'] garage.occupant = C vestibule.objet = ['Armure rouillée (+2 EnduranceMax)'] vestibule.ouest = entree couloire_sud.nord = Hub couloire_sud.ouest = chambre_du_gardien couloire_sud.est = toilette_usagée chambre_du_gardien.est = couloire_sud toilette_usagée.ouest = couloire_sud Hub.sud = couloire_sud Hub.est = couloire_est Hub.ouest = couloire_ouest Hub.nord = couloire_nord couloire_ouest.ouest = cuisine couloire_ouest.est = Hub cuisine.est = couloire_ouest cuisine.ouest = picine couloire_est.ouest = Hub couloire_est.est = salle_arcade salle_arcade.ouest = couloire_est salle_arcade.nord = bureau salle_arcade.est = salle_NSI bureau.sud = salle_arcade # Création et positionnement d'un monstre squelette_1 = Monstre("Squelette", "Un squelette semblant bouger seul et muni d'une épée.", "squelette.png") hall.set_occupant(squelette_1) # Affectation d'un lieu de départ à l'aventurier aventurier.lieu = exterieur # Création du manoir manoir = Manoir() manoir.heros = aventurier manoir.depart = aventurier.lieu return manoir # Déclaration de Fonctions # Le corps du module en lui-même if __name__ == '__main__': # personnage h = Personnage("Alice") # monstre S = Monstre("Squelette", "") C = Monstre("Chauve-souris", "") # lieu entree = Lieu("Entrée", "Une entrée délabrée et poussiéreuse. Une porte entrouverte se trouve à l'ouest. Une porte verouillée avec un cadena au nord et une petite salle a l'est.") garage = Lieu("Garage", "Un garage sans dessus-dessous avec une chauve-souris qui a une clé entre ses griffes. Une porte mène à l'est vers l'Entrée") vestibule = Lieu("Vestibule", "Une petite pièce dans la quelle est entreposée une armure rouillée. aller vers l'ouest pour retourner dans l'Entrée.") couloire_sud = Lieu("Couloire Sud","") chambre_du_gardien = Lieu("Chambre du gardien", "") toilette_usagée = Lieu("Toilette usagée", "Peuve toujours servir") Hub = Lieu("Jardin couvert", "") couloire_nord = Lieu("Couloire Nord","") couloire_est = Lieu("Couloire Est","") couloire_ouest = Lieu("Couloire Ouest","") cuisine = Lieu("Cuisine","") picine = Lieu("Picine","Zone de boss") salle_arcade = Lieu("Salle d'arcade","") bureau = Lieu("Bureau","") salle_NSI = Lieu("Salle de NSI","Zone de bossssss... !!!!!") entree.ouest = garage entree.est = vestibule garage.est = entree garage.objet = ['cle cadena'] garage.occupant = C vestibule.objet = ['Armure rouillée (+2 EnduranceMax)'] vestibule.ouest = entree couloire_sud.nord = Hub couloire_sud.ouest = chambre_du_gardien couloire_sud.est = toilette_usagée chambre_du_gardien.est = couloire_sud toilette_usagée.ouest = couloire_sud Hub.sud = couloire_sud Hub.est = couloire_est Hub.ouest = couloire_ouest Hub.nord = couloire_nord couloire_ouest.ouest = cuisine couloire_ouest.est = Hub cuisine.est = couloire_ouest cuisine.ouest = picine couloire_est.ouest = Hub couloire_est.est = salle_arcade salle_arcade.ouest = couloire_est salle_arcade.nord = bureau salle_arcade.est = salle_NSI bureau.sud = salle_arcade