You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
440 lines
16 KiB
440 lines
16 KiB
# 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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|