Pendu python

Bonjour,
J'ai un problème de python, comme tout bon débutant je fais un jeu du pendu mais j'ai quelques problèmes :
Tout d'abord quand on lance mon programme :
1- La fonction "vie" marche parfaitement, elle demande le niveau souhaiter et s'actualise en fonction,
2- Quand on nous demande d'entrer une lettre et qu'on la rentre par exemple "a" avec le mot "clavier", et bien sa met "--a----", donc sa marche mais ensuite il y a deux cas de figures (qui sont tout les deux des problèmes):
a) Donc on rentre une deuxième lettre qui EST dans le mot, par exemple "c", le code va mettre "c------" et supprimer le "a".
b) Deuxième cas de figure on rentre une lettre qui N'EST PAS dans le mot par exemple "z" , le code va mettre "-------" et supprimer le mot d'avant .
3- lorsque on met une mauvaise lettre, il affiche une diminution de trois unité sur le score au lieu d'une, comme si la fonction tourné trois fois ???? , alors pour l'instant j'ai rajouter un " + 3".

Désolé pour ce gros pavé et merci de m'orienté.
(Essayer de lancer le programme pour voir les problèmes)

# debut du jeu

from random import randint
def liste_mots():
liste=["nsi","math","ordinateur"]
return liste

def difficulte():
vie = 12
v = 0
while v != 1 and v != 2 and v != 3:
v = int(input("quelle niveau : 1,2 ou 3 ?"))
if v == 1:
vie=12
print('niveau 1 ->',vie,'vie')
elif v == 2:
vie=6
print('niveau 2 ->', vie, 'vies')
elif v == 3:
vie = 3
print('niveau 3 ->', vie, 'vies')
return vie

#Mot de départ avec tiret

def tiret_mot(mot):
n = len(mot)
res=''
for i in range (n):
res = res + "-"
return res

#Tirage du mot

def choix_mot(liste):
return (liste[randint(0,len(liste)-1)])

def tour_de_jeu(lettre, mot_a_tir, mot_initial,score):
mot_a_tir = ""
while score > 0:
for i in mot_initial:
if i in lettre:
mot_a_tir = mot_a_tir + lettre
else:
mot_a_tir = mot_a_tir + "-"
score = score -1
print("il vous restes",score + 3,"vies")
return mot_a_tir

# fonction jeu :

def jeu():
mot_a_trouver = choix_mot(liste_mots())
score = difficulte()
mot_a_tiret = tiret_mot(mot_a_trouver)
while score > 0:
lettre = input("proposez une lettre :")
print(tour_de_jeu(lettre,mot_a_tiret,mot_a_trouver,score))
if score == 0 and mot_a_tiret != mot_a_trouver:
print("perdu !")
elif score >= 0 and mot_a_tiret == mot_a_trouver:
print("Bien joué !")

print(jeu())

13 réponses

  1. # debut du jeu
    
    from random import randint
    
    #C est la liste de mot qu on établie
    
    def liste_mots():
        liste=["nsi","math","ordinateur"]
        return liste
    #print(liste_mots())
    
    
    #C est la fonction qui demande le niveau souhaité(donc le nombre de vies), et qui établie le #nombre de vies en fonction de la réponse
    
    def difficulte():
        vie = 12
        v = 0
        while v != 1 and v != 2 and v != 3:
            v = int(input("quelle niveau : 1,2 ou 3 ?"))
        if v == 1:
            vie=12
            print('niveau 1 ->',vie,'vie')
        elif v == 2:
            vie=6
            print('niveau 2 ->', vie, 'vies')
        elif v == 3:
            vie = 3
            print('niveau 3 ->', vie, 'vies')
        return vie
    #print(difficulte())
    
    
    
    #cette fonction transforme le mot choisie dans la liste en mot a tiret 
    
    def tiret_mot(mot):
        n = len(mot)
        res=''
        for i in range (n):
            res = res + "-"
        return res
    #print(tiret_mot())
    
    
    #cette fonction tire un mot au hasard un mot dans la liste
    
    def choix_mot(liste):
        return (liste[randint(0,len(liste)-1)])
    #print(choix_mot())
    
    
    #Cette fonction prend l état du jeu à un moment donné et renvoie
    # - le nouveau nombre de vies
    # - le nouveau mot à tiret (éventuellement modifié si l on a trouvé une nouvelle lettre)
    #-Et le nouveau score ( en principe )
    
    def tour_de_jeu(lettre, mot_a_tir, mot_initial,score):
        mot_a_tir = ""
        while score > 0:
            for i in mot_initial:
                if i in lettre:
                    mot_a_tir = mot_a_tir + lettre
                else:
                    mot_a_tir = mot_a_tir + "-"
                    score = score -1
            print("il vous restes",score + 3,"vies")
            return mot_a_tir
    #print(tour_de_jeu("a",----,"jean",10))
    
    
    #C est la fonction principal, c est la ou on va demander une lettre à l utilisateur, et ou on va mettre la fonction tour_de_jeu.
    
    def jeu():
        mot_a_trouver = choix_mot(liste_mots())
        score = difficulte()
        mot_a_tiret = tiret_mot(mot_a_trouver)
        while score > 0:
            lettre = input("proposez une lettre :")
            print(tour_de_jeu(lettre,mot_a_tiret,mot_a_trouver,score))
            if score == 0 and mot_a_tiret != mot_a_trouver:
                print("perdu !")
            elif score >= 0 and mot_a_tiret == mot_a_trouver:
                print("Bien joué !")
    
    print(jeu())
    1. Contributeur
      as-tu ajouté assez de print() pour comprendre ce qui se passe?
  2. oui oui je comprend très bien ce qui ce passe,
    le problème c'est vraiment ce que j'ai expliqué au début
    1. Contributeur
      Ajoute des print() pour comprendre pourquoi ton code ne fait pas ce que tu imagines qu'il devrait faire.
  3. à chaque ligne tu veux dire parce que j'ai essayé déjà pour chaque fonction mais sa m'avance pas beaucoup.
    1. Contributeur
      suffisamment pour que tu comprennes ce qui ne marche pas.

      à ton avis que fait ce programme?
      def ajoutun(x):
          x=x+1
          print(x)
      x=0
      ajoutun(x)
      ajoutun(x)
      ajoutun(x)
  4. ah non effectivement ça print :

    1
    1
    1
    1

    et donc de quel fonction est liée ce problèmes ?
    1. Contributeur
      ajoute des print() pour comprendre le comportement de ce petit programme.
  5. j'ai un peu modifié le programme.

    # debut du jeu
    
    from random import randint
    
    #C'est la liste de mot qu on établie
    
    def liste_mots():
        liste=["nsi","math","ordinateur"]
        return liste
    #print(liste_mots())
    
    
    #C'est la fonction qui demande le niveau souhaité(donc le nombre de vies), et qui établie le nombre de vies en fonction de la réponse
    
    def difficulte():
        vie = 12
        v = 0
        while v != 1 and v != 2 and v != 3:
            v = int(input("quelle niveau : 1,2 ou 3 ?"))
        if v == 1:
            vie=12
            print('niveau 1 ->',vie,'vie')
        elif v == 2:
            vie=6
            print('niveau 2 ->', vie, 'vies')
        elif v == 3:
            vie = 3
            print('niveau 3 ->', vie, 'vies')
        return vie
    #print(difficulte())
    
    
    
    #cette fonction transforme le mot choisie dans la liste en mot a tiret
    
    def tiret_mot(mot):
        n = len(mot)
        res=''
        for i in range (n):
            res = res + "-"
        return res
    #print(tiret_mot())
    
    
    #cette fonction tire un mot au hasard un mot dans la liste
    
    def choix_mot(liste):
        return (liste[randint(0,len(liste)-1)])
    #print(choix_mot())
    
    
    #Cette fonction prend l'état du jeu à un moment donné et renvoie
    # - le nouveau nombre de vies
    # - le nouveau mot à tiret (éventuellement modifié si l'on a trouvé une nouvelle lettre)
    #-Et le nouveau score ( en principe )
    
    def tour_de_jeu(lettre, mot_a_tir, mot_initial,score):
        mot_a_tir = ""
        for i in mot_initial:
            if i in lettre:
                mot_a_tir = mot_a_tir + lettre
                print("il vous restes", score, "vies")
                return mot_a_tir
            else:
                mot_a_tir = mot_a_tir + "-"
                score = score -1
                print("il vous restes",score,"vies")
                return mot_a_tir
    #print(tour_de_jeu("a",----,"jean",10))
    
    
    #C'est la fonction principal, c'est la ou on va demander une lettre à l'utilisateur, et ou on va mettre la fonction tour_de_jeu.
    
    def jeu():
        mot_a_trouver = choix_mot(liste_mots())
        score = difficulte()
        mot_a_tiret = tiret_mot(mot_a_trouver)
        while score > 0:
            lettre = input("proposez une lettre :")
            print(tour_de_jeu(lettre,mot_a_tiret,mot_a_trouver,score))
        if score == 0 and mot_a_tiret != mot_a_trouver:
            print("perdu !")
        elif score >= 0 and mot_a_tiret == mot_a_trouver:
            print("Bien joué !")
    
    print(jeu())
    
    1. Contributeur
      tout fonctionne bien maintenant?
  6. et bien non j'ai toujours le problème au niveau de la fonction tour_de_jeu

    je l'ai extrait du programme pour la modifier plus facilement et pour avoir un meilleur angle de vue mais je n'arrive toujours pas à cerner le problème.
    J'ai déjà essayer de changer les indentations...ect rien à faire avec mes connaissances.
    Je pense qu'il faudrait créé une boucle dans la fonction tour_de_jeu ????

    def tour_de_jeu(lettre, mot_a_tir, mot_initial,score):
        while score > 0:
            for i in mot_initial:
                if i in lettre:
                    mot_a_tir = mot_a_tir + lettre
                    print("il vous restes", score, "vies")
                    return mot_a_tir
                else:
                    mot_a_tir = mot_a_tir + "-"
                    score = score -1
                    print("il vous restes",score,"vies")
                    return mot_a_tir
    1. J'ai résolu mon problèmes, mais j'ai encore un problème avec cette fonction qui se réinitialise à chaque tours :

      def tour_de_jeu(lettre,mot_a_tir,mot_initial,score):
          new_mot = ""
          trouve = False
          for i in range(len(mot_initial)):
              if mot_initial[i]==lettre:
                  new_mot=new_mot+lettre
                  trouve = True
              else:
                  new_mot = new_mot + mot_a_tir[i]
          if not(trouve):
              score = score -1
          print(new_mot,"il vous reste",score,"vies")
          return ""
      
      #print(tour_de_jeu("a","----","Jean",4))
      1. Contributeur
        "qui se réinitialise"?
    2. Dès que l'on redemande une lettre, le mot et le score se réinitialise oui
      1. Contributeur
        as-tu suivi ma suggestion en #15? comprends-tu le soucis avec le petit programme que je t'ai suggéré d'analyser et de corriger?
    3. Ah d'accord donc enfaite quand ma fonction se lance puis se relance elle ne peut pas prendre en argument les modifications faites la première fois c'est ça ?
      1. et donc je devrai faire en sorte non pas de relancer la fonction à chaque fois, mais quelle tourne jusqu'au résultat souhaité ?