Pendu::py

De wiki.nexiat.fr
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