Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme snake Tkinter

    29 avril 2014 à 15:21:10

    Bonjour a tous, je suis en classe de terminale S, dans le cadre du projet en ISN nous devons moi et mon binôme faire un programme. Nos cours ne nous permettent pas d’avancer dans le projet, c'est pour cela que nous sollicitons votre aide. Notre projet est le jeu Snake, nous sommes bloqués, nous n'arrivons pas a déplacer le pion à l'aide des touches fléchées. Voici notre programme pour le moment : 

    from tkinter import *
    import random
    
    # Déclaration des fonctions
    # Fonction permettant de réinitialiser le jeu
    def new_game():
        global dx, dy, direction, coord_serpent, flag
        coord_serpent=[50,50,60,60]
        dx=10
        dy=0
        direction=2
        serpent = Canevas.create_rectangle(coord_serpent[0], coord_serpent[1], coord_serpent[2], coord_serpent[3], outline='black',fill='red')
        if flag==0:
            flag=1
            move()
    
    # Fonction permettant de faire déplacer le serpent
    def move ():
        global dx, dy, direction, coord_serpent, flag
        if coord_serpent[0]==x and coord_serpent[1]==y:
            if direction==1:
                x1=coord_serpent[coord-4]
                y1=coord_serpent[coord-3]
                x2=coord_serpent[coord-2]
                y2=coord_serpent[coord-1]
                x1=x1+10
                x2=x2+10
                y2=y2+10
                coord_serpent.append(x1)
                coord_serpent.append(y1)
                coord_serpent.append(x2)
                coord_serpent.append(y2)
                serpent.append(canevas.create_rectangle(x1,y1,x2,y2,fill="red"))
            elif direction==2:
                x1=coord_serpent[coord-4]
                y1=coord_serpent[coord-3]
                x2=coord_serpent[coord-2]
                y2=coord_serpent[coord-1]
                x1=x1-10
                x2=x2-10
                y2=y2+10
                coord_serpent.append(x1)
                coord_serpent.append(y1)
                coord_serpent.append(x2)
                coord_serpent.append(y2)
                serpent.append(canevas.create_rectangle(x1,y1,x2,y2,fill="red"))
            elif direction==3:
                x1=coord_serpent[coord-4]
                y1=coord_serpent[coord-3]
                x2=coord_serpent[coord-2]
                y2=coord_serpent[coord-1]
                y1=y1+10
                y2=y2+10
                coord_serpent.append(x1)
                coord_serpent.append(y1)
                coord_serpent.append(x2)
                coord_serpent.append(y2)
                serpent.append(canevas.create_rectangle(x1,y1,x2,y2,fill="red"))
            elif direction==4:
                x1=coord_serpent[coord-4]
                y1=coord_serpent[coord-3]
                x2=coord_serpent[coord-2]
                y2=coord_serpent[coord-1]
                x2=x2+10
                y2=y2-10
                coord_serpent.append(x1)
                coord_serpent.append(y1)
                coord_serpent.append(x2)
                coord_serpent.append(y2)
                serpent.append(canevas.create_rectangle(x1,y1,x2,y2,fill="red"))
    
                # On fait le serpent avancer
        coord_serpent[0]=coord_serpent[0]+dx
        coord_serpent[1]=coord_serpent[1]+dy
        coord_serpent[2]=coord_serpent[0]+10
        coord_serpent[3]=coord_serpent[1]+10
    
        i=0
        j=0
        if flag!=0:
            Canevas.coords(serpent[j],coord_serpent[i],coord_serpent[i+1],coord_serpent[i+2],coord_serpent[i+3])
            i+=4
            j+=1
        if flag>0:
            Mafenetre.after(50,move)
    
        
    
    
    # Fonction permettant de diriger le serpent
    def left (event):
        global dy,dx, direction, coord_serpent
        if direction!=2:
            dx=-10
            dy=0
            direction=1
    
    def right (event):
        global dy,dx, direction, coord_serpent
        if direction!=1:
            dx=10
            dy=0
            direction=2
    
    def up (event):
        global dy,dx, direction, coord_serpent
        if direction!=4:
            dx=0
            dy=-10
            direction=3
    
    def down (event):
        global dy,dx, direction, coord_serpent
        if direction!=3:
            dx=0
            dy=10
            direction=4
    
    
    
    #dire
    direction=2
    flag=1
    dx=10
    dy=0
    
    # position initiale du pion
    coord_serpent=[50,50,60,60]
    
    # Création de la fenêtre principale
    Mafenetre = Tk()
    Mafenetre.title('Snake')
    # On crée le bouton New game qui va permettre de réinitialiser la partie
    Button(Mafenetre,text="New game",font=("Fixedsys"),command=new_game).grid(row=4,column=1,sticky=N,padx=5)
    Button(Mafenetre,text="Quit",font=("Fixedsys"),command=Mafenetre.destroy).grid(row=6,column=1,sticky=N)
    
    # Création d'un widget Canvas (zone graphique)
    Largeur = 480
    Hauteur = 320
    Canevas = Canvas(Mafenetre, width = Largeur, height =Hauteur, bg ='blue')
    serpent = Canevas.create_rectangle(coord_serpent[0], coord_serpent[1], coord_serpent[2], coord_serpent[3], outline='black',fill='red')
    Canevas.focus_set()
    """Canevas.bind('<Key>',move)
    Canevas.pack(padx =5, pady =5)"""
    
    #Définition des touches pour déplacer le serpent
    Canevas.bind('<Left>',left)
    Canevas.bind('<Right>',right)
    Canevas.bind('<Up>',up)
    Canevas.bind('<Down>',down)
    Canevas.grid(row=0,column=0,rowspan=10)
    
    Mafenetre.mainloop()


    Merci de bien vouloir nous aider !!

    -
    Edité par Jojo12 29 avril 2014 à 15:53:29

    • Partager sur Facebook
    • Partager sur Twitter
      29 avril 2014 à 15:34:03

      Salut,

      je pense que mettre tes lignes de code comme ça ne risque pas d'attirer du monde...

      Utilise </> et tes lignes seront plus agréables à regarder :D

      • Partager sur Facebook
      • Partager sur Twitter
      "La seule façon de découvrir les limites du possible est d'aller au-delà, dans l'impossible." Arthur C. CLARKE
        29 avril 2014 à 15:42:31

        Comment est ce que ça marche ?

        • Partager sur Facebook
        • Partager sur Twitter
          29 avril 2014 à 15:48:06

          re,

          parfait  ;)

          (je ne m'y connais pas trop en codes mais ceux qui s'y connaissent pourront mieux t'aider maintenant)

          -
          Edité par DragonDeath 29 avril 2014 à 15:58:49

          • Partager sur Facebook
          • Partager sur Twitter
          "La seule façon de découvrir les limites du possible est d'aller au-delà, dans l'impossible." Arthur C. CLARKE
            29 avril 2014 à 15:54:18

            Merci je pense que ça doit être bon ! :)
            • Partager sur Facebook
            • Partager sur Twitter
              1 mai 2014 à 12:52:07

              Il faut que tu bouges le serpent et pas que les variables.
              • Partager sur Facebook
              • Partager sur Twitter
              Bevet Breizh! Breizh dizalc'h! Betek an trec'h! Ha mallozh ruz d'ar c'hallaoued! Trouvez votre voie
                2 mai 2014 à 14:59:41

                exemple:

                def right (event):
                    global dy,dx, direction, coord_serpent
                    if direction!=1:
                        dx=10
                        dy=0
                        direction=2

                là, à chaque fois qu'on appuie sur la touche , tu modifie quelque variables, mais tu ne modifies pas le serpent en lui-même! Je te conseille de créer une fonction update() qui va te permettre de recréer le serpent après chaque modification. Tu appelles cette fonction à chaque fin de fonction right(), left(), down() et up() et le tour est joué!

                • Partager sur Facebook
                • Partager sur Twitter
                Bevet Breizh! Breizh dizalc'h! Betek an trec'h! Ha mallozh ruz d'ar c'hallaoued! Trouvez votre voie
                  2 mai 2014 à 16:16:56

                  Comment marche cette fonction ? Il n'y a rien sur Internet et je suis débutant... 

                  En fait dans cette fonction je met quoi ? Les nouvelles coordonnées du serpent ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 mai 2014 à 18:05:31

                    la fonction update, c'est à toi de la créer!

                    dedans, tu mets dequoi recréer ton serpent en fonction des variables que tu as modifié!

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Bevet Breizh! Breizh dizalc'h! Betek an trec'h! Ha mallozh ruz d'ar c'hallaoued! Trouvez votre voie
                      8 mai 2014 à 15:02:54

                      Bon j'ai complètement refait mon programme mais j'ai toujours un problème, le mouvement continue du serpent c'est à dire que dès que j'appuis sur la touche de direction (touches fléchées) mon serpent (pixel) doit continuer à avancer tout seul de manière automatique , il faut bien utiliser la fonction after non ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 mai 2014 à 15:13:42

                        Jojo12 a écrit:

                        il faut bien utiliser la fonction after non ?

                        une fonction récursive avec after, oui, c'est une bonne idée...

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Bevet Breizh! Breizh dizalc'h! Betek an trec'h! Ha mallozh ruz d'ar c'hallaoued! Trouvez votre voie
                          9 mai 2014 à 2:12:26

                          @Jojo12 : Tu n'es pas le premier à poster ici pour le projet d'ISN. C'est la 3e fois que j'en vois.
                          Je vais essayer de t'aider du mieux que je peux, en attendant, je te conseille vivement d'aller lire le tuto sur le Python, les 2 premières parties et le chapitre sur Tkinter suffiront (le reste est pas facile à assimiler, mieux vaut le lire plus tard quand tu auras le temps).

                          Tu as recommencé une fois ton Snake. Dommage, j'arrive trop tard ^^
                          Je pense que tu peux recommencer, parce qu'un snake, c'est pas évident quand c'est son premier projet. Pour ça, je vais tenter de te mettre sur une bonne voie.

                          Pour commencer, le module pygame est bien plus adapté que Tkinter pour se genre de choses. Il y a aussi un tuto sur ce site, c'est assez facile prendre en main.

                          Sinon, tu dois bien réfléchir avant de commencer un programme, comment tu vas le structurer.
                          D'abord, il te faut une fonction pour déplacer le serpent, qui prendra en paramètre la direction :

                          GAUCHE = 0
                          DROITE = 1
                          HAUT = 2
                          BAS = 3
                          
                          def move(direction) :
                              global canvas, id_serpent
                              coord = canvas.coords(id_serpent)  # on récupère les coordonnées du serpent
                              w = coord[2] - coord[0]        # on calcule la largeur
                              h = coord[3] - coord[1]        # puis la hauteur
                          
                              if direction == GAUCHE :
                                  coord[0] -= 10
                                  if coord[0] < 0 :    # Si on dépasse la fenêtre sur la gauche,
                                      coord[0] = largeur_fenetre # on fait repartir le snake à droite.
                              elif direction == DROITE :
                                  coord[0] -= 10       # Si on dépasse la fenêtre sur la droite,
                                  if coord[0] > largeur_fenetre : # on fait repartir le snake à gauche.
                                      coord[0] = 0
                              elif direction == HAUT :
                                  coord[1] -= 10
                                  if coord[1] < 0 :
                                      coord[1] = hauteur_fenetre
                              elif direction == BAS :
                                  coord[1] += 10
                                  if coord[1] > hauteur_fenetre :
                                      coord[1] = 0
                          
                              # on recalcule les coordonnées du point bas-droit du rectangle
                              coord[2] = coord[0] + w # sur x
                              coord[3] = coord[1] + h # sur y
                          
                              canvas.coords(id_serpent, coord[0], coord[1], coord[2], coord[3])

                          Quelques explications :
                           - quand tu crée un rectangle de cette manière : id_rect = canvas.create_rectangle(x1, y1, x2, y2), id_rect ne contient pas un rectangle, mais simplement un entier qui représente l'identifiant de l'objet rectangle qui vient d'être créé.
                           - coord = canvas.coords(id_rect) permet de récupérer les coordonnées du rectangle qui a pour identifiant id_rect.
                           - canvas.coords(id_rect, x1, y1, x2, y2) permet de redéfinir les nouvelles coordonnées du rectangle qui a pour identifiant id_rect.
                           - coord contient les coordonnées du point haut-gauche et du point bas-droit du rectangle.

                          Pour récupérer la largeur et la hauteur de ce rectangle, je fais donc la différence entre les abscisses (largeur) et la différence entre les ordonnées (hauteur) des deux points du rectangle. Je les mets directement dans coord[2] et coord[3] qui contenaient respectivement l'abscisse et l'ordonnée du point bas-droit.
                          Une fois la largeur et la hauteur récupérées, je leurs ajoute à la fin les nouvelles coordonnées du point haut-gauche.
                          Par exemple :

                          # Au début, coord contient [20, 30, 40, 50].
                          coord[2] -= coord[0] # coord[2] = 20
                          coord[3] -= coord[1] # coord[3] = 20
                          
                          coord[0] += 10 # coord[0] = 30
                          coord[1] += 20 # coord[1] = 50
                          
                          coord[2] += coord[0] # coord[2] = 50
                          coord[3] += coord[1] # coord[3] = 70
                          
                          # 50 - 30 = 30 et 70 - 50 = 20, la largeur et la hauteur sont restées les mêmes.

                          Ensuite tes fonctions left, right, up et down ressembleront à :

                          fenetre = Tk()
                          canvas = Canvas(fenetre, Largeur, Hauteur, bg = 'orange')
                          ancienne_direction = 0
                          id_serpent = canvas.create_rectangle(x1, x2, y1, y2) # je te laisse définir x1, x2, y1 et y2
                          
                          # je donne que right pour l'exemple
                          def right(event) :
                              global ancienne_direction
                              if ancienne_direction != LEFT :
                                  move(RIGHT)
                                  ancienne_direction = RIGHT

                           Normalement c'est très déconseillé d'utiliser les variables globales. Mais avec Tkinter, le mieux est de tout mettre dans une classe et je ne pense pas que tu saches ce que c'est ni que tu n'ai le temps d'apprendre. Ma version est déjà plus intuitive et beaucoup plus simple, je pense que ça t'aidera.

                          -
                          Edité par Escargotine 11 mai 2014 à 21:45:13

                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 mai 2014 à 13:47:09

                            Merci louk, je vais essayer avec ta méthode mais le problème c'est que je me perds avec les coordonées..
                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 mai 2014 à 14:01:39

                              Effectivement, j'ai pas pensé à préciser à quoi correspond chaque coord[n].
                              coord[0] -> x1
                              coord[1] -> y1
                              coord[2] -> x2
                              coord[3] -> y2

                              Pour dessiner un rectangle, le canvas utilise deux points : le point haut-gauche et le point bas-droit du rectangle :

                              (x1 ; y1)______________________________________________
                               |                                                     |
                               |                                                     |
                               |                                                     |
                               |                                                     |
                               |____________________________________________ (x2 ; y2)

                              Pour calculer la largeur, je soustraie donc x2 par x1, pareil avec les y pour la hauteur.

                              Je modifie mon code pour que ce soit plus clair.

                              EDIT : J'ai confondu avec pygame. J'ai corrigé mon poste.

                              -
                              Edité par Escargotine 10 mai 2014 à 14:13:03

                              • Partager sur Facebook
                              • Partager sur Twitter
                                10 mai 2014 à 15:11:36

                                Ah d'accord merci !! je vais donc essayer de cette façon mais je garanti rien..

                                Sinon j'ai un petit problème sur mon code que j'ai recommencé au niveau de la fonction (food), mon serpent n'arrive pas a manger la nourriture générée, voici mon code  :

                                from tkinter import*
                                from random import randrange
                                import time 
                                
                                # Base
                                hauteur_canevas = 400
                                largeur_canevas = 580
                                Taille_Serpent = 10
                                PosX_Serpent = 290
                                PosY_Serpent = 190
                                Score = 0
                                flag = 1
                                vitesse = 3
                                flag1 = 0
                                eat = 0
                                # Fonction
                                
                                def Clavier(event):
                                        """ Gestion de l'événement Appui sur une touche du clavier """
                                        global PosX,PosY,flag, right, left, up, down
                                        touche = event.keysym
                                        print(touche)
                                        right, left, up, down=False,False,False,False
                                        # déplacement vers la droite
                                        if touche == 'Right':
                                                right=True
                                                move(0)
                                        # déplacement vers la gauche
                                        if touche == 'Left':
                                                left=True
                                                move(1)
                                        # déplacement vers le haut
                                        if touche == 'Up':
                                                up=True
                                                move(2)
                                
                                         # déplacement vers le bas
                                        if touche == 'Down':
                                                down=True
                                                move(3)
                                                
                                        # on dessine le pion à sa nouvelle position
                                        canevas.coords(Serpent,PosX -7, PosY -7, PosX +7, PosY +7)
                                
                                
                                # Fonction nourriture
                                def food ():
                                        global eat,x,y,f,posX, posY
                                        if eat==1:
                                                x=randrange(10,480,10)
                                                y=randrange(10,280,10)
                                                i=0
                                                i2=0
                                                while i<len(posX, posY):
                                                        i2=1
                                                        if x==posX [i] and y==posY [i+1]:
                                                            while x==posX [i] and y==posY [i+1]:
                                                                    x=randrange(10,480,10)
                                                                    y=randrange(10,280,10)
                                                            i=0
                                                            i2=0
                                                        if i2==1:
                                                            i+=4
                                                f=canevas.create_oval(x,y,x+11,y+11,fill="green")
                                                eat=0
                                        if posX==x and posY==y:
                                                canevas.delete(f)
                                                
                                
                                #Mettre le jeu en Pause
                                
                                def pause(event=None):
                                        global flag
                                        flag = 0
                                
                                #Lancer le jeu
                                def play(event=None):
                                        global flag
                                        flag = 1
                                
                                
                                #Mouvement
                                
                                def move(x):
                                    global Serpent, vitesse, PosX, PosY, right, left, up, down
                                    if x == 0 and right==True and flag==1:
                                        if PosX<465:
                                            PosX +=  vitesse
                                        else:
                                            PosX=20
                                        print('c',PosX)
                                        canevas.after(10,move,0)
                                    elif x == 1 and left==True and flag==1:
                                        if PosX>17:
                                            PosX -=  vitesse
                                        else:
                                            PosX=460
                                        print('d',PosX)
                                        canevas.after(10,move,1)
                                    elif x == 2 and up==True and flag==1:
                                        if PosY>17:
                                            PosY -=  vitesse
                                        else:
                                            PosY=300
                                        print('e',PosY)
                                        canevas.after(10,move,2)
                                    elif x == 3 and down==True and flag==1:
                                        if PosY<303:
                                            PosY +=  vitesse
                                        else:
                                            PosY=20
                                        print('f',PosY)
                                        canevas.after(10,move,3)
                                    canevas.coords(Serpent,PosX -7, PosY -7, PosX +7, PosY +7)
                                
                                                
                                
                                
                                def newGame ():
                                        global flag1, flag, f, eat, Serpent, vitesse, PosX, PosY
                                        flag1=0
                                        canevas.delete(ALL)
                                        PosX = 290
                                        PosY = 190
                                        Serpent = canevas.create_rectangle(PosX-7,PosY-7,PosX+7,PosY+7,width=2,fill='red')
                                        eat=0
                                        x=randrange(10,480,10)
                                        y=randrange(10,280,10)
                                        f=canevas.create_oval(x,y,x+11,y+11,fill="green")
                                        vitesse=3
                                        canevas.create_rectangle(0,0,10,500,fill="black")
                                        canevas.create_rectangle(0,0,500,10,fill="black")
                                        canevas.create_rectangle(472,0,500,500,fill="black")
                                        canevas.create_rectangle(0,400,500,310,fill="black")
                                        if flag==0:
                                            flag=1
                                            
                                        
                                
                                
                                
                                #####################################################################################################
                                
                                
                                #Fenêtre de Jeu
                                Mafenetre=Tk()
                                Mafenetre.title('Snake!')
                                
                                 
                                # Le cannevas dans lequel apparaîtront les dessins
                                canevas = Canvas(Mafenetre, bg='white', height=320, width=480)
                                canevas.pack(side=TOP)
                                canevas.pack()
                                
                                # position initiale du pion
                                PosX = 290
                                PosY = 190
                                 
                                # Création d'un widget Canvas (zone graphique)
                                Serpent = canevas.create_rectangle(PosX-7,PosY-7,PosX+7,PosY+7,width=2,fill='red')
                                canevas.focus_set()
                                canevas.bind('<Key>',Clavier)
                                
                                # Délimitations des limites (Création des murs) que le serpent ne doit outre passer pour ne pas finir dans le mur XD !!
                                canevas.create_rectangle(0,0,10,500,fill="black")
                                canevas.create_rectangle(0,0,500,10,fill="black")
                                canevas.create_rectangle(472,0,500,500,fill="black")
                                canevas.create_rectangle(0,400,500,310,fill="black")
                                
                                
                                # Bouton Pause, Nouveau jeu et Quitter
                                Bouton_quitter=Button(Mafenetre,text='Quitter',command=Mafenetre.destroy)
                                Bouton_quitter.pack(side = LEFT, padx = 10, pady = 10)
                                
                                Bouton_pause=Button(Mafenetre,text=' Pause ', command = pause)
                                Bouton_pause.pack(side = TOP, padx = 10, pady = 10)
                                
                                Bouton_reprendre=Button(Mafenetre,text='Reprendre',command = play)
                                Bouton_reprendre.pack(side = RIGHT,padx = 10, pady = 10)
                                
                                Bouton_newGame=Button(Mafenetre,text="New game",command=newGame)
                                Bouton_newGame.pack(side = BOTTOM, padx = 10, pady = 10)
                                
                                
                                """Button(Mafenetre,text="Quit",font=("Fixedsys"),command=Mafenetre.destroy)"""
                                
                                # On dessine le 1er tas de nourriture
                                x=randrange(10,480,10)
                                y=randrange(10,280,10)
                                f=canevas.create_oval(x,y,x+11,y+11,fill="green")
                                
                                Mafenetre.mainloop()



                                • Partager sur Facebook
                                • Partager sur Twitter
                                  10 mai 2014 à 15:48:12

                                  Avant de parler de la fonction food(), tu as des choses facilement améliorable dans tes fonctions Clavier() et move().
                                  Tes variables left, right, up et down ne servent à rien. Tu envoies 0 à move, ce qui représente 'Right', d'après ton code. Donc pourquoi définir un booléen en plus pour dire que c'est right ? C'est du pléonasme ^^ En programmation, on dit plutôt que c'est redondant.
                                  De plus, utiliser des valeurs "magiques" est déconseillé en programmation. Si tu utilises un mot à la place de ces valeurs, c'est plus lisible et on comprend tout de suite ce que tu veux faire :

                                  LEFT = 0
                                  RIGHT = 1
                                  UP = 2
                                  DOWN 3
                                  
                                  def Clavier(event) :
                                      if event.keysym == 'Right' :
                                          move(RIGHT)
                                      if event.keysym == 'LEFT' :
                                          move(LEFT)
                                      # etc...

                                  En plus, si jamais tu veux changer les valeurs représentant la gauche, la droite, vers le haut et vers le bas pour x raison, tu n'as pas besoin de repasser tout ton code. Tu as juste à changer les valeurs de LEFT, RIGHT, UP et DOWN.

                                  Avec les variables left, right, up et down, je suppose que tu as voulu imiter ce que j'avais fait :

                                  def right(event) :
                                      if direction_courante != LEFT :
                                          move(RIGHT)
                                          direction_courante = RIGHT

                                  Sauf que dans mon exemple, je vérifie si la direction courante du serpent n'est pas à l'opposé de la nouvelle direction (la tête du serpent ne peut pas faire demi-tour sur place).
                                  Ici, ça donnerait :

                                  direction_courante = -1
                                  
                                  # les fonctions que tu as définies
                                  # [...]
                                  
                                  def move(x) :
                                      global PosX, PosY, vitesse
                                      if x == LEFT and direction_courante != RIGHT :
                                          PosX -= vitesse
                                          direction_courante = LEFT
                                      if x == RIGHT and direction_courante != LEFT :
                                          PosX += vitesse
                                          direction_courante = RIGHT
                                      # pareil pour UP et DOWN

                                  D'ailleurs, ce n'est pas move qui doit se charger de redéfinir le snake. Je te conseille de créer une fonction update() qui met à jour le snake en fonction de PosX et PosY, qui se rappelle si le jeu n'est pas en pause :

                                  pause = False
                                  RECALL_TIME = 40
                                  
                                  # les fonctions que tu as définies
                                  # [...]
                                  
                                  def update() :
                                      global canvas
                                      if pause :
                                          return
                                      else :
                                          canvas.after(RECALL_TIME, update)
                                      # mise à jour du Snake
                                      # [...]
                                  
                                  def pause(event = None) :
                                      pause = True
                                  
                                  def resume(event = None) :
                                      global canvas
                                      if not pause :
                                          pause = True
                                          canvas.after(RECALL_TIME, update)

                                  La fonction update() vérifie si on est en pause. Si pause = True, elle ne fait rien et ne se relance pas non plus, puis s'arrête (le return permet d'arrêter la fonction sur le champs). Si pause = False, elle se relance puis effectue la mise à jour du snake.

                                  Maintenant, la fonction food(). Tu as pas mal de choses bizarre et incorrects dedans.
                                  D'abord, je ne vois pas ce que tu voulais faire en faisant len(posX, posY). La fonction len ne prend qu'un seul paramètre : une liste, un tuple, un dictionnaire ou un conteneur quelconque (c'est pas tout à fait vrai, mais tu n'as pas l'air d'avoir la notion de classe et d'objet, qui sont nécessaires pour expliquer ce que fait vraiment len() ).

                                  Ensuite, tu déclares les deux variables globales posX et posY. Mais elles n'existent pas, tu en a deux qui s'appellent PosX et PosY mais Python fait la différence entre majuscules/minuscules. Tu les utilisent comme des objets indexables : posX[i] alors que ce sont de simples entiers, ça ne peut pas marcher. Là non plus, je ne sais pas ce que tu souhaitais faire.

                                  De toute manière, ta fonction food() est une mauvaise idée tel quel. Tu devrais plutôt l'appeler create_food() et ne faire que la création de nouvelles coordonnées pour l'objet food :

                                  foodX, foodY = -1, -1
                                  
                                  # Les fonctions que tu as définies :
                                  # [...]
                                  
                                  # Génération aléatoire de nouvelles coordonnées pour la nourriture :
                                  def create_food() :
                                      global canvas
                                      foodX = randrange(10, 480, 10)
                                      foodY = randrange(10, 280, 10)
                                      while foodX == PosX and foodY == PosY :
                                          foodX = randrange(10, 480, 10)
                                          foodY = randrange(10, 280, 10)
                                      canvas.delete(food)
                                      food = canvas.create_oval(x, y, x+11, y+11, fill="yellow")

                                  Et dans ta fonction update, tu teste si les coordonnées actuelles du serpent sont égales à celles de foodX et foodY. Si c'est le cas, tu appelles create_food(). Sauf que pour ça, il faut que la vitesse du snake soit un multiple de 10 (où 10 divisé par un mutliple de 2) et pareil pour ses coordonnées de départ. Pourquoi ? Parce que tu génères des coordonnées pour food qui sont multiples de 10. Et donc les coordonnées du serpent doivent aussi être un multiple de 10 au moment il le serpent arrive sur l'objet food.

                                  PS : Si tu déclares tes variables globales tout en haut, avant les fonctions qui les utilisent, tu n'as pas besoin de déclarer "globale maVarGlobale" dans chaque fonction.

                                  -
                                  Edité par Escargotine 11 mai 2014 à 21:49:54

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    10 mai 2014 à 22:31:34

                                    Merci de ton aide alors j'ai essayer de faire se que tu ma dit mais ça m'a mit cette erreur : line 1920, in pack_configure
                                        + self._options(cnf, kw))
                                    _tkinter.TclError: bad side "0": must be top, bottom, left, or right
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      11 mai 2014 à 14:17:37

                                      Ah. Mais ça ne suffit pas, tu peux mettre tout le traceback derrière ? En gros, tout ce qu'affiche Python quand l'erreur apparait. Parce que là, je vois pas qu'est-ce qui ne va pas. Et je ne maîtrise pas trop Tkinter.

                                      EDIT : Poste carrément tout le code de la fonction où l'erreur apparaît.

                                      -
                                      Edité par Escargotine 11 mai 2014 à 14:47:05

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        11 mai 2014 à 15:02:31

                                        Moi non plus je ne maîtrise pas trop, mais pour le moment je préfère laisser mon code comme ça tant qu'il marche car je galère pas mal donc il me reste plus qu'à créer une fonction qui lorsque le serpent passe sur la nourriture il s'allonge d'un carré, avec aussi tout se qui va a coté comme s'il se coupe la partie est perdu, ou qu'il ne puisse pas aller dans la direction opposé cad faire un demi tour sur place
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          11 mai 2014 à 16:26:07

                                          Jojo12 a écrit:

                                          Moi non plus je ne maîtrise pas trop, mais pour le moment je préfère laisser mon code comme ça tant qu'il marche

                                          En programmation, c'est très déconseillé de penser de cette façon. Plus on cherche à améliorer son code, mieux c'est pour le maintenir et le faire évoluer plus tard.
                                          Quand on développe un programme, il y a plusieurs étapes importantes :
                                          - phase de conception (prend normalement environ la moitié du temps pour un programme comme le tiens) : on réfléchie comment on va organiser le code sans réfléchir aux détails;
                                          - phase de développement : on fait le minimum de code fonctionnel sans commencer d'amélioration;
                                          - phase de test : une fois le code fonctionnel, on fait le "ménage" : on vérifie qu'il n'y a pas du code en double, des variables inutiles, un algorithme simplifiable etc... Parfois on repasse par une phase de conception (quand on tombe sur un problème d'organisation qui rend la tâche difficile pour ajouter une fonctionnalité);
                                          - notre code est fonctionnel ET nettoyé : le code est propre et bien structuré, on peut ajouter une fonctionnalité au programme. Puis on repasse par une phase de tests (qui fera peut-être repasser par une phase de conception).

                                          Vu que c'est surement ton premier programme, je ne vais pas t'embêter avec ça maintenant. Mais je te le dis pour les prochaines fois, c'est très important de bien réfléchir avant de se jeter sur l'ordi pour commencer à coder.

                                          Pour en revenir à ton erreur, je tiens à savoir pourquoi tu as cette erreur. Tu peux poster le code là où le programme s'arrête quand Python affiche une erreur ? Si ça se trouve, elle est toute simple.

                                          EDIT : J'insiste parce qu'il y a un truc auquel les débutants ne pensent pas forcément : ça donne pas envie de chercher une erreur dans un code un peu brouillon et mal structuré. C'est, avec le fait qu'on veuille aussi aider au long terme (plutôt que de vous pêcher le poisson, on préfère évidemment vous apprendre à le pêcher), une des raisons pour lesquelles on va vous pousser à réfléchir sur l'organisation du code : ça nous sera plus facile pour aider.
                                          Je généralise peut-être mais en tout cas, c'est comme ça que je fonctionne et d'autres aussi.

                                          -
                                          Edité par Escargotine 11 mai 2014 à 21:41:01

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            11 mai 2014 à 17:06:22

                                            Mais le problème c'est que je dois rendre mon dossier ce mois ci, donc je retravail et j'améliore mon code. Je crois que j'ai pas assez réfléchis comment m'organiser et je me suis lancé tout de suite dans la programmation. Sinon voici mon code 
                                            from tkinter import*
                                            from random import randrange
                                            import time 
                                            
                                            # Base
                                            hauteur_canevas = 400
                                            largeur_canevas = 580
                                            Taille_Serpent = 10
                                            PosX_Serpent = 290
                                            PosY_Serpent = 190
                                            Score = 0
                                            flag = 1
                                            vitesse = 3
                                            flag1 = 0
                                            eat = 0
                                            score = 0
                                            # Fonction
                                            
                                            def Clavier(event):
                                                    """ Gestion de l'événement Appui sur une touche du clavier """
                                                    global PosX,PosY,flag, right, left, up, down
                                                    touche = event.keysym
                                                    print(touche)
                                                    right, left, up, down=False,False,False,False
                                                    # déplacement vers la droite
                                                    if touche == 'Right':
                                                            right=True
                                                            move(0)
                                                    # déplacement vers la gauche
                                                    if touche == 'Left':
                                                            left=True
                                                            move(1)
                                                    # déplacement vers le haut
                                                    if touche == 'Up':
                                                            up=True
                                                            move(2)
                                            
                                                     # déplacement vers le bas
                                                    if touche == 'Down':
                                                            down=True
                                                            move(3)
                                                            
                                                    # on dessine le pion à sa nouvelle position
                                                    canevas.coords(Serpent,PosX -7, PosY -7, PosX +7, PosY +7)
                                            
                                            
                                            """# Fonction nourriture
                                            def food ():
                                                    global eat,x,y,f,posX, posY
                                                    if eat==1:
                                                            x=randrange(10,480,10)
                                                            y=randrange(10,280,10)
                                                            i=0
                                                            i2=0
                                                            while i<len(posX, posY):
                                                                    i2=1
                                                                    if x==posX [i] and y==posY [i+1]:
                                                                        while x==posX [i] and y==posY [i+1]:
                                                                                x=randrange(10,480,10)
                                                                                y=randrange(10,280,10)
                                                                        i=0
                                                                        i2=0
                                                                    if i2==1:
                                                                        i+=4
                                                            f=canevas.create_oval(x,y,x+11,y+11,fill="green")
                                                            eat=0
                                                    if posX==x and posY==y:
                                                            canevas.delete(f)"""
                                            foodX, foodY = -1, -1
                                            def create_food() :
                                                global canevas
                                                foodX = randrange(10, 480, 10)
                                                foodY = randrange(10, 280, 10)
                                                while foodX == PosX and foodY == PosY :
                                                    foodX = randrange(10, 480, 10)
                                                    foodY = randrange(10, 280, 10)
                                                canevas.delete(food)
                                                food = canevas.create_oval(x, y, x+11, y+11, fill="yellow")
                                            
                                                            
                                            
                                            #Mettre le jeu en Pause
                                            
                                            def pause(event=None):
                                                    global flag
                                                    flag = 0
                                                    if flag==0:
                                                            pause=canevas.create_text(250,110,font=('geneva',22),text="PAUSE")
                                                    
                                            #Lancer le jeu
                                            def play(event=None):
                                                    global flag
                                                    flag = 1
                                                    if flag==1:
                                                            canevas.delete(pause)
                                                            move(0)
                                                            move(1)
                                                            move(2)
                                                            move(3)
                                                   
                                                            
                                            
                                            
                                            #Mouvement
                                            
                                            def move(x):
                                                global Serpent, vitesse, PosX, PosY, right, left, up, down
                                                if x == 0 and right==True and flag==1:
                                                    if PosX<465:
                                                        PosX +=  vitesse
                                                    else:
                                                        PosX=20
                                                    print('c',PosX)
                                                    canevas.after(10,move,0)
                                                elif x == 1 and left==True and flag==1:
                                                    if PosX>17:
                                                        PosX -=  vitesse
                                                    else:
                                                        PosX=460
                                                    print('d',PosX)
                                                    canevas.after(10,move,1)
                                                elif x == 2 and up==True and flag==1:
                                                    if PosY>17:
                                                        PosY -=  vitesse
                                                    else:
                                                        PosY=300
                                                    print('e',PosY)
                                                    canevas.after(10,move,2)
                                                elif x == 3 and down==True and flag==1:
                                                    if PosY<303:
                                                        PosY +=  vitesse
                                                    else:
                                                        PosY=20
                                                    print('f',PosY)
                                                    canevas.after(10,move,3)
                                                canevas.coords(Serpent,PosX -7, PosY -7, PosX +7, PosY +7)
                                                if PosX==x and PosX==y and PosY==x and PosY==y:
                                                        canevas.delete(f)
                                                        eat=1
                                                        score=score+10
                                                        if right==True:
                                                                x1=PosX and PosY[coord-4]
                                                                y1=PosX and PosY[coord-3]
                                                                x2=PosX and PosY[coord-2]
                                                                y2=PosX and PosY[coord-1]
                                                                x1=x1+10
                                                                x2=x2+10
                                                                y2=y2+10
                                                                PosX and PosY.append(x1)
                                                                PosX and PosY.append(y1)
                                                                PosX and PosY.append(x2)
                                                                PosX and PosY.append(y2)
                                                                Serpent.append(canevas.create_rectangle(x1,y1,x2,y2,fill="red"))
                                                        
                                            ### continuer avec left up down
                                                            
                                            
                                            
                                            def newGame ():
                                                    global flag1, flag, f, eat, Serpent, vitesse, PosX, PosY
                                                    flag1=0
                                                    canevas.delete(ALL)
                                                    PosX = 290
                                                    PosY = 190
                                                    Serpent = canevas.create_rectangle(PosX-7,PosY-7,PosX+7,PosY+7,width=2,fill='red')
                                                    eat=0
                                                    x=randrange(10,480,10)
                                                    y=randrange(10,280,10)
                                                    f=canevas.create_oval(x,y,x+11,y+11,fill="green")
                                                    vitesse=3
                                                    canevas.create_rectangle(0,0,10,500,fill="black")
                                                    canevas.create_rectangle(0,0,500,10,fill="black")
                                                    canevas.create_rectangle(472,0,500,500,fill="black")
                                                    canevas.create_rectangle(0,400,500,310,fill="black")
                                                    if flag==0:
                                                        flag=1
                                                        
                                                    
                                            
                                            
                                            
                                            #####################################################################################################
                                            
                                            
                                            #Fenêtre de Jeu
                                            Mafenetre=Tk()
                                            Mafenetre.title('Snake!')
                                            
                                             
                                            # Le cannevas dans lequel apparaîtront les dessins
                                            canevas = Canvas(Mafenetre, bg='white', height=320, width=480)
                                            canevas.pack(side=TOP)
                                            canevas.pack()
                                            
                                            # position initiale du pion
                                            PosX = 290
                                            PosY = 190
                                             
                                            # Création d'un widget Canvas (zone graphique)
                                            Serpent = canevas.create_rectangle(PosX-7,PosY-7,PosX+7,PosY+7,width=2,fill='red')
                                            canevas.focus_set()
                                            canevas.bind('<Key>',Clavier)
                                            
                                            # Délimitations des limites (Création des murs) que le serpent ne doit outre passer pour ne pas finir dans le mur XD !!
                                            canevas.create_rectangle(0,0,10,500,fill="black")
                                            canevas.create_rectangle(0,0,500,10,fill="black")
                                            canevas.create_rectangle(472,0,500,500,fill="black")
                                            canevas.create_rectangle(0,400,500,310,fill="black")
                                            
                                            
                                            # Bouton Pause, Nouveau jeu et Quitter
                                            Bouton_quitter=Button(Mafenetre,text='Quitter',command=Mafenetre.destroy)
                                            Bouton_quitter.pack(side = LEFT, padx = 10, pady = 10)
                                            
                                            Bouton_pause=Button(Mafenetre,text=' Pause ', command = pause)
                                            Bouton_pause.pack(side = TOP, padx = 10, pady = 10)
                                            
                                            Bouton_reprendre=Button(Mafenetre,text='Reprendre',command = play)
                                            Bouton_reprendre.pack(side = RIGHT,padx = 10, pady = 10)
                                            
                                            Bouton_newGame=Button(Mafenetre,text="New game",command=newGame)
                                            Bouton_newGame.pack(side = BOTTOM, padx = 10, pady = 10)
                                            
                                            
                                            """Button(Mafenetre,text="Quit",font=("Fixedsys"),command=Mafenetre.destroy)"""
                                            
                                            # On dessine le 1er tas de nourriture
                                            x=randrange(10,480,10)
                                            y=randrange(10,280,10)
                                            f=canevas.create_oval(x,y,x+11,y+11,fill="green")
                                            
                                            Mafenetre.mainloop()

                                            -
                                            Edité par Jojo12 11 mai 2014 à 20:13:59

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              11 mai 2014 à 18:05:49

                                              Pense bien à sélectionner le bon langage quand tu poste un code. Modifie ton message qu'il considère que ton code est du python. Clique sur le bouton Modifier de ton message, ensuite clique sur "voir le HTML" en bas à gauche.
                                              Une petite fenêtre s'ouvre, c'est du HTML dedans mais rien de très compliqué. Cherche <pre classe="brush: as3;"> et remplace as3 (qui est un langage assembleur) et remplace-le par python. Puis clique sur "Mettre à jour", puis sur le bouton "Envoyer".

                                              Sinon, je ne comprends pas où est le problème. Chez moi, ça fonctionne correctement. Par contre, j'ai dû rajouter la ligne :

                                              #-*- coding: utf-8 -*-

                                              tout au début, en premier (qui dit à python d'utiliser l'UTF-8 pour l'encodage des caractères), pour que ça fonctionne.

                                              -
                                              Edité par Escargotine 11 mai 2014 à 18:06:38

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                11 mai 2014 à 18:30:50

                                                louk a écrit:

                                                Pense bien à sélectionner le bon langage quand tu poste un code. Modifie ton message qu'il considère que ton code est du python. Clique sur le bouton Modifier de ton message, ensuite clique sur "voir le HTML" en bas à gauche.
                                                Une petite fenêtre s'ouvre, c'est du HTML dedans mais rien de très compliqué. Cherche <pre classe="brush: as3;"> et remplace as3 (qui est un langage assembleur) et remplace-le par python. Puis clique sur "Mettre à jour", puis sur le bouton "Envoyer".


                                                Plus simple:

                                                Et ensuite tu choisis dans la liste des langages celui qui te conviens:

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Précepte: Le mieux est l'ennemi du bien
                                                  11 mai 2014 à 19:07:40

                                                  Ça, c'est quand t'as pas encore posté le code. Mais quand tu l'as déjà posté, je préfères aller voir dans le HTML.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    11 mai 2014 à 20:17:25

                                                    Mince autant pour moi, je pense que ça doit être bon.

                                                    Je comprend pas l'UTF-8 pour l'encodage des caractères, c'est à dire à quoi ça sert ? et qu’es que cela change dans le code ?(désolé je débute..) 

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      11 mai 2014 à 20:49:39

                                                      L'encodage, c'est la manière dont les caractères sont codés dans la mémoire. Il se trouve que sur Linux (Mac, je sais pas) l'encodage par défaut est UTF-8. Mais pas sur windows, donc obligé de le préciser. Conventionnellement, on devrait toujours indiquer l'encodage des caractères.
                                                      Sur windows, Python ne voulais même pas interpréter mon code pour cette raison. Mais dans d'autres langages, ça change juste que les accents affichent d'autres caractères (ce qui rend l'affichage un peu spécial).
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        11 mai 2014 à 21:23:32

                                                        Ah d'accord merci, et sinon pourquoi mon serpent ne mange pas le pixel ?

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          11 mai 2014 à 21:38:11

                                                          Ça, je l'ai déjà expliqué dans un de mes message précédent.

                                                          louk a écrit:

                                                          Maintenant, la fonction food(). Tu as pas mal de choses bizarre et incorrects dedans.
                                                          D'abord, je ne vois pas ce que tu voulais faire en faisant len(posX, posY). La fonction len ne prend qu'un seul paramètre : une liste, un tuple, un dictionnaire ou un conteneur quelconque (c'est pas tout à fait vrai, mais tu n'as pas l'air d'avoir la notion de classe et d'objet, qui sont nécessaires pour expliquer ce que fait vraiment len() ).

                                                          Ensuite, tu déclares les deux variables globales posX et posY. Mais elles n'existent pas, tu en a deux qui s'appellent PosX et PosY mais Python fait la différence entre majuscules/minuscules. Tu les utilisent comme des objets indexables : posX[i] alors que ce sont de simples entiers, ça ne peut pas marcher. Là non plus, je ne sais pas ce que tu souhaitais faire.

                                                          De toute manière, ta fonction food() est une mauvaise idée tel quel. Tu devrais plutôt l'appeler create_food() et ne faire que la création de nouvelles coordonnées pour l'objet food :

                                                          foodX, foodY = -1, -1
                                                          
                                                          # Les fonctions que tu as définies :
                                                          # [...]
                                                          
                                                          # Génération aléatoire de nouvelles coordonnées pour la nourriture :
                                                          def create_food() :
                                                              global canvas
                                                              foodX = randrange(10, 480, 10)
                                                              foodY = randrange(10, 280, 10)
                                                              while foodX == PosX and foodY == PosY :
                                                                  foodX = randrange(10, 480, 10)
                                                                  foodY = randrange(10, 280, 10)
                                                              canvas.delete(food)
                                                              food = canvas.create_oval(x, y, x+11, y+11, fill="yellow")

                                                          Et dans ta fonction update, tu teste si les coordonnées actuelles du serpent sont égales à celles de foodX et foodY. Si c'est le cas, tu appelles create_food(). Sauf que pour ça, il faut que la vitesse du snake soit un multiple de 10 (où 10 divisé par un mutliple de 2) et pareil pour ses coordonnées de départ. Pourquoi ? Parce que tu génères des coordonnées pour food qui sont multiples de 10. Et donc les coordonnées du serpent doivent aussi être un multiple de 10 au moment il arrive sur l'objet food pour que leurs coordonnées coïncident.

                                                          -
                                                          Edité par Escargotine 11 mai 2014 à 21:52:33

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Probleme snake Tkinter

                                                          × 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