Partage
  • Partager sur Facebook
  • Partager sur Twitter

OR ou AND

Sujet résolu
    27 décembre 2021 à 22:57:02

    Bonjour, dans mon programme python, à l'avant dernière ligne, avec la boucle while ligne 30 :

    import time
    print("""-----------------------------------
    --------Jeu \"Plus ou moins\"--------
    -----------------------------------""")
    
    time.sleep(1)
    
    
    def nombre_de_joueur():
        joueur = 0
        while joueur == 0:
            try:
                joueur = int(input("Vous êtes : [1] Un joueur, [2] 2 Joueur ? : "))
            except ValueError:
                print("ERREUR: Vous devez rentrer un nombre.")
        return joueur
    
    
    def choix_du_niveau():
        niveau = 0
        while niveau == 0:
            try:
                niveau = int(input("Niveau : [1] Facile, [2] Moyen, [3] Dificile ? : "))
            except ValueError:
                print("ERREUR: Vous devez rentrer un nombre.")
        return niveau
    
    
    joueurs = 0
    while not joueurs == 1 or not joueurs == 2:
        joueurs = nombre_de_joueur()
    
    print("suite")
    

    J'ai mes 2 variables "joueurs", or quand l'utilisateur choisi le choix 2, le programme reste dans la boucle, et après, impossible de sortir de la boucle ...

    Par contre quand le met : and à la place de or :

    while not joueurs == 1 and not joueurs == 2:

    La, ça fonctionne bien, le choix 1 ou 2 sort de la boucle, cependant ce n'est pas logique, car on choisis 1 ou 2, pas 1 et 2 ... Je ne saisie pas tout.

    Merci pour votre explication.

    -
    Edité par Aelita 27 décembre 2021 à 22:59:48

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      27 décembre 2021 à 23:14:18

      Salut !
      C'est pourtant logique :


      OR : Tant que joueurs ne vaut pas 1 ou tant que joueurs ne vaut pas 2, faire ...

      Si joueurs == 2 alors on a  while True or False : donc la logique veut que si l'un des deux est vrai alors c'est vrai on reste donc dans la boucle, ce qui est le cas ici.


      AND : Tant que joueurs ne vaut pas 1 et tant que joueurs ne vaut pas 2, faire ...

      Si joueurs == 2 alors on a  while True and False : donc la logique veut que les deux doivent être vrais pour rester dans la boucle ce qui n'est pas le cas ici.

      PS : Tu peux écrire ton code autrement :

      import time
      print("""-----------------------------------
      --------Jeu \"Plus ou moins\"--------
      -----------------------------------""")
       
      time.sleep(1)
       
       
      def nombre_de_joueur():
          joueurs = 0
          while joueurs not in (1, 2):
              try:
                  joueurs = int(input("Vous êtes : [1] Un joueur, [2] 2 Joueur ? : "))
              except ValueError:
                  print("ERREUR: Vous devez rentrer un nombre.")
          return joueurs
       
       
      
      joueurs = nombre_de_joueur()




      -
      Edité par Anonyme 27 décembre 2021 à 23:41:14

      • Partager sur Facebook
      • Partager sur Twitter
        27 décembre 2021 à 23:24:37

        Bonjour. Avec le or, ta boucle se traduit de la sorte : 'on continue à boucler tant que joueurs ne vaut pas 1 ou que joueurs ne vaut pas 2'. En utilisant le théorème de morgan on sait que cela est équivalent à 'on continue à boucler tant que l'on a pas (joueurs vaut 1 et joueurs vaut 2). En notation: not(j == 1) or not(j == 2) <=> not(j == 1 and j == 2). Il est évident qu'aucune valeur de j ne vérifie j == 1 and j == 2, et par conséquent la négation n'est pas falsifiable, d'où la condition pour continuer à boucler est toujours vérifiée, d'où on ne sort jamais de la boucle. Lorsque tu vois que chaque terme d'une conjonction ou d'une disjonction est une négation, il est de bon ton de simplifier en factorisant la négation. Un peu comme quand tous les termes d'une addition ou d'une multiplication sont négatifs: il est alors probablement plus pratique de factoriser -1 en dehors de l'addition ou de la multiplication.

        while joueurs != 1 and joueurs != 2

        Et c'est encore mieux si on peut directement se passer de négation.

        -
        Edité par digammaF 28 décembre 2021 à 11:04:43

        • Partager sur Facebook
        • Partager sur Twitter

        typage structurel ftw

          28 décembre 2021 à 3:23:11

          while not joueurs == 1 and not joueurs == 2:
          Tant que c'est vrai que joueurs n'est pas (not) égal à 1 et (and) pas égal à 2, je continue à boucler
          On pourrait aussi écrire:
          while joueurs not in (1, 2):

          -
          Edité par PierrotLeFou 28 décembre 2021 à 3:29:58

          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            28 décembre 2021 à 9:27:17

            Indépendamment des tests logiques, quite à écrire une fonction qui saisisse le nombre de joueurs autant lui faire faire aussi le boulot du test des nombres valides attendus....

            def nombre_de_joueur():
                while True:
                    try:
                        joueur = int(input("Vous êtes : [1] Un joueur, [2] 2 Joueur ? : "))
                    except ValueError:
                        print("ERREUR: Vous devez rentrer un nombre.")
                    else:
                        if not (0 < joueur <= 2):
                            print('ERREUR: le nombre de joueur doit être 1 ou 2')
                        else:
                            return joueur



            • Partager sur Facebook
            • Partager sur Twitter

            OR ou AND

            × 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