From ae222241da368158f58fc0c55869a64639c1b45e Mon Sep 17 00:00:00 2001 From: "bollet.c" <> Date: Sun, 24 Sep 2023 23:14:03 +0200 Subject: [PATCH] =?UTF-8?q?correction=20de=20nombreux=20bugs,=20am=C3=A9li?= =?UTF-8?q?oration=20de=20l'interface?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ascii/elfe.txt | 11 ++++ ascii/etreEtrange.txt | 10 +++ ascii/game_over.txt | 7 +++ ascii/guerrier.txt | 11 ++++ ascii/magicien.txt | 10 +++ ascii/titre_accueil.txt | 26 ++++++++ ascii/voleur.txt | 12 ++++ ascii/youWon.txt | 8 +++ interface.py | 133 +++++++++++++++++++++++++++++++++++++--- main.py | 55 +++++++++++++---- personnage.py | 107 ++++++++++++++++---------------- 11 files changed, 315 insertions(+), 75 deletions(-) create mode 100644 ascii/elfe.txt create mode 100644 ascii/etreEtrange.txt create mode 100644 ascii/game_over.txt create mode 100644 ascii/guerrier.txt create mode 100644 ascii/magicien.txt create mode 100644 ascii/voleur.txt create mode 100644 ascii/youWon.txt diff --git a/ascii/elfe.txt b/ascii/elfe.txt new file mode 100644 index 0000000..c1aff48 --- /dev/null +++ b/ascii/elfe.txt @@ -0,0 +1,11 @@ + .-''-. .---. ________ .-''-. + .'_ _ \ | ,_| | | .'_ _ \ + / ( ` ) ',-./ ) | .----' / ( ` ) ' +. (_ o _) |\ '_ '`) | _|____ . (_ o _) | +| (_,_)___| > (_) ) |_( )_ || (_,_)___| +' \ .---.( . .-' (_ o._)__|' \ .---. + \ `-' / `-'`-'|___ |(_,_) \ `-' / + \ / | \| | \ / + `'-..-' `--------`'---' `'-..-' + + diff --git a/ascii/etreEtrange.txt b/ascii/etreEtrange.txt new file mode 100644 index 0000000..0beefbd --- /dev/null +++ b/ascii/etreEtrange.txt @@ -0,0 +1,10 @@ +.-. .-') .-') _ _ .-') +\ ( OO ) ( OO ) ) ( \( -O ) + ;-----.\ .-'),-----. ,--./ ,--,' ,--. .-'),-----. ,--. ,--. ,------. + | .-. | ( OO' .-. '| \ | |\ .-')| ,|( OO' .-. ' | | | | | /`. ' + | '-' /_)/ | | | || \| | )( OO |(_|/ | | | | | | | .-') | / | | + | .-. `. \_) | |\| || . |/ | `-'| |\_) | |\| | | |_|( OO )| |_.' | + | | \ | \ | | | || |\ | ,--. | | \ | | | | | | | `-' /| . '.' + | '--' / `' '-' '| | \ | | '-' / `' '-' '(' '-'(_.-' | |\ \ + `------' `-----' `--' `--' `-----' `-----' `-----' `--' '--' + diff --git a/ascii/game_over.txt b/ascii/game_over.txt new file mode 100644 index 0000000..fee4085 --- /dev/null +++ b/ascii/game_over.txt @@ -0,0 +1,7 @@ + ___ ___ + / __| __ _ _ __ ___ o O O / _ \ __ __ ___ _ _ + | (_ | / _` | | ' \ / -_) o | (_) | \ V / / -_) | '_| + \___| \__,_| |_|_|_| \___| TS__[O] \___/ _\_/_ \___| _|_|_ +_|"""""|_|"""""|_|"""""|_|"""""| {======|_|"""""|_|"""""|_|"""""|_|"""""| +"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'./o--000'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-' + diff --git a/ascii/guerrier.txt b/ascii/guerrier.txt new file mode 100644 index 0000000..5065f18 --- /dev/null +++ b/ascii/guerrier.txt @@ -0,0 +1,11 @@ + ▄████ █ ██ ▓█████ ██▀███ ██▀███ ██▓▓█████ ██▀███ + ██▒ ▀█▒ ██ ▓██▒▓█ ▀ ▓██ ▒ ██▒▓██ ▒ ██▒▓██▒▓█ ▀ ▓██ ▒ ██▒ +▒██░▄▄▄░▓██ ▒██░▒███ ▓██ ░▄█ ▒▓██ ░▄█ ▒▒██▒▒███ ▓██ ░▄█ ▒ +░▓█ ██▓▓▓█ ░██░▒▓█ ▄ ▒██▀▀█▄ ▒██▀▀█▄ ░██░▒▓█ ▄ ▒██▀▀█▄ +░▒▓███▀▒▒▒█████▓ ░▒████▒░██▓ ▒██▒░██▓ ▒██▒░██░░▒████▒░██▓ ▒██▒ + ░▒ ▒ ░▒▓▒ ▒ ▒ ░░ ▒░ ░░ ▒▓ ░▒▓░░ ▒▓ ░▒▓░░▓ ░░ ▒░ ░░ ▒▓ ░▒▓░ + ░ ░ ░░▒░ ░ ░ ░ ░ ░ ░▒ ░ ▒░ ░▒ ░ ▒░ ▒ ░ ░ ░ ░ ░▒ ░ ▒░ +░ ░ ░ ░░░ ░ ░ ░ ░░ ░ ░░ ░ ▒ ░ ░ ░░ ░ + ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ + + diff --git a/ascii/magicien.txt b/ascii/magicien.txt new file mode 100644 index 0000000..314fdc8 --- /dev/null +++ b/ascii/magicien.txt @@ -0,0 +1,10 @@ + ▄▄▄▄███▄▄▄▄ ▄████████ ▄██████▄ ▄█ ▄████████ ▄█ ▄████████ ███▄▄▄▄ + ▄██▀▀▀███▀▀▀██▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███▀▀▀██▄ + ███ ███ ███ ███ ███ ███ █▀ ███▌ ███ █▀ ███▌ ███ █▀ ███ ███ + ███ ███ ███ ███ ███ ▄███ ███▌ ███ ███▌ ▄███▄▄▄ ███ ███ + ███ ███ ███ ▀███████████ ▀▀███ ████▄ ███▌ ███ ███▌ ▀▀███▀▀▀ ███ ███ + ███ ███ ███ ███ ███ ███ ███ ███ ███ █▄ ███ ███ █▄ ███ ███ + ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ + ▀█ ███ █▀ ███ █▀ ████████▀ █▀ ████████▀ █▀ ██████████ ▀█ █▀ + + diff --git a/ascii/titre_accueil.txt b/ascii/titre_accueil.txt index e69de29..b67caa5 100644 --- a/ascii/titre_accueil.txt +++ b/ascii/titre_accueil.txt @@ -0,0 +1,26 @@ +88888888888 888 .d88888b. 888 + 888 888 d88P" "Y88b 888 + 888 888 888 888 888 + 888 88888b. .d88b. 888 888 888 888 .d88b. .d8888b 888888 + 888 888 "88b d8P Y8b 888 888 888 888 d8P Y8b 88K 888 + 888 888 888 88888888 888 Y8b 888 888 888 88888888 "Y8888b. 888 + 888 888 888 Y8b. Y88b.Y8b88P Y88b 888 Y8b. X88 Y88b. + 888 888 888 "Y8888 "Y888888" "Y88888 "Y8888 88888P' "Y888 + Y8b + .d888 + d88P" + 888888 .d88b. 888d888 + 888 d88""88b 888P" + 888 888 888 888 + 888 Y88..88P 888 + 888 "Y88P" 888 + + .d888 888 + d88P" 888 + 888 888 + 888888 888d888 .d88b. .d88b. .d88888 .d88b. 88888b.d88b. + 888 888P" d8P Y8b d8P Y8b d88" 888 d88""88b 888 "888 "88b + 888 888 88888888 88888888 888 888 888 888 888 888 888 + 888 888 Y8b. Y8b. Y88b 888 Y88..88P 888 888 888 + 888 888 "Y8888 "Y8888 "Y88888 "Y88P" 888 888 888 + \ No newline at end of file diff --git a/ascii/voleur.txt b/ascii/voleur.txt new file mode 100644 index 0000000..1161d2e --- /dev/null +++ b/ascii/voleur.txt @@ -0,0 +1,12 @@ + /$$ + | $$ + /$$ /$$ /$$$$$$ | $$ /$$$$$$ /$$ /$$ /$$$$$$ +| $$ /$$//$$__ $$| $$ /$$__ $$| $$ | $$ /$$__ $$ + \ $$/$$/| $$ \ $$| $$| $$$$$$$$| $$ | $$| $$ \__/ + \ $$$/ | $$ | $$| $$| $$_____/| $$ | $$| $$ + \ $/ | $$$$$$/| $$| $$$$$$$| $$$$$$/| $$ + \_/ \______/ |__/ \_______/ \______/ |__/ + + + + diff --git a/ascii/youWon.txt b/ascii/youWon.txt new file mode 100644 index 0000000..2b303e7 --- /dev/null +++ b/ascii/youWon.txt @@ -0,0 +1,8 @@ + __ __ U ___ u _ _ U ___ u _ _ _ + \ \ / / \/"_ \/U |"|u| | __ __ \/"_ \/ | \ |"| U|"|u + \ V / | | | | \| |\| | \"\ /"/ | | | |<| \| |> \| |/ + U_|"|_u.-,_| |_| | | |_| | /\ \ /\ / /\.-,_| |_| |U| |\ |u |_| + |_| \_)-\___/ <<\___/ U \ V V / U\_)-\___/ |_| \_| (_) +.-,//|(_ \\ (__) )( .-,_\ /\ /_,-. \\ || \\,-. |||_ + \_) (__) (__) (__) \_)-' '-(_/ (__) (_") (_/ (__)_) + diff --git a/interface.py b/interface.py index d87d02d..d4c09d6 100644 --- a/interface.py +++ b/interface.py @@ -1,12 +1,125 @@ -class FenetreCombat(): - def __init__(self, nom, texte_de_presentation): - """initialise une interface pour un combat""" - self.texte_de_presentation = texte_de_presentation - - self.instructions() - def instructions(self): - print(texte_de_presentation) +from time import sleep + +#======fonctions utiles====== +def cls(): + """efface la console""" + print("\033[H\033[J", end="") + def affiche_fichier(path): - with open(path, 'r') as file: + """affiche le contenu d'un fichier - ici ce seront des fichiers textes""" + with open(path, 'r', encoding="utf8") as file: for line in file: - print(line) \ No newline at end of file + print(line, end="") + print("") + +def message_avec_suite(msg): + """affiche un message lettre par lettre et attend que l'utilisateur presse 'Entrée'""" + for lettre in msg: + print(lettre, end="", flush=True) + sleep(0.02) + input("\n\n[Entrée]") + cls() + + +#===========Intros=========== +def intro_longue(): + """intro du jeu, version longue + retourne le nom et la catégorie du joueur""" + cls() + + #intro + message_avec_suite("Vous vous trouvez là, en face d'une porte mystérieuse.") + message_avec_suite("Hésitant un peu, vous la poussez, pour trouver un être étrange, assis derrière un bureau moderne.") + message_avec_suite("La porte se referme violemment derrière vous, comme par \033[3mmagie\033[0m.") + message_avec_suite("Vous êtes dans une fâcheuse position.") + + affiche_fichier("ascii/titre_accueil.txt") + + input("Appuyez sur Entrée pour jouer...") + cls() + #salutations + message_avec_suite("L'être étrange vous salue, d'une voix artificielle : \n") + affiche_fichier("ascii/etreEtrange.txt") + #nom du joueur + nomJoueur1 = input("\n\n Quel est ton nom ? : ") + while nomJoueur1 == "": + nomJoueur1 = input("J'aimerais bien savoir à qui je m'adresse ; quel est ton nom ? : ") + #42 + if nomJoueur1 == "42": + youWon() + cls() + #2e partie de l'intro + #demander si 2 1ere l. pas superflues + message_avec_suite("Bon, "+nomJoueur1+", je vais t'offrir une seule chance de sortir d'ici.\nTu vas devoir affronter un de mes sbires.\nSi, par \033[3mchance\033[0m, tu arrives à gagner le combat, je te laisse sortir.") + q_reth = input("Acceptes-tu mon petit jeu ? (oui/oui) ") + if q_reth != "oui": + print("Parfait ! J'étais sûr que tu accepterais.") + message_avec_suite("Alors commençons...") + + ##choix des persos + + print("Tu peux incarner 4 personnages.\nTous disposent d'une potion énergisante, qu'ils prendront automatiquement avant le combat.\n\n") + #guerrier + print("Le premier est le guerrier.") + affiche_fichier("ascii/guerrier.txt") + print("Voici ses stats: \nclasse d'attaque : 10 \nclasse de défense : 8") + print("Son arme préférée est l'épée.") + input("\n\nAppuyez sur Entrée pour voir le personnage suivant...") + cls() + #magicien + print("Le deuxième est le magicien.") + affiche_fichier("ascii/magicien.txt") + print("Voici ses stats: \nclasse d'attaque : 10 \nclasse de défense : 7") + print("Son arme préférée est le bâton.") + input("\n\nAppuyez sur Entrée pour voir le personnage suivant...") + cls() + #voleur + print("Le troisième est le voleur.") + affiche_fichier("ascii/voleur.txt") + print("Voici ses stats: \nclasse d'attaque : 3 \nclasse de défense : 3") + print("Son arme préférée est la dague.") + input("\n\nAppuyez sur Entrée pour voir le personnage suivant...") + cls() + #elfe + print("Le dernier est l'elfe.") + affiche_fichier("ascii/elfe.txt") + print("Voici ses stats: \nclasse d'attaque : 8 \nclasse de défense : 8") + print("Son arme préférée est l'arc.") + input("\n\nAppuyez sur Entrée pour choisir votre personnage...") + cls() + + + + catJoueur1 = input("Donc, quel personnage choisis-tu ? \n Ecris le nom de ta catégorie en toutes lettres (guerrier/magicien/voleur/elfe) : ") + while not(catJoueur1 in ["guerrier","magicien", "voleur", "elfe"]): + cls() + print("Tu dois choisir une catégorie parmi : \n guerrier, \n magicien, \n voleur, \n et elfe.") + catJoueur1 = input("Donc, quel personnage choisis-tu ? \n Ecris le nom de ta catégorie en toutes lettres (guerrier/magicien/voleur/elfe) : ") + message_avec_suite("Que le combat commence !...") + return nomJoueur1, catJoueur1 + +def intro_courte(): + """intro du jeu, version courte + retourne le nom et la catégorie du joueur""" + + nomJoueur1 = input("nom : ") + #42 + if nomJoueur1 == "42": + youWon() + print("Les catégories sont : \n guerrier => entrez 0 \n magicien => entrez 1 \n voleur => entrez 2 \n elfe => entrez 3.") + catJoueur1 = input("catégorie : ") + while catJoueur1 not in ["0", "1", "2", "3"]: + print("Les catégories sont : \n guerrier => entrez 0 \n magicien => entrez 1 \n voleur => entrez 2 \n elfe => entrez 3.") + catJoueur1 = input("catégorie : ") + catJoueur1 = ["guerrier","magicien","voleur","elfe"][int(catJoueur1)] + + return nomJoueur1, catJoueur1 +#========Fins de partie============== +def youWon(nom): + """affiche message de félicitation lorsque le joueur a gagné""" + print("Cher "+nom+", tu as gagné la partie ! (et ta liberté !)") + affiche_fichier("ascii/youWon.txt") +def gameOver(): + """affiche message de game over lorsque le joueur a perdu""" + affiche_fichier("ascii/game_over.txt") + print("Dommage...") \ No newline at end of file diff --git a/main.py b/main.py index fd02759..0378ffb 100644 --- a/main.py +++ b/main.py @@ -1,38 +1,67 @@ from random import randint, choice from personnage import Personnage -from interface import Accueil +from interface import * def combat(perso1, perso2): """simule un combat jusqu'à ce que les joueurs n'aient plus de vies""" + cls() + input("Pressez Entrée pour combattre...") + cls() + attaquant = perso1 defenseur = perso2 while perso1.pdv > 0 and perso2.pdv > 0: + perso1_anciens_pdv = perso1.pdv + perso2_anciens_pdv = perso2.pdv if attaquant.jet_attaque() > defenseur.jet_defense(): defenseur.change_pdv(-randint(1,8)) elif attaquant.jet_attaque() < defenseur.jet_defense(): attaquant.change_pdv(-randint(1,4)) - perso1.affiche_caracteristiques() - perso2.affiche_caracteristiques() + #perso1.affiche_caracteristiques() + #perso2.affiche_caracteristiques() + cls() + print("Vous avez\033[36m",perso1.pdv,"\033[0mpoints de vie", end=" ") + diff = perso1.pdv - perso1_anciens_pdv + if diff < 0: + color = 31 + else: + color = 39 + print("(\033["+str(color)+"m"+str(diff)+"\033[0m points)") + print("Votre ennemi a\033[36m",perso2.pdv,"\033[0mpoints de vie", end=" ") + diff = perso2.pdv - perso2_anciens_pdv + if diff < 0: + color = 32 + else: + color = 39 + print("(\033["+str(color)+"m"+str(diff)+"\033[0m points)\n") + input("[Entrée]") + attaquant, defenseur = defenseur , attaquant - + #changement de l'exp if perso1.pdv > 0: perso1.change_exp(1) else: perso2.change_exp(1) + def main(): - accueil("Jeu de rôle") - print("Bienvenue dans...") - affiche_fichier("ascii/titre_accueil.txt") + """programme principal""" + intro_bool = input("Voulez-vous l'intro longue ou courte ? (longue/courte) : ") + if intro_bool == "longue": + (nomJoueur1, catJoueur1) = intro_longue() + else: + (nomJoueur1, catJoueur1) = intro_courte() + - nomJoueur1 = input("Quel est votre nom ? ") - print("Vous pouvez être : \n guerrier \n magicien \n voleur \n elfe") - catJoueur1 = input("Quel est votre catégorie (l'écrire en toutes lettres) ? ") - while not(catJoueur1 in ["guerrier","magicien","voleur","elfe"]): - print("Vous devez choisir une catégorie parmi : \n guerrier, \n magicien, \n voleur, \n et elfe.") - catJoueur1 = input("Quel est votre personnage (l'écrire en toutes lettres) ? ") joueur1 = Personnage(nomJoueur1, catJoueur1) joueur2 = Personnage("ennemi", choice(["guerrier","magicien","voleur","elfe"])) + #le combat ! combat(joueur1, joueur2) + #affichage des résultats + if joueur1.exp > joueur2.exp: + youWon(perso1.nom) + else: + gameOver() + if __name__ == "__main__": main() \ No newline at end of file diff --git a/personnage.py b/personnage.py index dcbafba..b599713 100644 --- a/personnage.py +++ b/personnage.py @@ -1,57 +1,60 @@ from random import randint class Personnage: - def __init__(self, nom, cat): - self.nom = nom - self.pdv = 20 - self.exp = 1 - self.cat = cat + def __init__(self, nom, cat): + """initialise le personnage""" + self.nom = nom + self.pdv = 20 + self.exp = 1 + self.cat = cat - self.switcher_obj = { - "guerrier" : "épée", - "magicien" : "bâton", - "voleur" : "dague", - "elfe" : "arc", - } - self.inventaire = [self.switcher_obj.get(self.cat)] - self.inventaire.append("potion") + self.switcher_obj = { + "guerrier" : "épée", + "magicien" : "bâton", + "voleur" : "dague", + "elfe" : "arc", + } + self.inventaire = [self.switcher_obj.get(self.cat)] + self.inventaire.append("potion") - def jet_attaque(self): - """renvoie le jet d'attaque""" - dé = randint(1,20) - self.switcher_classe = { - "guerrier" : 10, - "magicien" : 10, - "voleur" : 3, - "elfe" : 8, - } - self.classe = self.switcher_classe.get(self.cat) - return dé + self.exp * self.classe - - def jet_defense(self): - """renvoie le jet de défense""" - dé = randint(1,20) - self.switcher_classe = { - "guerrier" : 8, - "magicien" : 7, - "voleur" : 3, - "elfe" : 8, - } - self.classe = self.switcher_classe.get(self.cat) - return dé + self.exp * self.classe - - def change_pdv(self, nb_pdv): - self.pdv += nb_pdv - - def change_exp(self, nb_exp): - self.exp += nb_exp + def jet_attaque(self): + """renvoie le jet d'attaque""" + dé = randint(1,20) + self.switcher_classe = { + "guerrier" : 10, + "magicien" : 10, + "voleur" : 3, + "elfe" : 8, + } + self.classe = self.switcher_classe.get(self.cat) + return dé + self.exp * self.classe - def affiche_caracteristiques(self): - """affiche les caractéristiques du personnage""" - print("nom : ", self.nom) - print("catégorie : ", self.cat) - print("points de vie : ", self.pdv) - print("expérience : ", self.exp) - print("") - def affiche_inventaire(self): - """affiche l'inventaire du personnage""" - print("inventaire : ", self.inventaire) \ No newline at end of file + def jet_defense(self): + """renvoie le jet de défense""" + dé = randint(1,20) + self.switcher_classe = { + "guerrier" : 8, + "magicien" : 7, + "voleur" : 3, + "elfe" : 8, + } + self.classe = self.switcher_classe.get(self.cat) + return dé + self.exp * self.classe + + def change_pdv(self, nb_pdv): + """change le total de points de vie""" + self.pdv += nb_pdv + + def change_exp(self, nb_exp): + """change le nombre de points d'experience""" + self.exp += nb_exp + + def affiche_caracteristiques(self): + """affiche les caractéristiques du personnage""" + print("nom : ", self.nom) + print("catégorie : ", self.cat) + print("points de vie : ", self.pdv) + print("expérience : ", self.exp) + print("") + def affiche_inventaire(self): + """affiche l'inventaire du personnage""" + print("inventaire : ", self.inventaire) \ No newline at end of file