Pendu::py
Aller à la navigation
Aller à la recherche
| Fiche express | |
|---|---|
| Domaine | Projet complet — jeu du pendu |
| Modules | os, pickle, random
|
| Voir aussi | Zcasino::py · Systeme::py |
Pendu::py est un projet complet illustrant l'organisation d'un programme Python en plusieurs fichiers : les données (donnees.py), les fonctions (fonctions.py) et le programme principal (pendu.py). Il gère la persistance des scores via pickle.
donnees.py
nb_coups = 8
nom_fichier_scores = "scores"
liste_mots = [
"armoire",
"boucle",
"buisson",
"bureau",
"chaise",
"carton",
"couteau",
"fichier",
"garage",
"glace"
]
fonctions.py
# -*- coding:Latin-1 -*-
import os
import pickle
from random import choice
from donnees import *
def recup_scores():
if os.path.exists(nom_fichier_scores):
fichier_scores = open(nom_fichier_scores, "rb")
mon_depickler = pickle.Unpickler(fichier_scores)
scores = mon_depickler.load()
fichier_scores.close()
else:
scores = {}
return scores
def enregistrer_scores(scores):
fichier_scores = open(nom_fichier_scores, "wb")
mon_pickler = pickle.Pickler(fichier_scores)
mon_pickler.dump(scores)
fichier_scores.close()
def recup_nom_utilisateur():
nom_utilisateur = input("Tapez votre nom: ")
nom_utilisateur = nom_utilisateur.capitalize()
if not nom_utilisateur.isalnum() or len(nom_utilisateur) < 4:
print("Ce nom est invalide")
return recup_nom_utilisateur()
else:
return nom_utilisateur
def recup_lettre():
lettre = input("Tapez une lettre: ")
lettre = lettre.lower()
if len(lettre) > 1 or not lettre.isalpha():
print("Vous n'avez pas saisi une lettre valide")
return recup_lettre()
else:
return lettre
# fonction du jeu
def choisir_mot():
return choice(liste_mots)
def recup_mot_masque(mot_complet, lettres_trouvees):
# renvoie un mot en tout ou partie masqué
mot_masque = ""
for lettre in mot_complet:
if lettre in lettres_trouvees:
mot_masque += lettre
else:
mot_masque += "*"
return mot_masque
pendu.py
# -*- coding:Latin-1 -*-
from donnees import *
from fonctions import *
scores = recup_scores()
utilisateur = recup_nom_utilisateur()
if utilisateur not in scores.keys():
scores[utilisateur] = 0
continuer_partie = 'o'
while continuer_partie != 'n':
print("joueur {0}: {1} point(s)".format(utilisateur, scores[utilisateur]))
mot_a_trouver = choisir_mot()
lettres_trouvees = []
mot_trouve = recup_mot_masque(mot_a_trouver, lettres_trouvees)
nb_chances = nb_coups
while mot_a_trouver != mot_trouve and nb_chances > 0:
print("Mot à trouver {0} (encore {1} chances)".format(mot_trouve, nb_chances))
lettre = recup_lettre()
if lettre in lettres_trouvees:
print("Vous avez déjà choisi cette lettre")
elif lettre in mot_a_trouver:
lettres_trouvees.append(lettre)
print("Bien joué")
else:
nb_chances -= 1
print("... non, cette lettre ne se trouve pas dans le mot...")
mot_trouve = recup_mot_masque(mot_a_trouver, lettres_trouvees)
if mot_a_trouver == mot_trouve:
print("Félicitations ! Vous avez trouvé le mot {0}".format(mot_a_trouver))
else:
print("Pendu ! Vous avez perdu")
scores[utilisateur] += nb_chances
continuer_partie = input("Souhaitez-vous continuer la partie (o/n) ? ")
enregistrer_scores(scores)
print("Vous finissez la partie avec {0} points".format(scores[utilisateur]))
Corrections apportées : le fichier de scores est désormais ouvert en écriture ("wb") dans enregistrer_scores ; la casse de la variable continuer_partie a été harmonisée (elle était mélangée avec Continuer_partie) ; l'appel à recup_mot_masque est déplacé hors du else pour rafraîchir l'affichage à chaque tour.
Voir aussi
- Zcasino::py — autre mini-jeu en console
- Systeme::py — entrées/sorties et flux standard