Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide sur un programme

Sujet résolu
    23 juillet 2013 à 21:50:21

    Bonjour,

    j'ai commencé python il y a peu de temps et je viens à peine de commencer la 2nd partie. J'ai créé un petit jeu en console qui consiste à trouver les 4 nombres générés par l'ordinateur mais j'ai quelques problèmes.

    #import 
    from random import randint
    import interface
    
    choix = input()
    choix = int(choix)
    
    if choix == 2:
        print("Vous jouez à un jeu de type mastermind\n"
              "Le but du jeu est de trouver le nombre\n"
              "choisit par l'ordinateur")
        choix = input()
        choix = int(choix)
       
            
            
    if choix == 1:
        
        nombre = True
        while nombre:
            w = randint(0, 9)
            x = randint(0, 9)
            y = randint(0, 9)
            z = randint(0, 9)
            
           
            while w == x or w == y or w == z or w == z or x == y or x == z or z == y:
                w = randint(0, 9)#aucun nombre en double
                x = randint(0, 9)
                y = randint(0, 9)
                z = randint(0, 9)
                
            nombre=False
        #boucle pricipale 
        continuer = True
        while continuer:
            a = -1
            b = -1
            c = -1
            d = -1
            conteur = 0
            while a != w or b != x or c != y or d != z:
                conteur+=1
                
                a = input("Entrer a:")   #demande de saisie
                a = int(a)
                b = input("Entrer b:")
                b = int(b)
                c = input("Entrer c:")
                c = int(c)
                d = input("Entrer d:")
                d = int(d)
                
                
                    
    
            #test des conditions
    
                if a == w:
                    print("a est bien placé")
                elif a == x or a == y or a == z:
                    print("'a' a la bonne valeur")
                else:
                    print("a n'accepte pas la valeur",a)
    
                if b == x:
                    print("b est bien placé")
                elif b == w or b == y or b == z:
                    print("b a la bonne valeur")
                else:
                    print("b n'accepte pas la valeur",b)
                if c == y:
                    print("c est bien placé")
                elif c == w or c == x or c == z:
                    print("c a la bonne valeur")
                else:
                    print("c n'accepte pas la valeur",c)
                if d == z:
                    print("d est bien placé")
                elif d == w or d == x or d == y:
                    print("d a la bonne valeur")
                else:
                    print("d n'accepte pas la valeur",d)
             
                if a == w and b == x and c == y and d == z:
                    print("Parfait vous avez trouver la bonne combinaison! en",conteur,"coups",w,x,y,z)
                    continuer_partie = input("voulez-vous rejouer?o/n\n")
                    if continuer_partie=="n" or continuer_partie=='N':
                        print("Merci d'avoir joué!")
                        continuer=False  #fin de la boucle principale
                    else:
                        conteur = 0
                        continuer=True  #on rejoue
                        nombre=True
                        while nombre == True:
                            w = randint(0, 9)
                            x = randint(0, 9)
                            y = randint(0, 9)
                            z = randint(0, 9)
                            
                            while w == x or w == y or w == z or w == z or x == y or x == z or z == y:
                                w = randint(0, 9)
                                x = randint(0, 9)
                                y = randint(0, 9)
                                z = randint(0, 9)
                                
                            nombre=False
                            

    D'abord je voulais avoir quelques conseils pour rendre mon code un peu plus court si possible. Mais les vrais problèmes sont que je n'ai pas trouvé comment faire pour prendre en compte plusieurs fois les mêmes nombre. Si il y en plusieurs pareils ont me dit qu'ils ne sont pas dans le code créé par l'ordinateur.Ensuite si vous pouviez m'aider sur la fin pour éviter d'avoir à réécrire le code de génération du nombre.

    Merci d'avance

    P.S:"a n'accepte pas la valeur" signifie que la valeur 'a' n'est pas du tout dans le code

    • Partager sur Facebook
    • Partager sur Twitter
      23 juillet 2013 à 22:05:44

      Pour rendre ton code plus court, tu pourrai utiliser les listes !!!! Oui parce que "x, y, w et z" c'est un peu lourd, alors que 
      number = list()
      for i in range(4):
          number.append(randint(0, 9))
      et voila, tu a un tableau avec 4 chiffres saisies aléatoirement :)
      • Partager sur Facebook
      • Partager sur Twitter
        23 juillet 2013 à 22:32:24

        Merci de m'avoir répondu. J'avais pensé un peu à l'utilisation des listes mais vu que je n'ai presque rien lu dessùs... Et est-ce que ça règle le problème quand il y à plusieurs nombres de même valeurs? En tout cas je vais essayé ce que tu me dis
        • Partager sur Facebook
        • Partager sur Twitter
          23 juillet 2013 à 22:56:39

          Je n'ai pas très bien saisi ton erreur : que veux tu et que obtient tu ?

          Sinon quand tu fais un input, met un string dedans pour savoir ce que tu veux qu'on entre (je croyais que mon pc avait bugué x) ).

          Pour tes conditions à ralonge, fait une seconde liste qui copie la première sans les doublons, et compare leur taille :

          copyNumber = []
          numberList[]
          
          while len(copyNumber) != len(numberList) or len(copyNumber) == 0:
              copyNumber = []
              numberList = []
              for i in range(4):
                  numberList.append(randint(0, 9))
          
          
              for num in enumerate(numberList):
                  if not num in copyNumber:
                      copyNumber.append(num)
           

          On pourrait aussi utiliser la fonction "count" de liste, sa marcherai tout aussi bien (pour 4 nombre ceci te semble long, mais imagine s'il y en aurait 9 : tu ferai une condition énorme en faisant toutes les possibilités, on ne s'en sortirai pas).

          -
          Edité par FirstZero 24 juillet 2013 à 11:55:50

          • Partager sur Facebook
          • Partager sur Twitter
            24 juillet 2013 à 7:47:56

            @FirstZero ce serait pas mal de tester les codes que tu donnes aux débutants, avant de les poster ici.

            -
            Edité par nohar 24 juillet 2013 à 7:49:27

            • Partager sur Facebook
            • Partager sur Twitter
            Zeste de Savoir, le site qui en a dans le citron !
            Anonyme
              24 juillet 2013 à 10:20:39

              Salut,

              — Pour les nombres uniques, il y a plus simple, par exemple avec un set (que tu peux convertir en liste par la suite) :

              import random
              
              nombres = set()
              while len(nombres) < 4:
                  nombres.add(random.randint(0, 9))
              nombres = list(nombres)

              Cela fonctionne car les sets n'acceptent aucun doublon.

              Ou alors, en utilisant random.sample :

              import random
              
              nombres = random.sample(range(10), 4)

              — Pour les valeurs entrées par le joueur (a, b, c, d), on peut également utiliser une liste :

              entrees = []
              for i in range(1, 5):
                  entrees.append(int(input('Entrer la {}e valeur '.format(i))))

              — On peut réécrire plus facilement le reste :

              while a != w or b != x or c != y or d != z:
              # devient
              while nombres != entrees:

              Et :

              if a == w and b == x and c == y and d == z:
              # devient
              if nombres == entrees:

              — On peut compacter les conditions :

              for i in range(4):
                  if entrees[i] == nombres[i]:
                      print('La {}e entrée est bien placée'.format(i+1))
                  elif entrees[i] in nombres:
                      print('La {}e entrée a la bonne valeur'.format(i+1))
                  else:
                      print('La {}e entrée n\'a pas la bonne valeur'.format(i+1))

              — Tu as des portions de code qui se répètent (à la suite de « #on rejoue »), il faut éviter cela au maximum. Je te laisse réorganiser tes boucles.

              -
              Edité par Anonyme 24 juillet 2013 à 10:25:41

              • Partager sur Facebook
              • Partager sur Twitter
                24 juillet 2013 à 10:47:33

                Merci pour vos réponses. Graphox, je vais prendre le temps de bien regarder ce que tu me dis parce que comme je ne connais pas encore beaucoup les listes ça me paraît un peu dur pour l'instant;)
                • Partager sur Facebook
                • Partager sur Twitter
                  24 juillet 2013 à 11:25:23

                  En effet nohar, j'aurai mieux fais de me relire ! j'ai corrigé le code, et désoler des erreurs commissent !
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    24 juillet 2013 à 11:37:03

                    @FirstZero : Ça ne marche toujours pas, on n'entre jamais dans la boucle puisque la condition est initialement fausse.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 juillet 2013 à 11:56:30

                      Qu'on me rappelle de relire ce que je fais avant de poster.......... (et d'essayer les codes x) ).
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        24 juillet 2013 à 12:08:19

                        FirstZero a écrit:

                        copyNumber = []
                        >numberList = []
                        
                        >while len(copyNumber) != len(numberList) or len(copyNumber) == 0:
                           copyNumber = []
                           numberList = []
                           for i in range(4):
                               numberList.append(randint(0, 9))
                        
                        
                          for num in enumerate(numberList):
                              if not num in copyNumber:
                                   copyNumber.append(num)

                        Que vient faire le enumerate(numberList) ici ? La condition if not num in copyNumber vaudra toujours True car num est un tuple issu de enumerate. La boucle principale est donc inutile et copyNumber sera de la forme [(0, 0), (1, 5), (2, 0), (3, 1)].

                        Même en corrigeant ce point, ta méthode ne permettrait pas de supprimer les doublons puisque tu tires au sort seulement 4 nombres (c'est figé avec for i in range(4)), donc si jamais il y a des doublons, tu ne pourras pas régénérer de nouveaux nombres.

                        → En fait, copyNumber = enumerate(numberList). Ton code est équivalent à copyNumber = enumerate(randint(0, 9) for _ in range(4)).

                        Donc non, tu n'as pas essayé ton code.

                        -
                        Edité par Anonyme 24 juillet 2013 à 12:22:48

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 juillet 2013 à 12:33:49

                          Merci Graphox le code marche bien . Je n'ai plus qu'à réécrire mon programme:)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Aide sur un programme

                          × 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