Partage
  • Partager sur Facebook
  • Partager sur Twitter

Retour dans une boucle après erreur arguments

    2 mars 2021 à 10:28:07

    Bonjour,

    J'ai créé un programme de bataille navale que voici :

    from tkinter import*
    
    def bataillenavale():
        D=bateau(2)
        T=bateau(3)
        PA=bateau(5)
        nbrcoups=0
        Lm=[]
        Lt=[]
        while len(D)!=0 or len(T)!=0 or len(PA)!=0:
            w,z=input("entrez les coordonnées de votre torpille en x et en y : ").split()
            torpille=int(w),int(z)
            if torpille in D:
                i=D.index(torpille)
                del(D[i])
                Lt+=[torpille]
            if torpille in T:
                i=T.index(torpille)
                del(T[i])
                Lt+=[torpille]
            if torpille in PA:
                i=PA.index(torpille)
                del(PA[i])
                Lt+=[torpille]
            else:
                Lm+=[torpille]
            nbrcoups+=1
        if len(D)==0 and len(T)==0 and len(PA)==0:
            carte(Lm,Lt)
            fen1 = Tk()
            tex1 = Label(fen1,text='Félicitations, vous avez coulé votre adversaire en ' + str(nbrcoups) + ' coups', fg='blue')
            tex1.pack()
            bou1 = Button(fen1, text='Quitter', command=fen1.destroy)
            bou1.pack()
            fen1.mainloop()

    Mais j'ai un problème, lorsque je dois rentrer les coordonnées d'un bateau ou d'une torpille j'ai utilisé la fonction .split() qui me permet de séparer les coordonnées en x et en y. Or, lorsque je rentre ces coordonnées (et il y en a pas mal) le programme s'arrête car il considère qu'il n'y a pas assez d'arguments donnés. Comment dois-je faire pour revenir dans la boucle de mon programme ?

    • Partager sur Facebook
    • Partager sur Twitter
      2 mars 2021 à 10:42:05

      un exemple du message d'erreur complet ?

      le split sépare les chaines selon les espaces donc il faut rentrer x et y avec par exemple :"5 9" (sans les guillemets)

      il manque aussi la fonction bateau()

      • Partager sur Facebook
      • Partager sur Twitter
        2 mars 2021 à 10:53:00

        Oui je rentre bien x et y de cette manière et pardon je mets la fonction bateau et la fonction carte par ailleurs :

        def bateau(n):
            L=[]
            k=1
            x=0
            y=0
            while k<=n:
                x, y = input("entrez vos coordonnées en x et en y : ").split()
                x,y=int(x),int(y)
                k=k+1
                L=L+[(x,y)]
            return L
        
        from pylab import*
        
        def carte(Lm,Lt):
            a=len(Lm)
            b=len(Lt)
            for k in range(0,a):
                c,d=Lm[k]
                plot(c,d,'bx')
            for k in range(0,b):
                e,f=Lt[k]
                plot(e,f,'r.')
            show()
        
        from tkinter import*
        
        def bataillenavale():
            D=bateau(2)
            T=bateau(3)
            PA=bateau(5)
            nbrcoups=0
            Lm=[]
            Lt=[]
            while len(D)!=0 or len(T)!=0 or len(PA)!=0:
                w,z=input("entrez les coordonnées de votre torpille en x et en y : ").split()
                torpille=int(w),int(z)
                if torpille in D:
                    i=D.index(torpille)
                    del(D[i])
                    Lt+=[torpille]
                if torpille in T:
                    i=T.index(torpille)
                    del(T[i])
                    Lt+=[torpille]
                if torpille in PA:
                    i=PA.index(torpille)
                    del(PA[i])
                    Lt+=[torpille]
                else:
                    Lm+=[torpille]
                nbrcoups+=1
            if len(D)==0 and len(T)==0 and len(PA)==0:
                carte(Lm,Lt)
                fen1 = Tk()
                tex1 = Label(fen1,text='Félicitations, vous avez coulé votre adversaire en ' + str(nbrcoups) + ' coups', fg='blue')
                tex1.pack()
                bou1 = Button(fen1, text='Quitter', command=fen1.destroy)
                bou1.pack()
                fen1.mainloop()

        Et un exemple de message d'erreur :

        bataillenavale()
        
        entrez vos coordonnées en x et en y : 0 0
        
        entrez vos coordonnées en x et en y : 11
        Traceback (most recent call last):
        
          File "<ipython-input-2-c51a383d8240>", line 1, in <module>
            bataillenavale()
        
          File "Z:\Alex\Cours\MPSI\Info\TP8.py", line 35, in bataillenavale
            D=bateau(2)
        
          File "Z:\Alex\Cours\MPSI\Info\TP8.py", line 9, in bateau
            x, y = input("entrez vos coordonnées en x et en y : ").split()
        
        ValueError: not enough values to unpack (expected 2, got 1)

        PS : je travaille sur spyder.

        • Partager sur Facebook
        • Partager sur Twitter
          2 mars 2021 à 10:56:51

          bah là c'est évident, sur la 2nde saisie vous avez rentré simplement 11 sans espace entre les 1, alors que vous vouliez sans doute mettre 1 1. le split ne renvoie qu'un élément, et on ne peut donc pas remplir les 2 variables attendues, d'où l'erreur.
          • Partager sur Facebook
          • Partager sur Twitter
            2 mars 2021 à 11:02:14

            Oui je sais mais étant donné qu'il y a beaucoup de valeurs à rentrer (3 bateaux et beaucoup de torpilles) je fais parfois des erreurs quand je rentre les coordonnées et je voudrais que lorsque je fais une erreur mon programme ne s'arrête pas et revienne à l'endroit où je rentrais les coordonnées.

            • Partager sur Facebook
            • Partager sur Twitter
              2 mars 2021 à 11:11:17

              il faut gérer l'erreur avec un try except else https://docs.python.org/fr/3/tutorial/errors.html#handling-exceptions 

                  try:        
                      w,z=input("entrez les coordonnées de votre torpille en x et en y : ").split()
                      torpille=int(w),int(z)
                  except ValueError: #si erreur de type ValueError
                      print("erreur de saisie")
                  else: #si pas d'erreur dans le try
                      if torpille in D:
                          i=D.index(torpille)
                          del(D[i])
                          Lt+=[torpille]
                      if torpille in T:
                          i=T.index(torpille)
                          del(T[i])
                          Lt+=[torpille]
                      if torpille in PA:
                          i=PA.index(torpille)
                          del(PA[i])
                          Lt+=[torpille]
                      else:
                          Lm+=[torpille]
                      nbrcoups+=1



              • Partager sur Facebook
              • Partager sur Twitter
                2 mars 2021 à 11:20:46

                Merci de votre aide mais cela ne fonctionne pas, je pense que cela vient de 
                ValueError

                J'ai un erreur du type :

                bataillenavale()
                
                entrez vos coordonnées en x et en y : 0 0
                
                entrez vos coordonnées en x et en y : 01
                Traceback (most recent call last):
                
                  File "<ipython-input-3-c51a383d8240>", line 1, in <module>
                    bataillenavale()
                
                  File "Z:\Alex\Cours\MPSI\Info\TP8.py", line 35, in bataillenavale
                    D=bateau(2)
                
                  File "Z:\Alex\Cours\MPSI\Info\TP8.py", line 9, in bateau
                    x, y = input("entrez vos coordonnées en x et en y : ").split()
                
                ValueError: not enough values to unpack (expected 2, got 1)



                -
                Edité par Runhelm 2 mars 2021 à 11:23:46

                • Partager sur Facebook
                • Partager sur Twitter
                  2 mars 2021 à 11:34:54

                  tu as bien remplacé le code de ta boucle while par le code que j'ai indiqué ?

                  ah zut, il faut aussi mettre ce try except dans bateau (vu que c'est dans fonction qu'on a aussi l'erreur)

                  def bateau(n):
                      L=[]
                      k=1
                      x=0
                      y=0
                      while k<=n:
                          try:
                              x, y = input("entrez vos coordonnées en x et en y : ").split()
                              x,y=int(x),int(y)
                          except ValueError:
                              print("erreur de saisie!")
                          else:
                              k=k+1
                              L=L+[(x,y)]
                      return L



                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 mars 2021 à 11:40:09

                    Oui j'ai remarqué l'oubli et cela fonctionne merci beaucoup de votre aide !

                    -
                    Edité par Runhelm 2 mars 2021 à 11:41:12

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Retour dans une boucle après erreur arguments

                    × 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