Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le pendu corrigé du tp fonctionne pas

Sujet résolu
    17 janvier 2018 à 14:17:42

    Bonjour,

    Je suis parti voir le corrigé du tp pendu après avoir fini le mien, et celui de la correction ne fonctionne pas, pouvez vous me dire pourquoi ?

    Voilà le code :

    donnees.py
    """Ce fichier définit quelques données, sous la forme de variables,
    utiles au programme pendu"""
    
    # Nombre de coups par partie
    nb_coups = 8
    
    # Nom du fichier stockant les scores
    nom_fichier_scores = "scores"
    
    # Liste des mots du pendu
    liste_mots = [
        "armoire",
        "boucle",
        "buisson",
        "bureau",
        "chaise",
        "carton",
        "couteau",
        "fichier",
        "garage",
        "glace",
        "journal",
        "kiwi",
        "lampe",
        "liste",
        "montagne",
        "remise",
        "sandale",
        "taxi",
        "vampire",
        "volant",
    ]
    fonctions.py
    """Ce fichier définit des fonctions utiles pour le programme pendu.
    
    On utilise les données du programme contenues dans donnees.py"""
    
    import os
    import pickle
    from random import choice
    
    from donnees import *
    
    # Gestion des scores
    
    def recup_scores():
        """Cette fonction récupère les scores enregistrés si le fichier existe.
        Dans tous les cas, on renvoie un dictionnaire, 
        soit l'objet dépicklé,
        soit un dictionnaire vide.
    
        On s'appuie sur nom_fichier_scores défini dans donnees.py"""
        
        if os.path.exists(nom_fichier_scores): # Le fichier existe
            # On le récupère
            fichier_scores = open(nom_fichier_scores, "rb")
            mon_depickler = pickle.Unpickler(fichier_scores)
            scores = mon_depickler.load()
            fichier_scores.close()
        else: # Le fichier n'existe pas
            scores = {}
        return scores
    
    def enregistrer_scores(scores):
        """Cette fonction se charge d'enregistrer les scores dans le fichier
        nom_fichier_scores. Elle reçoit en paramètre le dictionnaire des scores
        à enregistrer"""
    
        fichier_scores = open(nom_fichier_scores, "wb") # On écrase les anciens scores
        mon_pickler = pickle.Pickler(fichier_scores)
        mon_pickler.dump(scores)
        fichier_scores.close()
    
    # Fonctions gérant les éléments saisis par l'utilisateur
    
    def recup_nom_utilisateur():
        """Fonction chargée de récupérer le nom de l'utilisateur.
        Le nom de l'utilisateur doit être composé de 4 caractères minimum,
        chiffres et lettres exclusivement.
    
        Si ce nom n'est pas valide, on appelle récursivement la fonction
        pour en obtenir un nouveau"""
    
        nom_utilisateur = input("Tapez votre nom: ")
        # On met la première lettre en majuscule et les autres en minuscules
        nom_utilisateur = nom_utilisateur.capitalize()
        if not nom_utilisateur.isalnum() or len(nom_utilisateur)<4:
            print("Ce nom est invalide.")
            # On appelle de nouveau la fonction pour avoir un autre nom
            return recup_nom_utilisateur()
        else:
            return nom_utilisateur
    
    def recup_lettre():
    """Cette fonction récupère une lettre saisie par
        l'utilisateur. Si la chaîne récupérée n'est pas une lettre,
        on appelle récursivement la fonction jusqu'à obtenir une 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
    
    # Fonctions du jeu de pendu
    
    def choisir_mot():
        """Cette fonction renvoie le mot choisi dans la liste des mots
        liste_mots.
    
        On utilise la fonction choice du module random (voir l'aide)."""
        
        return choice(liste_mots)
    
    def recup_mot_masque(mot_complet, lettres_trouvees):
        """Cette fonction renvoie un mot masqué tout ou en partie, en fonction :
        - du mot d'origine (type str)
        - des lettres déjà trouvées (type list)
    
        On renvoie le mot d'origine avec des * remplaçant les lettres que l'on
        n'a pas encore trouvées."""
        
        mot_masque = ""
        for lettre in mot_complet:
            if lettre in lettres_trouvees:
                mot_masque += lettre
            else:
                mot_masque += "*"
        return mot_masque
    pendu.py
    """Ce fichier contient le jeu du pendu.
    
    Il s'appuie sur les fichiers :
    - donnees.py
    - fonctions.py"""
    
    
    from donnees import *
    from fonctions import *
    
    # On récupère les scores de la partie
    scores = recup_scores()
    
    # On récupère un nom d'utilisateur
    utilisateur = recup_nom_utilisateur()
    
    # Si l'utilisateur n'a pas encore de score, on l'ajoute
    if utilisateur not in scores.keys():
        scores[utilisateur] = 0 # 0 point pour commencer
    
    # Notre variable pour savoir quand arrêter la partie
    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: # La lettre a déjà été choisie
                print("Vous avez déjà choisi cette lettre.")
            elif lettre in mot_a_trouver: # La lettre est dans le mot à 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)
    
        # A-t-on trouvé le mot ou nos chances sont-elles épuisées ?
        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.")
    
        # On met à jour le score de l'utilisateur
        scores[utilisateur] += nb_chances
    
        continuer_partie = input("Souhaitez-vous continuer la partie (O/N) ?")
        continuer_partie = continuer_partie.lower()
    
    # La partie est finie, on enregistre les scores
    enregistrer_scores(scores)
    
    # On affiche les scores de l'utilisateur
    print("Vous finissez la partie avec {0} points.".format(scores[utilisateur]))



    J'ai modifié cette ligne :

    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.")

    car il y avait un problème d'indentation au niveau du print et du else: mais le programme plante toujours


    • Partager sur Facebook
    • Partager sur Twitter
      17 janvier 2018 à 14:38:58

      Le script fonctionne. Penses à donner ta version de python et l'erreur indiquée.
      • Partager sur Facebook
      • Partager sur Twitter
        17 janvier 2018 à 15:46:10

        Je suis sur python 3.6

        Pour l'erreur 

        -
        Edité par BastienPortigo 17 janvier 2018 à 15:48:28

        • Partager sur Facebook
        • Partager sur Twitter
          17 janvier 2018 à 16:36:00

          As-tu bien copié l'ensemble du fichier, en particulier cette ligne ?

          # Si l'utilisateur n'a pas encore de score, on l'ajoute
          if utilisateur not in scores.keys():
              scores[utilisateur] = 0 # 0 point pour commencer



          -
          Edité par Jevanni 17 janvier 2018 à 16:36:10

          • Partager sur Facebook
          • Partager sur Twitter
            17 janvier 2018 à 17:45:43

            Jevanni a écrit:

            As-tu bien copié l'ensemble du fichier, en particulier cette ligne ?

            # Si l'utilisateur n'a pas encore de score, on l'ajoute
            if utilisateur not in scores.keys():
                scores[utilisateur] = 0 # 0 point pour commencer



            -
            Edité par Jevanni il y a environ 1 heure


            Oui
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              17 janvier 2018 à 19:12:30

              Il manque une parenthèse fermante à la ligne spécifiée comme erreur.
              • Partager sur Facebook
              • Partager sur Twitter
                18 janvier 2018 à 9:19:34

                oldProgrammer a écrit:

                Il manque une parenthèse fermante à la ligne spécifiée comme erreur.


                Où, j'ai bien regardé et je ne vois pas

                Edit : J'ai retiré la ligne de code en question qui fait bug mon programme, et là ça fonctionne, c'est bien cette ligne qui a un problème ... Tu es sûr que ça fonctionne chez toi même avec cette ligne ? o____o

                J'ajoute aussi qu'il y a des morceaux de code mal fait j'ai l'impression, j'ai essayé le programme et des bouts de code ne fonctionne pas forcement (même s'ils ne font pas planter le programme)

                -
                Edité par BastienPortigo 18 janvier 2018 à 11:25:19

                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  18 janvier 2018 à 15:08:20

                  Non j'ai mal vu, ton code est bien fonctionnel, en tout cas celui que tu présentes... Dans ton message d'erreur tu as sans doute dû mettre un o au lieu d'un 0.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le pendu corrigé du tp fonctionne pas

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown