diff --git a/Manoir_hanté_données.py b/Manoir_hanté_données.py new file mode 100644 index 0000000..a3688a6 --- /dev/null +++ b/Manoir_hanté_données.py @@ -0,0 +1,442 @@ +# Importations + +import random as rd + +#Déclaration de constantes + +#Déclaration de classe +class Monstre : + def __init__(self, nom, dsc = None , img = None, obj = None) -> None : + self.nom = nom + self.dsc = dsc + self.img = img + self.obj = obj + if "Squelette" in nom : + self.habilite = 5 + self.endu = 4 + else : + self.habilite = rd.randint(1, 10) + self.endu = rd.randint(1, 10) + + self.force = 2 + self.courage = 7 + + + def get_description(self : 'Monstre') -> str : + return str(self.dsc) + + def get_carac(self : 'Monstre') -> str : + return (f"{self.nom}, H{self.habilite}, E{self.endu}, F{self.force}, C{self.courage}") + + def subir_degats(self:'Monstre', degats : int) -> None : + if degats > 0 : + self.endu = self.endu - degats + if self.endu < 0 : + self.endu = 0 + return None + + def est_hs(self: 'Monstre') -> 'bool' : + return self.endu <= 0 + + + +class Personnage : + def __init__(self , nom) -> None : + self.nom = nom + self.habilite = rd.randint(6, 9) // 5 + rd. randint(1,4) + self.endu = rd.randint(8,15) // 7 + rd.randint(1,8) + self.objet = "Rien" + if "arme" in self.objet : + self.force = 3 + else : + self.force = 2 + self.charisme = rd.randint(1,10) + self.vigilance = rd.randint(1,10) + self.discretion = rd.randint(1,10) + self.lieu = None + self.lieux_precedents = [] + def get_carac(self : 'Personnage') -> str : + return (f"{self.nom}, H{self.habilite}, E{self.endu}, F{self.force}, C{self.charisme}, V {self.vigilance}, Objet {self.objet}") + + def subir_degats(self:'Personnage', degats : int) -> None : + if degats > 0 : + self.endu = self.endu - degats + if self.endu < 0 : + self.endu = 0 + return None + + def est_hs(self: 'Personnage') -> 'bool' : + return self.endu <= 0 + + def combattre(self:'Personnage', adversaire : 'Monstre') -> tuple : + '''Gére le déroulement du combat et la mort d'un des combattants''' + cbt = [None,None] + + if adversaire.est_hs() and self.est_hs(): + cbt[0] = 'MP' + + elif self.est_hs() : + cbt[0] = 'P' + + + elif adversaire.est_hs() : + cbt[0] = 'M' + self.lieu.set_occupant(None) + + + elif adversaire.est_hs() and self.est_hs(): + cbt[0] = 'MP' + self.lieu.set_occupant(None) + else : + res = 'X' + print(f'{cbt[0]} est HS') + + sc_att = rd.randint(1,6) + rd.randint(1,6) + self.habilite + print(f'{self.nom} fait un score de {sc_att}') + sc_def = rd.randint(1,6) + rd.randint(1,6) + adversaire.habilite + print(f'{adversaire.nom} fait un score de {sc_def}') + if sc_att > sc_def : + adversaire.subir_degats(self.force) + cbt[1] = f'{adversaire.nom} subit {adversaire.force} points de dégats' + elif sc_att < sc_def : + self.subir_degats(adversaire.force) + cbt[1] = f'{self.nom} subit {adversaire.force} points de dégats' + print(cbt[1]) + else : + self.subir_degats(1) + adversaire.subir_degats(1) + cbt[1] = f'Pesrsonne ne parviens a prendre le dessus' + print(cbt[1]) + + return tuple(cbt) + + def combattre_monstre_actuel(self:'Personnage') -> tuple : + '''lance un combat entre le personnage et l'occupant de la salle''' + + if self.lieu.occupant : + while self.combattre(self.lieu.occupant)[0] == None: + controls(self) + return self.combattre(self.lieu.occupant) + + def soigner(self:'Personnage', soins :'int') -> None : + if soins > 0 : + self.endu = self.endu + soins + else : + return None + if self.endu > 24 : + self.endu = 24 + return None + + def observer(self:'Personnage') -> str : + if self.lieu : + return self.lieu.decrire_lieu() + + def reflechir(self:'Personnage') -> str : + if self.lieu.occupant : + action_spe(self) + elif self.lieu : + return self.lieu.decrire_actions_possibles() + + + + def aller_nord(self:'Personnage') -> bool : + if self.lieu.nord : + self.lieux_precedents.append(self.lieu.nord) + self.lieu = self.lieu.nord + controls(self) + + return self.lieu.nord == None + + def aller_sud(self:'Personnage') -> bool : + if self.lieu.sud : + self.lieux_precedents.append(self.lieu.sud) + self.lieu = self.lieu.sud + controls(self) + + return self.lieu.sud == None + + + def aller_ouest(self:'Personnage') -> bool : + if self.lieu.ouest : + self.lieux_precedents.append(self.lieu.ouest) + self.lieu = self.lieu.ouest + controls(self) + + return self.lieu.ouest == None + + def aller_est(self:'Personnage') -> bool : + if self.lieu.est : + self.lieux_precedents.append(self.lieu.est) + self.lieu = self.lieu.est + controls(self) + + return self.lieu.est == None + + + def fuite(self:'Personnage') -> bool : + if self.lieux_precedents[-2] : + self.lieu = self.lieux_precedents[-2] + controls(self) + return self.lieux_precedents[-2] == None + + def infiltration(self:'Personnage') -> bool : + if self.lieu.occupant == None : + print("pas de raison se se cacher") + else : + hm = self.lieu.occupant.habilite + hp = self.habilite + if hm > hp : + print("il vous a trouvé") + self.combattre_monstre_actuel() + else : + print("le monstre quitte la salle") + self.lieu.occupant == None + controls(self) + + return hm > hp + + + + + +class Lieu : + def __init__(self, nom, dsc, img=None) : + self.nom = nom + self.dsc = dsc + self.img = img + self.nord = None + self.sud = None + self.ouest = None + self.est = 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 = "" + reponse = reponse + f'{self.dsc}' # récupérer la description de la salle "vide"... + + # ... et ce code permet d'y rajouter la description du monstre éventuel ... + if self.occupant: # cela veut dire si self.occupant existe (n'est pas 0, vide ou None) + reponse = reponse + f"\n La salle contient également : {self.occupant.get_description()}" + return reponse + + def decrire_actions_possibles(self:'Lieu') -> str : + if self.occupant != None : + return(f" vous pouvez attaquer l'ennemi avec C ou fuir avec F " ) + if self.objets != [] : + print(f'\n appuyez sur E pour ramasser {self.objets}') + + + + ''' Bloc qui sert uniquement a identifier les issues de la salle + et déterminer quel message est approprié ''' + + + # Cas ou au moins 3 salles sont accessibles + if self.nord != None and self.ouest != None and self.est != None and self.sud != None : + return(f'vous pouvez aller dans N {self.nord.nom} O{self.ouest.nom} E{self.est.nom} S{self.sud.nom}') + elif self.nord == None and self.ouest != None and self.est != None and self.sud != None : + return(f'vous pouvez aller dans O{self.ouest.nom} E{self.est.nom} S{self.sud.nom}') + elif self.nord != None and self.ouest == None and self.est != None and self.sud != None : + return(f'vous pouvez aller dans N {self.nord.nom} E{self.est.nom} S{self.sud.nom}') + elif self.nord != None and self.ouest != None and self.est == None and self.sud != None : + return(f'vous pouvez aller dans N {self.nord.nom} O{self.ouest.nom} S{self.sud.nom}') + elif self.nord != None and self.ouest != None and self.est != None and self.sud == None : + return(f'vous pouvez aller dans N {self.nord.nom} O{self.ouest.nom} E{self.est.nom} ') + + # cas ou seulement deux salles sont accessibles + + # Nord + ... bloqué + elif self.nord == None and self.ouest == None and self.est != None and self.sud != None : + return(f'vous pouvez aller dans E {self.est.nom} S {self.sud.nom}') + elif self.nord == None and self.ouest != None and self.est == None and self.sud != None : + return(f'vous pouvez aller dans O {self.ouest.nom} S {self.sud.nom}') + elif self.nord == None and self.ouest != None and self.est != None and self.sud == None : + return(f'vous pouvez aller dans O {self.ouest.nom} E {self.est.nom} ') + # Ouest + ... bloqué + elif self.nord != None and self.ouest == None and self.est == None and self.sud != None : + return(f'vous pouvez aller dans N {self.nord.nom} S {self.sud.nom}') + + elif self.nord != None and self.ouest == None and self.est != None and self.sud == None : + return(f'vous pouvez aller dans N {self.nord.nom} E {self.est.nom}') + # Est + ... bloqué + elif self.nord != None and self.ouest != None and self.est == None and self.sud == None : + return(f'vous pouvez aller dans N {self.nord.nom} O {self.ouest.nom}') + + # cas ou une seule salle est disponible + elif self.nord != None and self.ouest == None and self.est == None and self.sud == None : + return(f'vous pouvez aller dans N {self.nord.nom}') + elif self.nord == None and self.ouest != None and self.est == None and self.sud == None : + return(f'vous pouvez aller dans O {self.ouest.nom}') + elif self.nord == None and self.ouest == None and self.est != None and self.sud == None : + return(f'vous pouvez aller dans E {self.est.nom}') + elif self.nord == None and self.ouest == None and self.est == None and self.sud != None : + return(f'vous pouvez aller dans S {self.sud.nom}') + + + # cas ou rien n'est accessible + elif self.nord == None and self.ouest == None and self.est == None and self.sud == None : + return("vous êtes piégés") + + + + + def set_occupant(self:'Lieu', occupant:'None|Monstre|Personnage') -> bool : + if self.occupant != None and occupant == None : + self.occupant = None + elif not self.occupant == None : + return False + else : + self.occupant = occupant + return True + + +class Manoir: + + def __init__(self): + + self.heros = None + self.depart = None + self.lieux = [] + self.monstres = [] + + + + + +# Déclaration de fonctions + + +def peupler_manoir(): + + # Création du personnage du joueur + aventurier = Personnage("Alice") + + # Création et agencement des lieux + des = '''Vous êtes devant l'entrée qui mène au nord. Une solide porte en bois est entreouverte''' + exterieur = Lieu("Entrée", des, "manoir.jpg") + + des = "Vous êtes dans le hall d'entrée du manoir." + hall = Lieu("Hall", des, "hall.jpeg") + + des = "Une grande cuisine délabrée, la nourriture laissée a pourir" + cuisine = Lieu("Cuisine",des) + + des = "Une chambre froide avec de nombreux crochets au plafond, pour la nourriture... certainement" + frigo = Lieu("Salle_réfrigérée",des) + + des = "Un escalier... ce serait dommage de tomber" + escalier = Lieu("Escalier", des) + + des = "Le couloir du 1er étage du manoir" + couloir = Lieu("Couloir", des) + + des = "Une salle de bain mal entretenue" + bains = Lieu("Bains", des) + + des = " Un bureau, une machine à écrire, quelques tableaux aux murs... pas intéressant" + bureau = Lieu("Bains", des) + + des = "Certainement la chambre du maitre des lieux" + chambre = Lieu("Chambre",des) + + + exterieur.nord = hall + hall.sud = exterieur + hall.nord = escalier + hall.ouest = cuisine + cuisine.nord = frigo + escalier.nord = couloir + couloir.ouest = bains + couloir.est = bureau + couloir.nord + + + + # Création et positionnement des monstres + squelette_1 = Monstre("Squelette", "Un squelette semblant bouger seul et muni d'une épée.", "squelette.png") + hall.set_occupant(squelette_1) + squelette_2 = Monstre("Squelette, encore", "Un squelette a peu prés normal mis a part le fait qu'il bouge et qu'il brandisse une épée", "squelette.png") + couloir.set_occupant(squelette_2) + boucher = Monstre("Le Cochon","Un homme énorme avec un masque de cochon et une hachette") + frigo.set_occupant(boucher) + # 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 + manoir.lieux.append(exterieur) + manoir.lieux.append(hall) + manoir.lieux.append(escalier) + manoir.lieux.append(cuisine) + manoir.lieux.append(frigo) + manoir.lieux.append(couloir) + manoir.lieux.append(bains) + manoir.lieux.append(bureau) + manoir.lieux.append(chambre) + manoir.monstres.append(squelette_1) + manoir.monstres.append(squelette_2) + manoir.monstres.append(boucher) + + + return manoir + + + ''' Ce qui suit est une interface improvisée + afin de rendre le jeu fonctonnel sans tkinter et Pillow ''' + +def controls(perso : "le personnage joueur") -> None : + + # Dépacement du peronnage joueur + cap = input("où souhaitez vous aller ?") + if cap == "N" or cap =="n" : + perso.aller_nord() + elif cap == "O" or cap == "o": + perso.aller_ouest() + elif cap == "E" or cap == "e": + perso.aller_est() + elif cap == "S "or cap == "s" : + perso.aller_sud() + elif cap == "x" or cap == "X" : + print(perso.observer()) + controls(perso) + elif cap == "r" or cap == "R" : + action_spe(perso) + + # input imprévu du joueur + else : + print("cette action est impossible") + controls(perso) + + + +def action_spe(perso : "le personnage joueur") : + act = input("que voulez vous faire ?") + if act == "c" or act == "C" : + perso.combattre_monstre_actuel() + if act == "d" or act == "D" : + perso.infiltration() + if act == "f" or act == "F" : + perso.fuite() + + # input imprévu du joueur + else : + print("cette action est impossible") + + + + +# Programme principal +if __name__ == '__main__': + m = peupler_manoir() + controls(m.heros)