Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon pendu

    20 juillet 2010 à 13:48:18

    Salut à tous, j'aimerais avoir votre avis sur mon pendu, notamment plus sur le code que sur l'aspect.
    En effet je n'affiche pas en gros "rentrez une lettre" etc...
    Je veux avoir votre avis sur la façon dont je traite le problème.

    Le code :
    # Pendu
    
    def gagne(m_str):
        for i in m_str:
            if i == '_':
                return 0
        return 1
    
    
    def affiche(m_str, c, t):
        i = 0
        while i < len(m_str):
            if m_str[i] == c:
                t[i] = c
                
            i += 1
            
        print(' '.join(t))
        
        return t
    
    
    m_secret = "canard"
    c = input()
    t = ['_' for i in m_secret]
    
    while gagne(t) == 0:    
        affiche(m_secret, c, t)
        c = input()
    
    print("Félicitation vous avez gagnez, le mot était %s" %(''.join(t).upper()))
    


    Merci à vous,
    • Partager sur Facebook
    • Partager sur Twitter
      20 juillet 2010 à 14:13:35

      Salut,
      c'est pas mal mais tu peux encore simplifier.
      Ta fonction gagne(m_str) peut se résumer par '_' not in m_str .
      La boucle while me fait penser à du C, utilise plutôt la fonction enumerate() :
      >>> for index, char in enumerate("bonjour"):
      ...     print "%d: %c" % (index, char)
      ... 
      0: b
      1: o
      2: n
      3: j
      4: o
      5: u
      6: r
      
      • Partager sur Facebook
      • Partager sur Twitter
        20 juillet 2010 à 14:15:38

        Juste une remarque (en termes de coding-style) :

        En Python, on aime les noms de variables explicites : en gros, en dehors d'usages très courants du style 'x,y' pour des coordonnées, les noms de variables à un seul caractère sont à éviter le plus possible (exception faite pour les list comprehensions où l'on voit sur la même ligne la déclaration et l'utilisation de la variable, donc ça passe).

        Sinon, ton code est concis et lisible, pas grand chose à redire.
        • Partager sur Facebook
        • Partager sur Twitter
        Zeste de Savoir, le site qui en a dans le citron !
          20 juillet 2010 à 18:36:24

          Ah oué sympa l'astuce avec if ... not.
          Je savais pas l'utiliser ^^ .

          Ma fonction gagne était aussi très "C".

          Le code deviendrait donc :
          # Pendu
          
          def gagne(m_str):
              return '_' not in m_str
          
          
          def affiche(m_str, c, liste):
              for i, j in enumerate(m_str):
                  if j == c:
                      liste[i] = c            
              print(' '.join(liste))
              return liste
          
          
          m_secret = "canard"
          c = input()
          liste = ['_' for i in m_secret] # le mot où il faut boucher les trous
          
          while gagne(liste) == False:    
              affiche(m_secret, c, liste)
              c = input()
          
          print("Félicitation vous avez gagnez, le mot était %s" %(''.join(liste).upper()))
          
          • Partager sur Facebook
          • Partager sur Twitter
            20 juillet 2010 à 18:57:28

            m_secret = "canard"
            liste = ['_' for i in m_secret] # le mot où il faut boucher les trous
            
            while gagne(liste) == 0:
                c = input()
                affiche(m_secret, c, liste)
            


            Il est plus logique de demander la lettre juste avant la vérification, sinon on se retrouve à la fin à devoir donner une lettre dans le vide, juste pour que la condition s'évalue et que l'on sorte du while.
            • Partager sur Facebook
            • Partager sur Twitter
              20 juillet 2010 à 19:19:28

              Tu peux aussi améliorer le code niveau lisibilité.
              Déjà comme l'a dit NoHaR tes noms ne veulent rien dire et pour quelqu'un qui lit ton code c'est plus dur à comprendre que des noms bien choisis.
              def affiche(m_str, c, liste):
                  for i, j in enumerate(m_str):
                      if j == c:
                          liste[i] = c            
                  print(' '.join(liste))
                  return liste
              

              Ta fonction serait beaucoup plus claire (par exemple) ainsi :
              # déjà elle ne fait pas qu'afficher
              def mise_a_jour(mot_secret, proposition, lettres_connues):
                  # i est assez commun comme nom d'index, ça passe
                  for i, lettre in enumerate(mot_secret):
                      if lettre == proposition:
                          lettres_connues[i] = lettre
                  print(' '.join(liste))
                  #return liste # pourquoi il y a un return ici ?
              

              Ensuite ça : while gagne(liste) == 0: , c'est très moche pour tester un booléen (peut-être que tu n'as juste pas modifié quand tu as changé la fonction gagne()). while not gagne(liste): est beaucoup plus clair.
              Et pour finir je suis pas sûr que tu aies besoin de créer des fonctions pour un petit script comme ça, tu peux tout enchainer. Mais ça c'est toi qui vois.
              • Partager sur Facebook
              • Partager sur Twitter
                20 juillet 2010 à 19:33:29

                Tu m'as fait penser au return tiens. L'appel à affiche était comme ça (j'essayais différents trucs):
                liste = affiche(m_secret, c, liste)
                

                Oui à la base j'ai mis le return pour "actualiser" ma liste que j'ai défini départ.

                Par contre je ne comprends pas pourquoi ça marche sans return...

                @EMC1 : je vois pas trop comment faire...
                • Partager sur Facebook
                • Partager sur Twitter
                  20 juillet 2010 à 19:41:04

                  Citation : Colb-Seton

                  Oui à la base j'ai mis le return pour "actualiser" ma liste que j'ai défini départ.

                  Par contre je ne comprends pas pourquoi ça marche sans return...


                  Tu dois penser que l'objet que traite ta fonction est une copie de celui qui existe dans le contexte principal. En fait non, c'est le même objet : le passage de paramètres à une fonction se fait par référence en Python (contrairement au C, ce qui explique sûrement ton incompréhension). Du coup quand tu modifies l'objet liste dans la fonction, ça le modifie aussi en dehors parce que c'est le même.

                  Citation : Colb-Seton

                  @EMC1 : je vois pas trop comment faire...


                  Bah le code qu'il a mis le fait en fait. :p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 juillet 2010 à 19:49:30

                    Citation : Dentuk

                    Tu dois penser que l'objet que traite ta fonction est une copie de celui qui existe dans le contexte principal. En fait non, c'est le même objet : le passage de paramètres à une fonction se fait par référence en Python (contrairement au C, ce qui explique sûrement ton incompréhension). Du coup quand tu modifies l'objet liste dans la fonction, ça le modifie aussi en dehors parce que c'est le même.


                    Effectivement je ne savais pas. Je prends note merci.

                    Citation : Dentuk

                    @EMC1 : je vois pas trop comment faire...


                    Bah le code qu'il a mis le fait en fait. :p</citation>
                    :-°

                    Pour ce qui est des noms de variables trop courts, ça doit être l'habitude des maths. Néanmoins je pense que "c" pour caractère unique se comprends très bien.
                    Ensuite j'ai appelé ma fonction d'affichage "affiche" car la mise à jour est en fait nécessaire pour l'affichage. Ca depend des points de vue.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 juillet 2010 à 20:44:06

                      edit: nouveau topic plutôt
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 juillet 2010 à 21:26:32

                        Citation : Fayden

                        Je ne veux pas détourner le sujet, mais plutôt qu'en faire un autre traitant d'un sujet aussi trivial, je me permet de poster ici. Si ça dérange l'auteur, je ferai un nouveau topic, pas de problèmes.


                        Peu importe le problème, le forum est là pour ça, fais un nouveau post sinon on va se mélanger dans les réponses.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 juillet 2010 à 1:24:09

                          Il me semble opportun de rappeler qu'un certain Grinwik (qui fréquentait les forums C et Java) avait proposé il y a quelques mois un pendu assez soigné et qui pourrait servir de modèle à une des corrections possibles. Le message est ici : [Python] commentaire sur un Pendu.


                          Pareil, il serait bien d'avoir un ou plutôt plusieurs corrigés modèles avec commentaires et référence au cours du jeu du plus/moins, comme ça au lieu de rediscuter pour la 153896ème fois de comment faire un plus/moins, on renvoie à une correction qu'on sait être fiable, claire et complète. Si j'ai le temps d'ici septembre, j'écrirai quelques versions.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 juillet 2010 à 14:21:16

                            Oui candide, je l'avais déjà vu ce post, à l'époque je débutais vraiment en Python, maintenant je peux le regarder plus en détail ;) .
                            Je post deux versions
                            # Pendu
                            
                            def gagne(m_str):
                                for i in m_str:
                                    if i == '_':
                                        return 0
                                return 1
                            
                            
                            def affiche(m_str, c, liste):
                                i = 0
                                while i < len(m_str):
                                    if m_str[i] == c:
                                        liste[i] = c            
                                    i += 1           
                            
                            m_secret = "canard"
                            liste = ['_' for i in m_secret]
                            
                            while gagne(liste) == 0:
                                c = input(" Quel est le mot ?   %s   " %(' '.join(liste)))
                                affiche(m_secret, c, liste)    
                            
                            print("Félicitation vous avez gagné, le mot était %s" %(''.join(liste).upper()))
                            

                            # Pendu
                            
                            def gagne(m_str):
                                return '_' not in m_str
                            
                            def affiche(m_str, c, liste):
                                for i, j in enumerate(m_str):
                                    if j == c:
                                        liste[i] = c            
                                
                            m_secret = "canard"
                            liste = ['_' for i in m_secret] # le mot où il faut boucher les trous
                            
                            while gagne(liste) == False:
                                c = input(" Quel est le mot ?   %s   " %(' '.join(liste)))
                                affiche(m_secret, c, liste)
                                
                            print("Félicitation vous avez gagné ! Le mot était bien %s" %(''.join(liste).upper()))
                            


                            [EDIT] : Voici une version plus ou moins complète, si y'en a qui passe par là dîtes moi ce que vous en pensez :
                            # Pendu
                            
                            from random import randrange
                            
                            def gagne(m_str):
                                return '_' not in m_str
                            
                            def affiche(m_str, c, liste):
                                for i, j in enumerate(m_str):
                                    if j == c:
                                        liste[i] = c            
                                return c in m_str
                            
                            list_mot = ["canard", "mathematique", "physique", "chimique", "sport", "cheval",
                                        "ordinateur", "programmation", "parole", "anticonstitutionnellement", "pompier", "tennis",
                                        "vapeur", "chat", "chien", "cochon", "nourriture", "alphabet",
                                        "artiste", "langue", "langage", "miroir", "courir", "dejection"
                                        "gaz", "animal", "garage", "herbe", "tondeuse", "insecte",
                                        "limace", "araignée", "arbre", "roseau", "lapine", "roulade",
                                        "chiffre", "nombre", "or", "argent", "metal", "precieux",
                                        "heureux", "stereotype", "architecture", "construire", "maison", "appartement"]
                            
                            lettre_proposee = []
                            cont = 'o'
                            
                            while cont == 'o':
                                m_secret = list_mot[randrange(len(list_mot))] #génère aléatoirement un mot pioché dans la liste du dessus
                                compteur = len(set(m_secret))+2 
                            
                                liste = ['_' for i in m_secret] # le mot où il faut boucher les trous
                            
                                while gagne(liste) == False and compteur > 0:
                                    print("\nLettres proposées : %s" %(' - '.join(lettre_proposee)).upper())
                                    c = input("\nCoups restants : %d \nQuel est le mot ?   %s   " %(compteur, ' '.join(liste)))
                                    
                                    if c in lettre_proposee:
                                        compteur-=1
                                        print("\nLettre déjà proposée ! Coups restants : %d" %compteur)
                                        lettre_proposee += [c]
                                    else:
                                        lettre_proposee += [c]
                                        
                                    if affiche(m_secret, c, liste) == False:
                                        compteur -= 1
                                        print("\nCette lettre n'y est pas ! Coups restants : %d" %compteur)
                                        
                                if compteur == 0:
                                    print("\nPERDU le mot secret était : %s" %(m_secret.upper()))
                                else:  
                                    print("\nFélicitation vous avez gagné ! Le mot était bien %s" %(''.join(liste).upper()))            
                                    
                                cont = input("Rejouer ? o/n ")
                            
                            print("\n\t\t\tAU REVOIR !")
                            
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 juillet 2010 à 10:47:10

                              J'up pour quelques critiques sur le code que j'ai posté en édit (juste au dessus).
                              Merci,
                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 juillet 2010 à 21:10:36

                                Normalement voici la version finale :
                                # Pendu
                                
                                from random import randrange
                                
                                def gagne(m_str):
                                    return '_' not in m_str
                                
                                def affiche(m_str, c, liste):
                                    for i, j in enumerate(m_str):
                                        if j == c:
                                            liste[i] = c            
                                    return c in m_str
                                
                                list_mot = ["canard", "mathematique", "physique", "chimique", "sport", "cheval",
                                            "ordinateur", "programmation", "parole", "anticonstitutionnellement", "pompier", "tennis",
                                            "vapeur", "chat", "chien", "cochon", "nourriture", "alphabet",
                                            "artiste", "langue", "langage", "miroir", "courir", "dejection",
                                            "gaz", "animal", "garage", "herbe", "tondeuse", "insecte",
                                            "limace", "araignée", "arbre", "roseau", "lapine", "roulade",
                                            "chiffre", "nombre", "or", "argent", "metal", "precieux",
                                            "heureux", "stereotype", "architecture", "construire", "maison", "appartement"]
                                
                                cont = 'o'
                                
                                while cont == 'o':
                                    lettre_proposee = []
                                    m_secret = list_mot[randrange(len(list_mot))] #génère aléatoirement un mot pioché dans la liste du dessus
                                    compteur = len(set(m_secret))+2 
                                
                                    liste = ['_' for i in m_secret] # le mot où il faut boucher les trous
                                
                                    while gagne(liste) == False and compteur > 0:
                                        print("\nLettres proposées : %s" %(' - '.join(lettre_proposee)).upper())
                                        c = input("\nCoups restants : %d \nQuel est le mot ?   %s   " %(compteur, ' '.join(liste)))
                                        
                                        if c in lettre_proposee:
                                            print("\nLettre déjà proposée ! Coups restants : %d" %compteur)
                                            lettre_proposee += [c]
                                        else:
                                            lettre_proposee += [c]
                                            
                                        if affiche(m_secret, c, liste) == False:
                                            compteur -= 1
                                            print("\nCette lettre n'y est pas ! Coups restants : %d" %compteur)
                                            
                                    if compteur == 0:
                                        print("\nPERDU le mot secret était : %s" %(m_secret.upper()))
                                    else:  
                                        print("\nFélicitation vous avez gagné ! Le mot était bien %s" %(''.join(liste).upper()))            
                                        
                                    cont = input("Rejouer ? o/n ")
                                
                                print("\n\t\t\tAU REVOIR !")
                                
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  26 juillet 2010 à 22:55:35

                                  if c in lettre_proposee:
                                      print("\nLettre déjà proposée ! Coups restants : %d" %compteur)
                                      lettre_proposee += [c]
                                  else:
                                      lettre_proposee += [c]
                                  

                                  lettre_proposee += [c]
                                  else:
                                      lettre_proposee += [c]
                                  

                                  Y a pas un sushi?
                                  Ou y a pas moyen de faire mieux?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Zeste de Savoir, le site qui en a dans le citron !
                                    26 juillet 2010 à 23:35:01

                                    Mes quelques commentaires :

                                    from random import choice
                                    
                                    def gagne(m_str):
                                        return '_' not in m_str
                                    
                                    def affiche(m_str, c, liste):
                                        cInm = False #On peut éviter de parcourir deux fois m_str de cette façon
                                        for i, j in enumerate(m_str):
                                            if j == c:
                                                liste[i] = c
                                                cInm = True
                                        return cInm 
                                    
                                    list_mot = ["canard", "mathematique", "physique", "chimique", "sport", "cheval",
                                                "ordinateur", "programmation", "parole", "anticonstitutionnellement", "pompier", "tennis",
                                                "vapeur", "chat", "chien", "cochon", "nourriture", "alphabet",
                                                "artiste", "langue", "langage", "miroir", "courir", "dejection",
                                                "gaz", "animal", "garage", "herbe", "tondeuse", "insecte",
                                                "limace", "araignée", "arbre", "roseau", "lapine", "roulade",
                                                "chiffre", "nombre", "or", "argent", "metal", "precieux",
                                                "heureux", "stereotype", "architecture", "construire", "maison", "appartement"]
                                    
                                    cont = 'o'
                                    
                                    while cont == 'o':
                                        lettre_proposee = []
                                        m_secret = choice(list_mot) #choice choisit au hasard un élément de la liste
                                        compteur = len(set(m_secret))+2 
                                    
                                        liste = ['_'] * len(m_secret) # Plus rapide, plus clair et plus naturel quand même
                                    
                                        while compteur > 0 and not gagne(liste): #C'est aussi plus clair avec not
                                             #La permutation améliore les performances, un détail sans valeur ...                               
                                            print("\nLettres proposées : %s" %(' - '.join(lettre_proposee)))
                                             #Mieux vaut quand même introduire les lettres en majuscules dans lettre_proposee
                                            c = input("\nCoups restants : %d \nQuel est le mot ?   %s   " %(compteur, ' '.join(liste)))
                                            
                                            if c in lettre_proposee:
                                                print("\nLettre déjà proposée ! Coups restants : %d" %compteur)
                                                compteur -= 1
                                                #lettre_proposee += [c] Erreur
                                                continue # Inutile de s'amuser à la rechercher dans la liste...
                                            else:
                                                lettre_proposee.append(c.upper()) #Append est fait pour ça
                                                
                                            if not affiche(m_secret, c, liste): #Plus naturel
                                                compteur -= 1
                                                print("\nCette lettre n'y est pas ! Coups restants : %d" %compteur)
                                                
                                        if compteur == 0:
                                            print("\nPERDU le mot secret était : %s" %(m_secret.upper()))
                                        else:  
                                            print("\nFélicitation vous avez gagné ! Le mot était bien %s" %(m_secret.upper()))            
                                            
                                        cont = input("Rejouer ? o/n ")
                                    
                                    print("\n\t\t\tAU REVOIR !")
                                    
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Mon pendu

                                    × 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