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. et donc je devrai faire en sorte non pas de relancer la fonction à chaque fois, mais quelle tourne jusqu'au résultat souhaité ?
    1. 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. 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?
      2. 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"?
      3. 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 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?
        2. 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.
        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. 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.
        5. # 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?