Discussions

Voici ma solution

Image

Bonjour à toutes et à tous,

 

Voici ma solution :

 

J'ai une approche un peu différente concernant le déroulement du jeu.

Le plus compliqué pour moi, c'est le début : mettre sur papier comment le programme doit se dérouler.

 

Pour mettre un peu de couleur dans le jeu : j'ai utiliser le module -> rich. Il est très complet, simple et intuitif et cerise sur le gateau, la doc est en français.

Voici le lien : https://github.com/textualize/rich/blob/master/README.fr.md

 

J'ai essayer de faire un programme simple, maintenable en séparant les fonctions, visuels et programme principal. j'ai aussi typer mes variables et utiliser les anotations de types + documenter les fonctions.

 

Qu'en dites-vous ?

 

PS : comme d'hab, je code avec Pycharm

 

Merci

 

 

main.py

from fonctions import *
from rich.console import Console
from ascii import *

console = Console() # instance pour le module rich

recommencer: str = "o"

while recommencer == "o":
vies: int = 6
lettre_entree: list = []

console.print(f"{logo}", style="red")

# appel de la fonction qui génère un mot aléatoire d'une liste de x mots unique
mots_aleatoire = generer_mots_aleatoire(300)

print("Trouve le mot !\n")

# appel de la fonction pour cacher le mot → retourne le mot masquer dans la variable "cacher"
cacher = masquer_mot(mots_aleatoire)

while True:
print(PENDU[vies])
lettre: str = input("Devine une lettre : ").lower()
clear()
print()
afficher_mot_cache(mots_aleatoire, cacher, lettre) # affiche le mot caché (_ _ _ _)

# Si la lettre a déjà été entrée.
if lettre in lettre_entree:
console.print(f"Tu as déjà entrer la lettre : {lettre} ", style="bold blue")

# Si la lettre n'est pas dans le mot (on perd une vie).
elif not lettre in mots_aleatoire and not lettre in lettre_entree:
console.print(f"La lettre {lettre} n'est pas dans le mot -> tu perds une vie ", style="bold red")
vies -= 1
if vies == 0:
print(f"Tu as perdu, le mot était : {mots_aleatoire}")
break

# Si la lettre est dans le mot (a été trouvée).
else:
console.print(f"Bravo, tu as trouvé la lettre : {lettre}", style="bold green")
if list(mots_aleatoire) == cacher:
print(GAGNER)
break

lettre_entree.append(lettre)

recommencer = input("Veux-tu rejouer ? (o / n) : ")
lettre_entree = [] # vider la liste avant de recommencer à jouer
clear()
if recommencer != "o":
print("Au revoir !")
break

 

 

fonctions.py

from os import system, name  # module pour la fonction clear()
from faker import Faker
from random import choice


def clear():
"""
Fonction pour vider la console
"""
if name == "nt":
_ = system("cls") # pour windows
else:
_ = system("clear") # pour mac et linux


def generer_mots_aleatoire(nombre_de_mots: int) -> str:
"""
Fonction qui génère un mot aléatoire d'une liste de x mots uniques
:param nombre_de_mots : combien de mots on veut générer
:return un mot tirer au sort dans la liste
"""
fake = Faker("fr_FR")
mots = []
for _ in range(nombre_de_mots):
mots.append(fake.unique.word())
mot_aleatoire = choice(mots)
return mot_aleatoire


def masquer_mot(mot_a_masquer: str) -> list:
"""
Fonction qui remplace des lettres par des _
:param mot_a_masquer (le mot que l'on veut masquer)
:return une liste de "_" en fonction de la longueur du mot
"""
mot_cache = []
for _ in mot_a_masquer:
mot_cache += "_"
print(" ".join(mot_cache))
print()
return mot_cache


def afficher_mot_cache(mot_chercher: str, mot_cache: list, lettre: str):
"""
Fonction qui remplace les "_" par les lettres du mot aléatoire si celle-ci sont trouvées
:param mot_chercher: mot_aléatoire
:param mot_cache : fonction -> masquer_mot
:param lettre : lettre a trouvée
:return none
"""
for i in range(len(mot_chercher)):
if mot_chercher[i] == lettre:
mot_cache.pop(i)
mot_cache.insert(i, lettre)
print(" ".join(mot_cache))

 

ascii.py

logo = """                                                

▄▄▄██▀▀▀▓█████ █ ██ ▓█████▄ █ ██ ██▓███ ▓█████ ███▄ █ ▓█████▄ █ ██
▒██ ▓█ ▀ ██ ▓██▒ ▒██▀ ██▌ ██ ▓██▒ ▓██░ ██▒▓█ ▀ ██ ▀█ █ ▒██▀ ██▌ ██ ▓██▒
░██ ▒███ ▓██ ▒██░ ░██ █▌▓██ ▒██░ ▓██░ ██▓▒▒███ ▓██ ▀█ ██▒░██ █▌▓██ ▒██░
▓██▄██▓ ▒▓█ ▄ ▓▓█ ░██░ ░▓█▄ ▌▓▓█ ░██░ ▒██▄█▓▒ ▒▒▓█ ▄ ▓██▒ ▐▌██▒░▓█▄ ▌▓▓█ ░██░
▓███▒ ░▒████▒▒▒█████▓ ░▒████▓ ▒▒█████▓ ▒██▒ ░ ░░▒████▒▒██░ ▓██░░▒████▓ ▒▒█████▓
▒▓▒▒░ ░░ ▒░ ░░▒▓▒ ▒ ▒ ▒▒▓ ▒ ░▒▓▒ ▒ ▒ ▒▓▒░ ░ ░░░ ▒░ ░░ ▒░ ▒ ▒ ▒▒▓ ▒ ░▒▓▒ ▒ ▒
▒ ░▒░ ░ ░ ░░░▒░ ░ ░ ░ ▒ ▒ ░░▒░ ░ ░ ░▒ ░ ░ ░ ░░ ░░ ░ ▒░ ░ ▒ ▒ ░░▒░ ░ ░
░ ░ ░ ░ ░░░ ░ ░ ░ ░ ░ ░░░ ░ ░ ░░ ░ ░ ░ ░ ░ ░ ░ ░░░ ░ ░
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
░ ░

"""

PENDU = [
'''
+---+
| |
O |
/|\ |
/ \ |
|
=========''',

'''
+---+
| |
O |
/|\ |
/ |
|
=========''',

'''
+---+
| |
O |
/|\ |
|
|
=========''',

'''
+---+
| |
O |
/| |
|
|
=========''',

'''
+---+
| |
O |
| |
|
|
=========''',

'''
+---+
| |
O |
|
|
|
=========''',

'''
+---+
| |
|
|
|
|
=========''']


GAGNER = """
__ __ __ __ ___ ___ __ __
/ ` / \ |\ | / _` |__) /\ | | | | /\ | | / \ |\ | /__`
\__, \__/ | \| \__> | \ /~~\ | \__/ |___ /~~\ | | \__/ | \| .__/
"""

 

 

 

 

 

 

3 réponses
Image
Louis-Nicolas Leuillet
Le 11/11/2022 à 21:53

Bonsoir Vincent.

 

Wow on sent une belle progression, c'est bien vu de séparer les fonctionset d'utilier lkes annotations de type.

 

Je valide totalement tout le projet ;)

Image
Vincent Bothier
Le 11/11/2022 à 23:13

Merci. Mon code n'est pas trop lourd, trop bizarre ?

Image
Louis-Nicolas Leuillet
Le 12/11/2022 à 10:04

Non du tout c'est très bien, la décomposition est parfaite

Image
Inscrivez-vous ou connectez-vous pour participer à la discussion.

Informations

Créée le 11 novembre 2022 14:51
Dernière activité le 11 novembre 2022 14:51