Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide pour l'exercice du plus ou moins

Sujet résolu
    14 mai 2011 à 9:01:14

    Bonjour, je réalise l'exercice du plus ou moins, mon script fonctionne mais une chose me chagrine.

    Voici mon script:

    import random
    
    def randNombre(debut=1, fin=100):
        'Génère un nombre aléatoire compris entre "début" et "fin".'
    
        # Création du nombre en lui-même:
        
        n = random.randrange(debut, fin)
    
        return n
    
    def analyseNombre(nombre, debut=1, fin=100):
        'Analyse le nombre entré par le joueur avec le nombre généré aléatoirement'
    
        compteur = []
    
        while 1:
    
            # Récupérer la valeur entrée par le joueur:
    
            print()
            jn = input("Entrez un nombre ou tapez 'Enter' pour quitter la partie:")
            
            # Si la valeur entrée par le joueur est un saut de ligne, on
            # sort de la fonction:
    
            if jn == '':
                print()
                print("Vous avez tapé 'Enter' ! Fin de la partie.\n")
                break
    
            # Conversion de l'entrée du joueur de str() à int():
    
            jn = int(jn)
    
            # Inscription des valeurs entrées par le joueur dans une liste et indication sur
            # la taille de la liste:
    
            compteur.append(jn)
            lc = len(compteur)
    
            # Si le nombre est égal à celui entré par le joueur, le joueur
            # gagne, on sort de la fonction.
            # On affiche aussi le nombre de tentatives 'lc':
            
            if jn == nombre:
                print()
                print('Bravo vous avez gagné ! Vous avez trouvé en', lc, 'coups.\n')
                break
    
            # Si le nombre est plus petit que celui entré par le joueur mais supérieur au nombre
            # indiqué comme début:
    
            if jn < nombre and jn >= debut:
                print("C'est plus !")
    
            # Si le nombre est plus grand que celui entré par le joueur mais inférieur au nombre
            # indiqué comme fin:
    
            if jn > nombre and jn <= fin:
                print("C'est moins !")
                
            # Vérification si le nombre entré par le joueur est bien compris
            # entre la valeur du début et valeur de fin:
            
            if jn < debut or jn > fin:
                print()
                print('Veuillez entrer un nombre compris entre', debut, 'et', fin, '!\n')
    
    def niveauJeu():
        'Création des niveaux de jeu suivant la valeur entrée par le joueur'
        
        print()
        niveau = input('Choisissez le niveau de difficulté (entre 1 et 3):')
    
        niveau = int(niveau)
    
        # Niveau 1: On génère un nombre entre 1 et 10 par appel de la 
        # fonction randnombre(), puis on débute l'analyse de ce nombre
        # par appel de la fonction analyseNombre():
    
        if niveau == 1:
            print()
            print('Niveau de difficulté 1, nombre compris entre 1 et 10')
    
            n = randNombre(1, 10)
            analyseNombre(n, 1, 10)
    
        # Niveau 2:
    
        if niveau == 2:
            print()
            print('Niveau de difficulté 2, nombre compris entre 1 et 100')
    
            n = randNombre(1, 100)
            analyseNombre(n, 1, 100)
    
        # Niveau 3:
        
        if niveau == 3:
            print()
            print('Niveau de difficulté 3, nombre compris entre 1 et 1000')
    
            n = randNombre(1, 1000)
            analyseNombre(n, 1, 1000)
    
        # Si la valeur entrée ne correspond pas à celle attendue, on
        # redemande une valeur valide:
        
        if niveau > 3:
    
            niveauJeu()
            
    def startStopJeu():
        'Début et arrêt du jeu suivant la valeur entrée du joueur'
        
        while 1:
    
            # Récupérer la décision du joueur de jouer ou non:
            
            i = input("Débuter une nouvelle partie tapez 'Y' sinon tapez 'N':")
    
            # Si la décision est oui, on propose au joueur de choisir le niveau
            # de difficulté:
           
            if i == 'Y':
                
                niveauJeu()
    
            # Si la décision est non, on sort de la fonction startStopJeu()
            # le jeu s'arrête:
            
            if i == 'N':
    
                print()
                print('Vous avez quitté le jeu.')
                break
    
    # Test:
    
    startStopJeu()
    


    Et Voici un exemple de message d'erreur:
    Traceback (most recent call last):
    File "/Users/Asimov/Desktop/Apprendre à programmer avec Python 3 /Annexes/test.py", line 139, in <module>
    startStopJeu()
    File "/Users/Asimov/Desktop/Apprendre à programmer avec Python 3 /Annexes/test.py", line 126, in startStopJeu
    niveauJeu()
    File "/Users/Asimov/Desktop/Apprendre à programmer avec Python 3 /Annexes/test.py", line 110, in niveauJeu
    niveauJeu()
    File "/Users/Asimov/Desktop/Apprendre à programmer avec Python 3 /Annexes/test.py", line 77, in niveauJeu
    niveau = int(niveau)
    ValueError: invalid literal for int() with base 10: 'J'



    En fait dans les fonctions analyseNombre et niveauJeu je souhaiterais mettre une condition pour analyser si la valeur entrée par le joueur peut être ou non convertie en int(), et dans le cas du non, demandé au joueur de retaper une valeur.

    Car la bien sur si je joue le jeu tout marche mais si je rentre une valeur de type str() j'ai le droit à un message d'erreur qui est compréhensible.

    Voilà désolé je suis pas très explicite, je suis débutant.

    Merci par avance pour vos réponses. Bonne Journée.

    Par ailleurs si vous pouviez me dire si ce code est buvable ou alors si c'est l'exemple type de ce qu'il ne faut pas faire :p, Promis je ne me vexerais pas. Merci à vous.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      14 mai 2011 à 9:54:12

      Citation

      En fait dans les fonctions analyseNombre et niveauJeu je souhaiterais mettre une condition pour analyser si la valeur entrée par le joueur peut être ou non convertie en int(), et dans le cas du non, demandé au joueur de retaper une valeur.



      Le mieux c'est un try except

      Tu peux le tester sans ton code

      while True:
          try:
              n = int(input('Entrer votre nombre : '))
              print(n)
              break # quitte la boucle
          except ValueError:
              print("ce n'est pas un nombre")
              # retourne au début de ta boucle
      


      Edit: Ton code est trop long et répétitif, analyse ton algo et factorise pour le raccourcir.

      • Partager sur Facebook
      • Partager sur Twitter
        14 mai 2011 à 19:54:59

        C'est vrai que ton code est très long, même en C c'est beaucoup plus court...
        • Partager sur Facebook
        • Partager sur Twitter
          16 mai 2011 à 5:50:30

          Bonjour, merci tout d'abord pour vos réponses.

          Merci fred1599 j'avais du mal avec try.. except j'ai un peu mieux compris grâce à vous.
          J'ai pioché aussi dans votre code de ce jeu posté sur ce forum pour deux, trois trucs.
          Je n'ai pas encore étudié les dictionnaires donc ne me lancez pas de tomates.

          Voici mon code final:
          import random
          
          def verifEntree(label, debut, fin):
          
              while True:
          
                  try:
                      entree = int(input(label))
          
                      if not debut <= entree <= fin:
                          print('Erreur entrez un nombre compris entre 1 et', fin)
          
                      else:
                          break
          
                  except ValueError:
                      print('Erreur entrez un nombre compris entre 1 et', fin)
          
              return entree
          
          def niveaux():
          
              niveau = verifEntree('Choix du niveau: Entrez un nombre compris entre 1 et 3:', 1, 3)
          
              if niveau == 1:
                  fin = 10
          
              if niveau == 2:
                  fin = 100
          
              if niveau == 3:
                  fin = 1000
          
              print('Niveau de difficulté:', niveau, )
          
              return fin
          
          def analyseNombre(randn, fin):
          
              compteur = []
          
              print('Vous devez trouver un nombre compris entre 1 et', fin, 'ou <0> pour quitter')
          
              while True:
          
                  nj = verifEntree('Entrez votre nombre:', 0,  fin)
                  compteur.append(nj)
          
                  if nj == 0:
                      break
          
                  if nj == randn:
                      print('Bravo vous avez trouvé ! Nombre de coups:', len(compteur))
                      break
          
                  if nj < randn:
                      print("C'est plus !")
          
                  if nj > randn:
                      print("C'est moins !")
          
          def start():
          
              ni = niveaux()
              rn = random.randrange(1, ni)
              analyseNombre(rn, ni)
          
          start()
          
          while True:
          
              sj = input('Rejouer <r> ou Quitter <q> ?')
          
              if sj == 'q':
                  break
          
              if sj == 'r':
                  start()
          


          Alors j'ai l'impression qu'il est toujours aussi long :lol: mais franchement avec mes connaissances actuelles je n'arrive pas à faire moins :euh:

          Encore merci et bonne journée à vous.
          • Partager sur Facebook
          • Partager sur Twitter
            16 mai 2011 à 6:49:34

            def niveaux():
            
                niveau = verifEntree('Choix du niveau: Entrez un nombre compris entre 1 et 3:', 1, 3)
            
                if niveau == 1:
                    fin = 10
            
                if niveau == 2:
                    fin = 100
            
                if niveau == 3:
                    fin = 1000
            
                print('Niveau de difficulté:', niveau, )
            
                return fin
            


            ça fait la même chose ...

            def niveaux():
                niveau = verifEntree('Choix du niveau: Entrez un nombre compris entre 1 et 3:', 1, 3)
                return (10,100,1000)[niveau]
            


            dans la même idée tu peux racoursir le reste du code ... aller, sans trop toucher à la structure.

            def analyseNombre(randn, fin):
                compteur = []
                print('Vous devez trouver un nombre compris entre 1 et', fin, 'ou <0> pour quitter')
                nj = True
                while nj:
                    nj = verifEntree('Entrez votre nombre:', 0,  fin)
                    compteur.append(nj)
                    if nj == randn:
                        print('Bravo vous avez trouvé ! Nombre de coups:', len(compteur))
                        break
                    print("C'est plus !" if nj < randn else "C'est moins !")
            
            • Partager sur Facebook
            • Partager sur Twitter

            Python c'est bon, mangez-en. 

              16 mai 2011 à 7:51:12

              Merci josmiley je ne connaissais pas la technique " (10,100,1000)[niveau] ", ça s'appelle comment ? si cela à un nom...

              sinon j'ai rajouté niveau -= 1 :

              niveau = verifEntree('Choix du niveau: Entrez un nombre compris entre 1 et 3:', 1, 3)
              
                  print('Niveau de difficulté:', niveau)
              
                  niveau -= 1
              
                  return (10, 100, 1000) [niveau]
              


              car je suppose que le "comptage" commençe à partir de zéro.
              • Partager sur Facebook
              • Partager sur Twitter
                16 mai 2011 à 8:50:57

                c'est une simple indextion.
                effectivement ça commence à 0, soit diectement
                return (10,100,1000)[niveau-1]
                
                ;)
                • Partager sur Facebook
                • Partager sur Twitter

                Python c'est bon, mangez-en. 

                  16 mai 2011 à 16:46:06

                  Ok merci beaucoup.

                  import random
                  
                  def verifEntree(label, debut, fin):
                  
                      while True:
                  
                          try:
                              entree = int(input(label))
                  
                              if not debut <= entree <= fin:
                                  print('Erreur entrez un nombre compris entre 1 et', fin)
                  
                              else:
                                  break
                  
                          except ValueError:
                              print('Erreur entrez un nombre compris entre 1 et', fin)
                  
                      return entree
                  
                  def niveaux():
                  
                      niveau = verifEntree('Choix du niveau: Entrez un nombre compris entre 1 et 3:', 1, 3)
                  
                      print('Niveau de difficulté:', niveau)
                  
                      return (10, 100, 1000) [niveau-1]
                  
                  def analyseNombre(randn, fin):
                  
                      compteur = []
                  
                      print('Vous devez trouver un nombre compris entre 1 et', fin, 'ou <0> pour quitter')
                  
                      while True:
                  
                          nj = verifEntree('Entrez votre nombre:', 0,  fin)
                          compteur.append(nj)
                  
                          if nj == 0:
                              break
                  
                          if nj == randn:
                              print('Bravo vous avez trouvé ! Nombre de coups:', len(compteur))
                              break
                  
                          if nj < randn:
                              print("C'est plus !")
                  
                          else:
                              print("C'est moins !")
                  
                  def start():
                  
                      ni = niveaux()
                      rn = random.randrange(1, ni)
                      analyseNombre(rn, ni)
                  
                  start()
                  
                  while True:
                  
                      sj = input('Rejouer <r> ou Quitter <q> ?')
                  
                      if sj == 'q':
                          break
                  
                      if sj == 'r':
                          start()
                  


                  Modification de la fonction niveau.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    16 mai 2011 à 17:20:04

                    if not debut <= entree <= fin:
                                    print('Erreur entrez un nombre compris entre 1 et', fin)
                    


                    J'aurais pas de pitié pour le mec qui se plante alors qu'on lui demande un nombre dans un intervalle connu, je lui compterais un coup supplémentaire :p

                    Personnellement je ne pense pas qu'il y est besoin de tellement de fonctions pour ce genre d'exercice, mais c'est déjà mieux :)

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Aide pour l'exercice du plus ou moins

                    × 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