Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide pour un pendu

    25 mars 2015 à 16:39:13

    Bonjour à tous,

    Je suis en terminale, spécialité ISN, et j'ai donc un projet à rendre pour la fin de l'année. J'ai donc décidé de faire un pendu avec un de mes amis, je m'occupe de faire le jeu en lui même (du moins le jeu de base, tout ce qui est modes de jeu différent sera vu après), et mon camarade de la partie interface avec Tkinter. Je précise que je n'ai pas lu le cours du site, seulement ceux d'ISN. Je ne demande pas à avoir le code directement bien évidemment, juste des indices/liens pour réussir (et si c'est vraiment d'un niveau trop compliqué pour un débutant, les réponses directes conviennent aussi)

    Voici mon problème :

    Le pendu sera contre l'IA, qui ira prendre un mot au hasard dans un txt, et qu'on devra deviner. Je sais comment prendre le contenu d'un fichier txt, mais comment faire pour ne prendre qu'une partie de ce contenu ? Par exemple, le fichier txt contiendrait un mot par ligne, comment lui dire de sélectionner uniquement la ligne 3 par exemple ?

    Merci d'avance pour vos réponses, et je demanderai sûrement d'autres aides après, n'ayant pas un niveau de Python très élevé, bien que je pense que le programme en lui même n'est pas très compliqué une fois qu'on sait quelle marche suivre et quelles fonctions utiliser !

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      25 mars 2015 à 16:59:20

      Pour sélectionner une ligne au hasard dans ton fichier, tu peux utiliser le module random et la fonction randint, et le module linecache pour avoir accès à cette ligne directement.

      • Partager sur Facebook
      • Partager sur Twitter
        29 mars 2015 à 17:47:41

        Merci ! Cependant j'ai une autre question, concernant la boucle qui vérifie si la lettre inscrite par le joueur se situe dans le mot.

        import linecache
        import random
        x = linecache.getline('test.txt', 1) #je sélectionne le mot
        mot = len(x) #afin que la boucle se termine ni trop tôt ni trop tard
        lettre = input('Entrez une lettre :')
        if lettre in x : #boucle qui se lance si la lettre est dans le mot
            compteur = 0
            while compteur != mot: 
                if lettre == x[0] : #si la lettre est au premier emplacement, je l'affiche 
                    print(lettre)
                    compteur = compteur + 1
                else : #sinon j'affiche un *
                    print('*')
                    compteur = compteur + 1
        else : #si la lettre n'est pas dans le mot
            print('Perdu')


        Mon problème est que je ne sais pas comment faire pour que quand la boucle s'est effectuée une fois, lettre soit comparée non plus à x[0] mais à x[1], puis x[2] etc.. Comment faire pour incrémenter la valeur n dans x[n] ?

        -
        Edité par yamigishi1 29 mars 2015 à 18:46:59

        • Partager sur Facebook
        • Partager sur Twitter
          29 mars 2015 à 17:55:40

          Tu écris toi même la solution! :)

          n = 0
          print(x[n])
          n = n + 1
          print(x[n])
          
          Voilà le principe... A toi de l'intégrer dans ton code.

          -
          Edité par Dan737 29 mars 2015 à 17:55:51

          • Partager sur Facebook
          • Partager sur Twitter
            29 mars 2015 à 18:46:47

            Ah oui, j'y ai pas pensé.. A mon avis, j'ai cru avoir essayé et avoir constaté que ça ne marchait pas, alors qu'en fait, je n'avias pas essayé.. Merci beaucoup !
            • Partager sur Facebook
            • Partager sur Twitter
              28 avril 2015 à 17:58:44

              Bonjour à tous,

              Désolé de remonter ce sujet, mais j'ai encore une fois besoin d'aide :

              import linecache
              import random
              compWord = list(linecache.getline('E:\test.txt', 1)) #je sélectionne le mot
              compWord.pop()
              lenWord = len(compWord) #afin que la boucle se termine ni trop tôt ni trop tard
              pv = 10
              word = [42]
              word.pop() #on enlève le \n
              while pv != 0 or word != compWord :
                  lettre = input('Entrez une lettre : \n')
                  if lettre in compWord : #boucle qui se lance si la lettre est dans le mot
                      i =  0
                      while i != lenWord:
                          if lettre == compWord[i] : #si la lettre est au n eme emplacement, je l'affiche
                              word.insert(i, lettre) #on met la lettre au bon emplacement dans le mot du joueur
                              i = i + 1
                              print(lettre)
                          else : #sinon j'affiche un *
                              print('*')
                              i = i + 1
                  else : #si la lettre n'est pas dans le mot
                      print('git gud : \n') #dank meme
                      pv = pv - 1
              
              
              
              if word == compWord :
                  print('Bravo ! Le mot était : ', word)
              elif pv == 0 :
                  print('Perdu ! Le mot était : ', word)

              Voilà la boucle du jeu en lui même (il me reste quelques choses à ajouter, comme convertir les caractères en minuscule, mettre en place un message si l'utilisateur écrit un chiffre etc... Mais là n'est pas la question)

              Le problème, c'est que le programme ne veut jamais quitter le while, j'ai fait des test en affichant word et compWord, les deux sont identiques, à chaque fois j'ai le droit à un "Entrez une lettre :", idem quand mes pv sont à 0. Je vois pas où ça bloque, quelqu'un peut m'éclairer ?

              • Partager sur Facebook
              • Partager sur Twitter
                28 avril 2015 à 19:33:16

                Pour pouvoir sortir de ton while il faudrait que word == compWord et que pv == 0. Donc tu as un problème de logique.

                • Partager sur Facebook
                • Partager sur Twitter
                  29 avril 2015 à 9:15:46

                  Comme l'a dit Dan juste au dessus tu ne pourras pas sortir de ta boucle à moins que les deux conditions soient vraies !

                  Explication :

                  while pv != 0 or word != compWord :

                  Si pv != 0 on va boucler

                  Si word != compWord on va boucler aussi

                  Imaginons que tu n'aies plus de point de vie.

                  PV ne vas pas faire boucler mais word != compWord lui si.

                  Si X ou Y si l'un OU l'autre est vrai

                  Si X et Y si les DEUX sont vrais

                  Le code d'iteration est en fait :

                  while pv != 0 and word != compWord :


                  • Partager sur Facebook
                  • Partager sur Twitter
                  OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
                    29 avril 2015 à 14:13:15

                    Merci, j'ai enfin pu finir le jeu principal, plus qu'à fusionner jeu et interface et ajouter du bonus (modes de jeu, score etc...)

                    Cependant, encore un dernier problème, je code en utilisant Pycharm et tout marche comme un charme (oh oh oh), mais sous Idle, dès que j'écris une lettre, j'ai ce message :

                    Traceback (most recent call last):
                      File "E:\jeuPrincipalPendu.py", line 11, in <module>
                        lettre = input('Entrez une lettre : \n')
                      File "<string>", line 1, in <module>
                    NameError: name 'a' is not defined
                    >>> 
                    

                    De plus, Python est en 2.7.6 selon Idle, alors que j'ai installé la 3.4 (la 2.7.6 s'est installé par un logiciel que j'ai installé)

                    Comment régler ça ? N'étant pas sûr d'avoir le choix de l'IDE le jour du bac, si le programme ne se lance pas sous Idle, ce serait pas chouette...

                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 avril 2015 à 14:24:08

                      Passe par une variable temporaire ici :
                      lettre = input('Entrez une lettre : \n')

                      A remplacer par :

                      vLettre = input('Entrez une lettre : \n')
                      lettre = vLettre
                      • Partager sur Facebook
                      • Partager sur Twitter
                      OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
                        29 avril 2015 à 14:28:59

                        Chaque IDLE embarque normalement sa version de python avec laquelle il a été installé. Donc normalement tu devrais trouver un IDLE spécifique pour tes différentes versions de python installées. Mais sinon, tu ne peux pas tout simplement lancer le programme dans un terminal pour ton bac ? Peut être que ton enseignant pourrait t'informer la dessus.

                        -
                        Edité par Jevanni 29 avril 2015 à 14:29:56

                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 avril 2015 à 14:31:38

                          Même problème, lettre a juste été remplacé par vLettre dans le message d'erreur
                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 avril 2015 à 14:38:29

                            J'ai absolument pas compris ce que tu proposes ici IQbrod. C'est sûrement une question de version de python, dans ton cas j'imagine qu'il faudrait que tu remplaces input par raw_input. Cependant tu risques d'avoir d'autres soucis suite à une autre version de python (si j'ai bien compris tu as codé et exécuté ton code avec PyCharm sous python 3.4 et tu as ce problème avec l'IDLE en 2.7).
                            • Partager sur Facebook
                            • Partager sur Twitter
                              29 avril 2015 à 14:39:08

                              1° Essai

                              A ce moment là essaye de définir un fonction de récupération qui retourne la lettre du style :

                              # Includes
                              
                              def recupLettre():
                                myLetter = input(...)
                                return myLetter
                              
                              # Code de Jeu

                              lettre = recupLettre()

                              2° Essai

                              Input envoie une chaine et non un Char ... a cresuer :)

                              -
                              Edité par IQbrod 29 avril 2015 à 14:39:40

                              • Partager sur Facebook
                              • Partager sur Twitter
                              OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
                                29 avril 2015 à 14:41:17

                                Jevanni a écrit:

                                J'ai absolument pas compris ce que tu proposes ici IQbrod


                                http://sametmax.com/quelques-erreurs-tordues-et-leurs-solutions-en-python/

                                Si la variable est mal utilisée ...

                                Et oui je pense que ça vient surement de l'IDE si ça arrive à tourner basiquement sans ...

                                -
                                Edité par IQbrod 29 avril 2015 à 14:42:07

                                • Partager sur Facebook
                                • Partager sur Twitter
                                OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
                                  29 avril 2015 à 14:48:00

                                  Difficile d'imaginer que mettre l'input dans une fonction pourrait résoudre quelque chose. De plus le Char n'existe pas en python.

                                  -
                                  Edité par Jevanni 29 avril 2015 à 14:50:34

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    29 avril 2015 à 15:00:07

                                    Idle en 3.4 ne se lance pas, même pas un processus qui se lance, par contre le 2.7 oui. Je demanderai à mon professeur quand je le verrai, en espérant que ça fonctionne sur les pc du lycée.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      29 avril 2015 à 17:12:29

                                      Si tu veux tester avec la version 2.x, il faudra remplacer input par raw_input

                                      -
                                      Edité par Anonyme 29 avril 2015 à 17:12:58

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        14 mai 2015 à 14:11:13

                                        Petit up, après plusieurs essais on a décidé d'abandonner l'idée de mettre une interface, vu qu'on a jamais fait ça en cours et que c'est trop complexe (du moins pour mon camarade, et j'ai personnellement pas le temps pour le faire, donc je sais pas si j'y arriverai ou pas)

                                        Donc j'ai voulu rendre mon truc plus présentable, parce que là il y a un retour à la ligne pour chaque caractère, donc un mot de 5 lettres renvoie un truc style :

                                        *

                                        *

                                        *

                                        A

                                        *

                                        ce qui est pas pratique. Du coup j'ai fait une liste qui contiendra le mot formé par les lettres que l'utilisateur rentre, au départ vide, et que je remplis ensuite comme ça :

                                        if time == 0 : #pour que ça le fasse qu'au premier input
                                                i = 0
                                                while i != lenWord :
                                                    word.insert(i, '*') #on remplit la liste contenant le mot du joueur de *, avec autant de * qu'il y a de lettres
                                                    i = i + 1
                                            time + 1



                                        (time étant défini à 0 au début du programme bien sûr)

                                        Ensuite l'utilisateur rentre une lettre, si la lettre n'est pas dans le mot il perd un pv, et si elle y est, j'appelle ma fonction lettreDansMot, qui est comme ça :

                                        def lettreDansMot() :
                                            i =  0
                                            while i != lenWord:
                                                if lettre == compWord[i] : #si la lettre est au n eme emplacement, je l'affiche
                                                    word.insert(i, lettre) #on met la lettre au bon emplacement dans le mot du joueur
                                                    i = i + 1
                                                else : #sinon j'affiche un *
                                                    del word[i]
                                                    word.insert(i, '*')
                                                    i = i + 1
                                            print(word)

                                        Le seul problème étant que quand je lance le programme, ça fait ça :

                                        En gros, les caractères ne s'enlèvent pas, ce qui m'amènent à la question suivante :

                                        Comment je peux faire pour remplacer la valeur à l'emplacement x d'une liste par une autre ?

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          14 mai 2015 à 14:20:06

                                          Remplace tes objets str par des bytearray, j'en ai fais une démonstration ICI !

                                          Ça sera beaucoup plus simple d'utilisation, sans utiliser les listes...

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            14 mai 2015 à 15:24:36

                                            Il y a plusieurs manières de représenter l'état de ton jeu en mémoire. Soit comme tu l'as essayé, tu gardes une liste avec une lettre par élément, et tu as une autre liste où tu n'as que des étoiles. Lorsque le joueur découvre des lettre, tu enlèves les étoiles et les remplaces par les lettres.

                                            Une autre manière serait de garder le mot dans un chaîne de caractères, et les lettres découvertes dans une autre chaîne. Au moment d'imprimer le mot mystère, tu pourrais faire comme ceci:

                                            mot_secret = 'MYSTERE'
                                            lettres_decouvertes = 'ES'
                                            

                                            for lettre in mot_secret:

                                            if lettre in lettres_decouvertes:
                                                print(lettre, end=' ')
                                            else:
                                                print('*', end=' ')
                                            

                                            print()

                                            </pre> L'impression est différente de ce qui est gardé en mémoire. En mémoire on ne connait que le mot mystère et les lettres découvertes (et peut-être aussi les lettres tentées.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              16 mai 2015 à 13:37:42

                                              Ok finalement c'est bon, c'était juste une erreur de logique si on peut appeler ça comme ça, j'ai réussi à régler le problème, mais merci quand même !

                                              Une dernière question, et je pense en avoir fini après :

                                              Si l'utilisateur rentre plusieurs lettres, un nombre ou juste appuie sur entrée sans avoir rentrer de lettre, lui faire perdre un pv serait injuste (sauf s'il le fait 10 fois d’affilée, là il le cherche un peu), du coup, pour pallier à ce problème, j'ai ça :

                                               if len(lettre) > 1 :
                                                      print("""Veuillez n'entrer qu'une lettre a la fois. \n""")
                                                  elif not lettre.isalpha() :
                                                      print('Les chiffres ne sont pas des lettres ! \n')
                                                  elif lettre == ' ' and lettre == '\n' :
                                                      print("Ceci n'est pas une lettre. Reesayez : \n")

                                              Autant ça marche pour les nombres, ou les 2 caractères ou plus, autant pour juste entrée ou espace, ça ne marche pas, donc comment faire pour dire de faire quelque chose si lettre == entrée ou espace ?

                                              -
                                              Edité par hugodetarame 16 mai 2015 à 13:49:42

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                16 mai 2015 à 13:56:15

                                                En français, ta dernière condition veut dire: "Si ce qu'a entré l'utilisateur est un espace ET un retour à la ligne alors...". C'est quelque chose d'impossible à faire. On ne peut avoir que l'un ou l'autre. Tu veux avoir un ou, donc elif lettre == ' ' or lettre == '\n':.

                                                -
                                                Edité par Dan737 16 mai 2015 à 13:58:47

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  16 mai 2015 à 16:07:38

                                                  Ah oui, merci, ça marche avec espace mais pas avec entrée cependant :/

                                                  Et aussi, autre question mais purement optionnel, il y a un moyen de changer la couleur des print sans installer de module ?

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    16 mai 2015 à 16:16:33

                                                    Oui pour entrée seulement, ce n'est pas un retour à la ligne qui est renvoyé par input, mais une chaîne de caractère vide. C'est logique, étant donné que tu dois toujours faire entrée à la fin de ta saisie, et ce retour à la ligne est toujours ignoré. Si on ne saisit rien d'autre que faire un retour à la ligne, c'est donc une chaîne de caractère vide qui est retourné.

                                                    Non il n'est pas possible de changer la couleur du texte de la console et que ce soit compatible sur d'autres plateformes (Windows, Linux, OS X).

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      17 mai 2015 à 18:02:47

                                                      D'accord, j'ai réussi pour entrée, et dommage pour la couleur.

                                                      Du coup j'ai encore des questions, on voudrait que l'utilisateur puisse jouer avec sa propre liste de mots; donc on a ça : 

                                                      ajoutMot = open('E:\listeJoueur.txt', 'w')
                                                                  print("Entrez le mot que vous voulez ajouter a la liste. \n")
                                                                  motRajout = input()
                                                                  motRajout = motRajout.upper()
                                                                  ajoutMot.write(motRajout)
                                                                  ajoutMot.close()

                                                      Le problème étant que chaque fois qu'on écrit un mot, il supprime le contenu qui était auparavant dans la liste, du coup on a une liste contenant uniquement un mot, comment faire pour que les mots s'écrivent les un à la suite ?

                                                      Et aussi, si on remplit la liste, par exemple en écrivant dans le .txt, on a une erreur. En gros, pour savoir combien de lignes il y a dans le fichier, on a  : 

                                                      nbLignes = open('E:\listeJoueur.txt', 'r')
                                                                  n = 0
                                                                  for line in nbLignes :
                                                                      n += 1
                                                                  randNumber = random.randint(1, nbLignes)
                                                                  compWord = list(linecache.getline('E:\listeJoueur.txt', randNumber)) #je sélectionne le mot
                                                                  compWord.pop()
                                                                  nbLignes.close()

                                                      Et l'erreur dit :

                                                      Traceback (most recent call last):
                                                        File "E:\MenuISN.py", line 50, in <module>
                                                          randNumber = random.randint(1, nbLignes)
                                                        File "C:\Python34\lib\random.py", line 218, in randint
                                                          return self.randrange(a, b+1)
                                                      TypeError: unsupported operand type(s) for +: '_io.TextIOWrapper' and 'int'

                                                      Comment résoudre ces problèmes ?

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        18 mai 2015 à 16:24:15

                                                        Pour ta première question : lis la doc (tu verras que "a" est possible). Pour ta seconde question, tu sembles ne pas comprendre ton propre code et tu soulignes par ailleurs le malheur de mal nommer ses variables. nbLignes n'est en rien le nombre de lignes dans ton fichier, mais le retour de la fonction open(). Hors ce n'est pas ce que tu cherches à donner dans la fonction randint(), d'autant plus que tu as dans ton propre code le nombre de lignes dans une autre variable.

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          21 mai 2015 à 19:54:39

                                                          Ah oui en effet, j'avais fait un gros brainfart pour avoir dit de prendre nbLignes et pas n, je le savais en plus.. Dans tous les cas, j'ai fini mon projet, encore merci à tous !
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Aide pour un 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