Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme snake Tkinter

    11 mai 2014 à 21:52:42

    Sur cette base ? 
    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")
    
    • Partager sur Facebook
    • Partager sur Twitter
      11 mai 2014 à 21:54:18

      Ce code est à reprendre pour créer un nouveau tas de nourriture, mais ce n'est pas ça qui résout le problème. En tout, c'est dans le même message que j'y réponds. J'ai édité mon dernier poste.

      -
      Edité par Escargotine 11 mai 2014 à 21:55:00

      • Partager sur Facebook
      • Partager sur Twitter
        11 mai 2014 à 22:16:52

        Il faut que j'integre la fonction update avec ? qui se charge de redéfinir les coordonées ?
        • Partager sur Facebook
        • Partager sur Twitter
          11 mai 2014 à 22:39:14

          Donc j'ai refait le code avec se que tu m'a dit mais il n'est pas complet cependant il me met la même erreur que j'ai posté précédemment: line 1920, in pack_configure
              + self._options(cnf, kw))
          _tkinter.TclError: bad side "0": must be top, bottom, left, or right 
          Mais je ne sais pas d'ou vient cette erreur..
          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
          LEFT = 0
          RIGHT = 1
          UP = 2
          DOWN = 3
          direction_courante = -1
          pause = False
          RECALL_TIME = 40
          
          def Clavier(event):
                  """ Gestion de l'événement Appui sur une touche du clavier """
                  if event.keysym == 'RIGHT':
                      move(RIGHT)
                  if event.keysym == 'LEFT':
                      move(LEFT)
                  if event.keysym == 'UP':
                      move(UP)
                  if event.keysym == 'DOWN':
                      move(DOWN)
          
          
          
          def right (event) :
                  if direction_courante !=LEFT :
                          move (RIGHT)
                          direction_courante = RIGHT
          
          def left (event) :
                  if direction_courante !=RIGHT :
                          move (LEFT)
                          direction_courante = LEFT
          
          def up (event) :
              if direction_courante !=DOWN :
                  move (UP)
                  direction_courante = UP
          
          def down (event):
                  if direction_courante !=UP :
                          move (DOWN)
                          direction_courante = DOWN
          
          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
              if x == UP and direction_courante != DOWN :
                  PosX -= vitesse
                  direction_courante = UP
              if x == DOWN and direction_courante != UP :
                  PosX += vitesse
                  direction_courante = DOWN
                 
          
          def update() :
              global canvas
              if pause :
                  return
              else :
                  canvas.after(RECALL_TIME, update)
              if 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")
              # 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)
          
          
          #Mouvement
                       
          
          
          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
                      
                  
          
          # 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")
          
          #####################################################################################################
          
          
          #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)
          
          
          # 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
            11 mai 2014 à 23:04:55

            Et ben là... je crois qu'on est tombé sur un bogue de Tkinter mais je ne suis pas sûr. Essaie de mettre la fonction create_food() en commentaires.
            Si le problème est toujours là, dé-commente celle que tu as commenté puis commente une autre fonction, jusqu'à trouver celle qui provoque l'erreur.
            Si c'est create_food() qui déconne, commente les lignes de code qui concerne le canvas, une seule ligne à la fois, jusqu'à trouver la ligne qui provoque l'erreur.

            Sinon, dans ta fonction update. Pourquoi tu régénère des coordonnées pour la nourriture et tu recrée manuellement le tas de nourriture ?
            Si je t'ai conseillé de créer create_food() pour l'utiliser. Donc autant l'utiliser ^^ :

            def update() :
                global canvas
                if pause :
                    return
                else :
                    canvas.after(RECALL_TIME, update)
                if foodX == PosX and foodY == PosY :
                        create_food()
                # mise à jour du Snake
                # [...]

            En fait, create_food() régénères aléatoirement des coordonnées pour la nourriture et tant que celles-ci sont les mêmes que celles du snake (c'est rare mais ça peut arriver), on les régénères.
            Ensuite, on ne souci pas de savoir si le snake vient de manger ou pas la nourriture : on la recrée avec les nouvelles coordonnées et on la redessine.
            Ensuite, dans update(), si effectivement le snake mange la nourriture (leurs coordonnées coïncident), on appelle create_food(). Il faut d'ailleurs aussi l'appeler dans newgame() pour créer une nourriture au début du jeu. S'il n'y en a pas, le jeu risque pas d'avancer ^^

            Pour ce qui fait que le snake "n'arrive pas" à manger la nourriture, le problème vient des valeurs que tu utilisent pour la vitesse du snake. Je re-recopie un morceau d'un ancien poste :
            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.


            PS : J'ai l'impression que tu ne lis pas mes postes en entier. Peut-être que j'écris beaucoup, mais je n'aurais pas à me répéter si tu suivais bien tout.

            -
            Edité par Escargotine 11 mai 2014 à 23:09:52

            • Partager sur Facebook
            • Partager sur Twitter
              12 mai 2014 à 19:04:52

              Bon alors le problème vient d'aucune de mes fonctions, je les ai toutes mise en commentaire mais ça change rien..

              Sinon pour la fonction update il faut que je renvoie a la fonction create_food ? Mais comment appeler une fonction dans une autre ?

              Si je lis bien tout mais je débute, je sais pas comment m'y prendre, je connais pas Tkinter enfin juste les trucs de base..

              • Partager sur Facebook
              • Partager sur Twitter
                12 mai 2014 à 19:13:15

                Ton erreur vient peut-être de la ligne 145. Tu fais un canevas.pack() alors que tu l'a déjà placé à la ligne précédente
                • Partager sur Facebook
                • Partager sur Twitter
                Précepte: Le mieux est l'ennemi du bien
                  12 mai 2014 à 19:19:50

                  Ah j'ai trouvé quelque chose pour l'erreur, c'est au niveau de :
                  LEFT = 0
                  RIGHT = 1
                  UP = 2
                  DOWN = 3

                  j'ai mis left en commentaire et l'erreur est partie en plus quand il y avait l'erreur les boutons que j'avais créés n'y étaient plus, en mettant LEFT sous commentaire les bouton pause et quitter sont revenus. Aprés que je mets RIGHT il me met l'erreur met au lieu de [ bad side "0": must be top, bottom, left, or right  ] il met  [ bad side "1": must be top, bottom, left, or right ] de plus les autres boutons apparaissent ainsi que le pixel de nourriture. Cependant il ne met pas l'erreur pour [ UP = 2 et DOWN = 3 ]

                  Et puis je viens de voir j'avais mis pour créer un bouton quitter [side = LEFT] et [side = RIGHT] pour un autre bouton,je l'ai ai supprimés et il n'y a plus d'erreur mais maintenant il ne sont pas la ou je veux ^^

                  -
                  Edité par Jojo12 12 mai 2014 à 19:27:34

                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 mai 2014 à 20:17:33

                    C'est normal. Quand tu place tes widgets avec la méthode pack() tu dis (par exemple pour le bouton_quitter):

                    Bouton_quitter.pack(side = LEFT, padx = 10, pady = 10)

                    Avec cette syntaxe, LEFT est considéré comme une variable. Pour éviter ça, tu peux soit changer le nom de tes variables: side_left pour LEFT, side_right pour RIGHT

                    Ou tu met dans ta méthode pack() les valeurs de l'option 'side' entre "":

                    Bouton_quitter.pack(side = "left", padx = 10, pady = 10)



                    -
                    Edité par Olygrim 12 mai 2014 à 20:46:50

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Précepte: Le mieux est l'ennemi du bien
                      12 mai 2014 à 22:10:49

                      Ah ça marche pas :/

                      -
                      Edité par Jojo12 12 mai 2014 à 22:28:43

                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 mai 2014 à 23:09:28

                        Salut,

                        je viens de suivre tout le probleme je suis aussi en spé isn et je passe mardi mais on un probleme c'est que on était parti sur un snake et que ca a foirer pour diverse raisons. Quoi qu'il en soit ton programme reste mieux que le mien jojo j'ai du recommencer le mien en entier car je l'avais fait sans liste et pour faire l'allongement du snake c'était pas faisable ^^du coup je l'ai refait en liste en une aprem le temps que je comprenne comment ca fonctionne. Cependant j'ai aussi un probleme tout bête mais que je ne trouve pas : mon serpent ne veut pas bouger et je ne comprends pas pourquoi si qqn pourrait m'aider ca serait super merci =)

                        from tkinter import *
                        from random import *
                        from PIL import Image, ImageTk
                        
                        #            ******************
                        #            *                *
                        #            *   Fonctions    *
                        #            *                *
                        #            ******************
                        # on creer une partie:
                            
                        def newGame(): 
                            global flag, pX, pY, p, flag2, flag4, score,carre1
                            can1.delete(text1)
                            can1.delete(img1)
                            flag2=1
                            flag4=1
                            score=0
                            pX = randrange(10, fen1.winfo_screenwidth()-150)
                            pY = randrange(10, fen1.winfo_screenheight()-150)
                            p=can1.create_oval(pX, pY, pX+10, pY+10,fill="green")#création d'une pomme à un endroit aléatoire
                            if flag == 0:   #Si jeu n'est pas activé
                                flag = 1      #Alors activation du programme
                                bou2.config(state= DISABLED) #Désactiver (griser) le bouton démarrer
                                Serpent_avance() #Activation de la fonction "serpent avance"
                                
                        def Serpent_avance(): 
                            "déplacement du snake" #Fonction qui permet le deplacement du snake
                            global  dx, dy, flag, flag2, p, pX, pY,score, snake #Global: repertorie les variables utilisées dans la fonction du dessus
                            if abs(snake[0]-pX) < 17 and abs(snake[1]-pY) < 17 : #Quand serpent passe sur la pomme,
                                can1.delete(p)# disparition
                                pX = randrange(10, fen1.winfo_screenwidth()-150) #réapparition de la pomme
                                pY = randrange(10, fen1.winfo_screenheight()-150)
                                p=can1.create_oval(pX, pY, pX+10, pY+10,fill="green")
                                score=score+10
                                
                            if snake[0] > fen1.winfo_screenwidth()-100: #Quand serpent arrive sur le mur coté droit,
                                snake[0]=10
                                snake[2]=30                             #Réapparait de l'autre coté        
                            if snake[1] > fen1.winfo_screenheight()-5:  #IDEM mur du bas
                                snake[1]=10
                                snake[3]=30                             #Réapparait au mur du haut
                            if snake[0] < 5:                            #Quand serpent arrive sur le mur coté gauche
                                snake[0]=fen1.winfo_screenwidth()-100
                                snake[2]=fen1.winfo_screenwidth()-120   #Réapparait mur coté droit
                            if snake[1] < 5:                            #Quand serpent arrive sur le mur haut
                                snake[1]=fen1.winfo_screenheight()-10   #Réapparait sur le mur bas
                                snake[3]=fen1.winfo_screenheight()-30
                                   
                            snake[0]=snake[0]+dx                        # faire avancer le serpent automatiquement
                            snake[1]=snake[1]+dy
                            snake[2]=snake[0]+20
                            snake[3]=snake[1]+20  
                            
                            can1.coords(Serpent, snake[0], snake[1], snake[2], snake[3])    # coordonées du snake
                            
                            if flag >0:                                                     #Quand jeu activé
                                fen1.after(50,Serpent_avance)                               #boucler, après 50 millisecondes (vitesse de repetition)
                        
                        def depl_gauche(event):
                            global flag, dx, dy
                            if flag==1:
                                dx, dy = -20, 0
                                
                        def depl_droite(event):
                            global flag, dx, dy
                            if flag==1:
                                dx, dy = 20, 0 
                                
                        def depl_haut(event):
                            global flag, dx, dy
                            if flag==1:
                                dx, dy = 0, -20
                                
                        def depl_bas(event):
                            global flag, dx, dy
                            if flag==1:
                                dx, dy = 0, 20
                        
                        def pause():  #Pause
                            global flag, pause, flag2, flag4, score, score1
                            if flag4 ==1:
                                if flag == 1 and flag2 == 1:
                                    pause=can1.create_text(fen1.winfo_screenwidth()/2-100,fen1.winfo_screenheight()/2-5,font=('Fixedsys',18),text="PAUSE")
                                    score1=can1.create_text(150,150,font=('Fixedsys',18),text="Score : "+str(score))
                                    can1.create_text(fen1.winfo_screenwidth(),fen1.winfo_screenheight(),font=('Fixedsys',18),text=print(score))
                                    flag=0
                                elif flag==0 and flag2 == 1:
                                    flag=1
                                    can1.delete(pause)
                                    can1.delete(score1)
                                    Serpent_avance()
                                    
                            
                        
                        def fullscreen():
                            fen1.overrideredirect(1)
                            fen1.geometry("%dx%d+0+0" % (w, h)) 
                            
                        
                        #    *********************
                        #    *      Programme    *
                        #    *       Princal     *
                        #    *********************
                        
                        #création de la fenêtre
                        fen1 = Tk()
                        fen1.title("Snake")
                        
                        x, y = 600,400
                        dx, dy = 20, 0
                        flag =0
                        flag4=0                                                 #pour ne pas appuyer sur pause qi le jeu ne démarre pas
                        
                        image_tk2= ImageTk.PhotoImage(Image.open("serpent.jpg"))
                        
                        image_tk = ImageTk.PhotoImage(Image.open("image.jpg"))  #on la transforme pour tk
                        
                        #on la met dans le canvas
                        can1 = Canvas(fen1,width=fen1.winfo_screenwidth()-100, height=fen1.winfo_screenheight())
                        can1.pack()
                        img  = can1.create_image(0,0, anchor = NW, image=image_tk)
                        
                        can1.pack(side=LEFT, padx =10, pady =10)
                        snake=[x, y, x+20, y+20]
                        Serpent=[can1.create_rectangle(snake[0], snake[1], snake[2], snake[3], fill="yellow")]
                        img1  = can1.create_image(0,0, anchor = NW, image=image_tk2)
                        text1=can1.create_text(fen1.winfo_screenwidth()/2,fen1.winfo_screenheight()-400,font=('Fixedsys',18),text="appuyer sur Démarrer")
                        
                        bou2 = Button(fen1, text='Démarrer', width =8, command = newGame)
                        bou2.pack()
                        bou3= Button(fen1, text='Pause',width= 8,command= pause)
                        bou3.pack()
                        bou4 = Button(fen1, text='Quitter', width= 8, command=fen1.destroy)
                        bou4.pack(side=BOTTOM)
                        bou5 = Button(fen1, text='Plein écran', width= 8, command=fullscreen)
                        bou5.pack()
                        # Quelques exemples de touches
                        fen1.bind("<Up>", depl_haut)#haut
                        fen1.bind("<Down>", depl_bas)#bas
                        fen1.bind("<Left>", depl_gauche)#gauche
                        fen1.bind("<Right>", depl_droite)#Droite
                        #lancement du gestionnaire d'évènement
                        fen1.mainloop()

                        je suis désolé pour la photo il faut refaire le canevas avec un background simple ou bien ajoute 2 images bidon avec le bon nom ( enfin je pense que vous le savez =) ) Merci pour le temps que vous passez a nous aider nous les débutants =)



                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 mai 2014 à 0:12:37

                          @therence : hum... tu pourrais créer un nouveau sujet, parce que deux à la fois sur le même je vais pas y arriver ^^'
                          Crée un nouveau poste, d'autres pourront t'aider (je sais pas si j'aurais le temps).

                          @jojo : je pense qu'Olygrim a raison : supprime ta ligne 145 et vois ce que ça donne. Par contre, je suis assez perplexe que LEFT y soit pour quelque chose.
                          Commence par supprimer la ligne 145 et si ça bogue toujours, remplace les valeurs de LEFT, RIGHT, UP et DOWN par 1, 2, 3, 4 au lieu de 0, 1, 2, 3.

                          Jojo12 a écrit:

                          Sinon pour la fonction update il faut que je renvoie a la fonction create_food ? Mais comment appeler une fonction dans une autre ?

                          Et bien, tu l'appelles, tout simplement. Quand j'en ai parlé, j'ai mis le code qui correspond :

                          def update() :
                              global canvas
                              if pause :
                                  return
                              else :
                                  canvas.after(RECALL_TIME, update)
                              if foodX == PosX and foodY == PosY :
                                      create_food()
                              # mise à jour du Snake
                              # [...]

                          Une fonction peut être appelé de n'importe où, tant qu'elle a été définie avant l'endroit où elle est appelé :

                          def coucou() :
                              print("coucou")
                              coucou2()
                          
                          coucou() # ne fonctionne que pour "coucou" car coucou2() est définie après l'appel de coucou()
                          
                          def coucou2() :
                              print("coucou 2")
                          
                          # Le script affichera "coucou" puis l'erreur "NameError: global name 'coucou2' is not defined" s'affichera

                          Si je lis bien tout mais je débute, je sais pas comment m'y prendre, je connais pas Tkinter enfin juste les trucs de base..

                          Autant pour moi. Il se trouve que quand j'ai débuté, des choses m'ont parus évidentes qui ne le sont pas pour toi. Mais chacun a ses différences et tu n'as pas l'air d'avoir une certaine intuition en programmation (surtout que j'ai cru comprendre que vos cours sont plutôt médiocres).
                          Après tout ça, je te conseille (ainsi qu'à tout ceux de la spé ISN) d'aller lire le tuto de ce site sur le Python. Ensuite, le tuto sur Pygame est aussi intéressant (bien que celui qui l'a fait abuse des smileys et qu'on peut facilement améliorer les codes qu'il donne).

                          -
                          Edité par Escargotine 13 mai 2014 à 0:19:13

                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 mai 2014 à 19:34:52

                            Non ça ne change rien de mettre 1,2,3,4 au lieu de 0,1,2,3 mais j'ai enlevé side = RIGHT et side = LEFT etça me met plus l'erreur mais le serpent n'avance pas..
                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 mai 2014 à 20:43:07

                              Olygrim a écrit:

                              Avec cette syntaxe, LEFT est considéré comme une variable. 

                              Autrement dit, comme tu as une variable LEFT dans ton code, c'est sa valeur qui va être utilisée. Pour éviter ça:

                              Olygrim a écrit:

                              Ou tu met dans ta méthode pack() les valeurs de l'option 'side' entre "":

                              Bouton_quitter.pack(side = "left", padx = 10, pady = 10)

                              -
                              Edité par Olygrim 13 mai 2014 à 20:48:14

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Précepte: Le mieux est l'ennemi du bien
                                13 mai 2014 à 21:22:49

                                Merci Olygrim ;)

                                J'avais pas réalisé que Tkinter définit une variable LEFT, c'est là tout le problème. Pour le résoudre, utilise des chaînes de caractères pour canvas.pack() comme vient de le montrer Olygrim.

                                Bon, maintenant que c'est résolu, on peut passer à la suite : pourquoi as-tu définit les fonctions right(), left(), up() et down() ? Tu ne t'en sers pas et la fonction move() fait déjà très bien le travail ;)

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  13 mai 2014 à 21:41:35

                                  Il faut que je supprime les fonctions right(), left(), up() et down() ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    14 mai 2014 à 14:30:11

                                    Je voulais savoir, comment fait on pour que le pixel de nourriture généré au hasard n'apparaissent pas sur le cadre du canevas ? Et aussi comment fonctionne le score avec str et le reste ? Merci

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      15 mai 2014 à 2:07:11

                                      Avant de parler de ton problème de nourriture, j'ai l'impression que tu ne fais que copier-coller mon code. Quand je donne des exemples, c'est pour illustrer concrètement ce que j'explique, mais c'est à toi de le réutiliser : tu dois l'adapter. Par exemple (je cite ton code) :

                                      def update() :
                                          global canvas
                                          if pause :
                                              return
                                          else :
                                              canvas.after(RECALL_TIME, update)
                                          if 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")
                                          # mise à jour du Snake
                                          # [...]

                                      Quelques remarques :
                                       - la variable canvas n'existe pas dans ton code. Je l'ai appelé comme ça dans mon exemple, mais je l'ai fait sans vérifier par rapport à ton code (même remarque pour les fonctions create_food() et resume() ) ;
                                       - les commentaires #mise à jour du snake [...], c'est pas pour décorer. C'est pour signaler que le code d'actualisation du snake doit être mis là.
                                      Tu es sensé analyser et comprendre mes codes. Or, ces erreurs donnent l'impression que tu ne fais que les copier-coller.
                                      Je ne suis pas là pour te donner le code sur un plateau, mais  pour te pousser dans de bonnes directions (je pense que l'as compris). Je sais, c'est peut-être difficile pour toi mais j'ai du mal à voir où sont les efforts que tu fournis.
                                      (Et bien sûr, n'oublies pas d'utiliser create_food() dans la fonction update() plutôt que de recopier le code qui est dans create_food().)

                                      Sinon, pour la nourriture : elle peut apparaître sur le cadre car ses coordonnées sont générées entre 10 et 480 pour x, et entre 10 et 280 pour y. Or, le cadre, donc la zone noire, est dessiné entre 0-10, et 472-500 pour x ; entre 0-10, et 310-400 pour y. Du coup, les abscisses de la nourriture et du cadre à droite peuvent se superposer. J'ai aussi l'impression que tes hauteurs ne collent pas trop avec le reste.
                                      Je te conseille d'utiliser deux variables LARGEUR et HAUTEUR que tu mets au début de ton programme. Elles détermineront la largeur et la hauteur du canevas :

                                      LARGEUR = 500
                                      HAUTEUR = 310
                                      
                                      # Du code [...]
                                      
                                      # Dessin du cadre :
                                      canevas.create_rectangle(0, 0, 10, HAUTEUR, fill = "black")
                                      canevas.create_rectangle(0, 0, LARGEUR, 10, fill = "black")
                                      canevas.create_rectangle(LARGEUR-10, 0, LARGEUR, HAUTEUR, fill = "black")
                                      canevas.create_rectangle(0, HAUTEUR-10, LARGEUR, HAUTEUR, fill = "black")
                                      
                                      # Du code [...]
                                      

                                      N'hésite pas à dire si tu ne comprends pas ce que je fais.

                                      EDIT : N'oublies pas de mettre à jour ton code sur ce forum (le premier poste, si possible).

                                      -
                                      Edité par Escargotine 15 mai 2014 à 2:14:00

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        15 mai 2014 à 19:21:38

                                        Bon je suis désolé je dois rendre mon dossier demain avec le code donc j'ai gardé mon ancien sauf que j'ai un problème dans def newGame, pourquoi quand je clique sur recommencer le score ne se remet pas a 0 alors que je l'ai appelé et pourquoi mon serpent et ma nourriture disparaissent ?

                                        #-*- coding: utf-8 -*-
                                        from tkinter import*
                                        from random import randrange
                                        import time 
                                        
                                        
                                        # Variables
                                        hauteur_canevas = 400
                                        largeur_canevas = 580
                                        Taille_Serpent = 10
                                        PosX = 290
                                        PosY = 190
                                        Score = 0
                                        flag = 1
                                        vitesse = 2
                                        #flag1 = 0
                                        a=0
                                        b=0
                                        
                                        # Fonctions
                                        
                                        # Fonctions permettant de définir les touches de directions 
                                        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 create_food() :
                                            global canevas, foodX,foodY,food
                                            foodX = randrange(10, 480, 10)
                                            foodY = randrange(10, 280, 10)
                                            food = canevas.create_oval(foodX, foodY, foodX+11, foodY+11, fill="green")
                                        
                                                        
                                        
                                        #Mettre le jeu en Pause
                                        
                                        def pause(event=None):
                                                global flag, pause
                                                if flag==1:
                                                        pause=canevas.create_text(250,110,font=('geneva',22),text="PAUSE")
                                                        flag = 0
                                                
                                        #Lancer le jeu
                                        def play(event=None):
                                                global flag, pause
                                                if flag==0:
                                                        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, foodX,foodY,Score
                                            if x == 0 and right==True and flag==1:
                                                if PosX<465:
                                                    PosX +=  vitesse
                                                else:
                                                    PosX=20
                                                canevas.after(10,move,0)
                                            elif x == 1 and left==True and flag==1:
                                                if PosX>17:
                                                    PosX -=  vitesse
                                                else:
                                                    PosX=460
                                                canevas.after(10,move,1)
                                            elif x == 2 and up==True and flag==1:
                                                if PosY>17:
                                                    PosY -=  vitesse
                                                else:
                                                    PosY=300
                                                canevas.after(10,move,2)
                                            elif x == 3 and down==True and flag==1:
                                                if PosY<303:
                                                    PosY +=  vitesse
                                                else:
                                                    PosY=20
                                                canevas.after(10,move,3)
                                            canevas.coords(Serpent,PosX -7, PosY -7, PosX +7, PosY +7)
                                            if ((PosX-7 <= foodX <= PosX+7) or ( PosX-7<= foodX+11 <= PosX+7)) and ((PosY-7 <=foodY <= PosY+7) or (PosY-7<= foodY+11<=PosY+7)):
                                                canevas.delete(food)
                                                create_food()
                                                Score=Score+10
                                                champ_label.config(text="Score : "+str(Score)+" points")
                                                ajouter()
                                        
                                        def ajouter():
                                                global a,b,PosX,PosY,Serpent
                                        
                                                c=len(Serpent)
                                                c=c-1
                                                while c!=0 :
                                                        PosX[c]=PosX[c-1]
                                                        PosY[c]=PosY[c-1]
                                                        c+=-1
                                                PosX[0] += a
                                                PosY[0] += b
                                                c=0
                                        
                                                while c!=len(Serpent):
                                                        canevas.coords(Serpent[c],PosX[c],PosY[c],PosX[c]+7,PosY[c]+7)
                                                        c+=1
                                                c=1
                                              
                                        
                                        
                                        def newGame ():
                                                global flag, food, Serpent, vitesse, PosX, PosY, foodX, foodY, pause, Score
                                                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')
                                                Score = 0
                                                foodX=randrange(10,480,10)
                                                foodY=randrange(10,280,10)
                                                food = canevas.create_oval(foodX, foodY, foodX+11, foodY+11, fill="green")
                                                vitesse=2
                                                champ_label = Label(Mafenetre, text ="\n\n Score : "+str(Score)+" point(s)")
                                                champ_label.config(text="Score : "+str(Score)+" points")
                                                fond = canevas.create_image(0,0,anchor=NW, image=photo)
                                                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 canevas dans lequel apparaîtront les dessins
                                        canevas = Canvas(Mafenetre, bg='white', height=320, width=480)
                                        photo = PhotoImage(file="foret.gif")
                                        fond = canevas.create_image(0,0,anchor=NW, image=photo)
                                        Serpent = canevas.create_rectangle(PosX-7,PosY-7,PosX+7,PosY+7,width=2,fill='red')
                                        canevas.focus_set()
                                        canevas.bind('<Key>',Clavier)
                                        canevas.pack(side=TOP)
                                        
                                        # position initiale du pion
                                        PosX = 290
                                        PosY = 190
                                         
                                        # On dessine le 1er tas de nourriture
                                        foodX=randrange(10,480,10)
                                        foodY=randrange(10,280,10)
                                        food=canevas.create_oval(foodX,foodY,foodX+11,foodY+11,fill="green")
                                        
                                        
                                        # Création des murs
                                        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)
                                        
                                        
                                        # Affichage du score
                                        champ_label = Label(Mafenetre, text ="\n\n Score : "+str(Score)+" point(s)")
                                        champ_label.pack()
                                        
                                        Mafenetre.mainloop()



                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          15 mai 2014 à 20:48:58

                                          J'ai regardé ton code mais je n'arrive pas à voir pourquoi tu as ces bogues. Il faudrait que je le teste chez moi mais j'ai pas vraiment le temps.

                                          Sinon, je te souhaite bonne chance pour ton oral ;)
                                          Une fois tout ça terminé, si le Python et tout ça t'a plu, je te conseille vivement d'aller lire le tuto sur le Python (que j'ai indiqué quelques part dans mes messages, au pire il est facile à trouver). Et après le tuto sur Pygame, qui est bien plus adapté que Tkinter pour ce genre de choses.

                                          Tu pourras même t'amuser à refaire un snake ^^

                                          Sinon, je me suis un peu embrouillé à certains moments et je t'ai donné de mauvaises informations.
                                          Si ça t'intéresse pour après ton oral, j'ai ce code (je suis parti de ce que tu as fait), qui ne gère pas l'agrandissement du snake quand il mange :

                                          #!/usr/bin/python3
                                          #-*- coding: utf-8 -*-
                                          
                                          from tkinter import*
                                          from random import randrange
                                          import time
                                          
                                          # Variables -------------------------------------------------------------------
                                          
                                          PosX = 290
                                          PosY = 190
                                          Serpent = None
                                          
                                          Score = 0
                                          vitesse = 0
                                          
                                          food = None
                                          foodX, foodY = 0, 0
                                          
                                          LEFT = 0
                                          RIGHT = 1
                                          UP = 2
                                          DOWN = 3
                                          RECALL_TIME = 100
                                          
                                          LARGEUR = 500
                                          HAUTEUR = 310
                                          
                                          direction_courante = LEFT
                                          pause = False
                                          
                                          # Fonctions -------------------------------------------------------------------
                                          
                                          def Clavier(event) : # ok
                                              global direction_courante
                                              """ Gestion de l'événement Appui sur une touche du clavier """
                                              if event.keysym == 'Right' and direction_courante != LEFT :
                                                  direction_courante = RIGHT
                                              if event.keysym == 'Left' and direction_courante != RIGHT :
                                                  direction_courante = LEFT
                                              if event.keysym == 'Up' and direction_courante != DOWN :
                                                  direction_courante = UP
                                              if event.keysym == 'Down' and direction_courante != UP :
                                                  direction_courante = DOWN
                                          
                                          def move() : # ok
                                              global canevas, direction_courante, PosX, PosY, vitesse
                                              if direction_courante == RIGHT :
                                                  PosX += vitesse
                                              if direction_courante == LEFT :
                                                  PosX -= vitesse
                                              if direction_courante == UP :
                                                  PosY -= vitesse
                                              if direction_courante == DOWN :
                                                  PosY += vitesse
                                          
                                              update()
                                              canevas.after(RECALL_TIME, move)
                                          
                                          def update() : # ok
                                              global canevas, foodX, foodY, PosX, PosY, Serpent
                                              if pause :
                                                  return
                                          
                                              if PosX <= 11 : PosX = LARGEUR-20
                                              elif PosX >= LARGEUR-19 : PosX = 10
                                              if PosY <= 11 : PosY = HAUTEUR-20
                                              elif PosY >= HAUTEUR-19 : PosY = 10
                                          
                                              canevas.delete(Serpent)
                                              Serpent = canevas.create_rectangle(PosX, PosY, PosX+10, PosY+10, width = 2, fill = 'red')
                                          
                                              if foodX == PosX and foodY == PosY :
                                                  create_food()
                                          
                                          def pause(event = None) :
                                              global pause
                                              pause = True
                                          
                                          def resume(event = None) :
                                              global canevas, pause
                                              if pause :
                                                  pause = False
                                                  canevas.after(RECALL_TIME, move)
                                          
                                          def start(event = None) :
                                              global canevas, pause
                                              pause = False
                                              canevas.after(RECALL_TIME, move)
                                          
                                          # Génération aléatoire de nouvelles coordonnées pour la nourriture :
                                          def create_food() :
                                              global canevas, food, foodX, foodY, PosX, PosY
                                              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)
                                          
                                              if food != None :
                                                  canevas.delete(food)
                                              food = canevas.create_oval(foodX, foodY, foodX+10, foodY+10, fill = "yellow")
                                          
                                          def newGame ():
                                              global canevas, PosX, PosY, Serpent, vitesse
                                              canevas.delete(ALL)
                                          
                                              PosX = 290
                                              PosY = 190
                                              Serpent = canevas.create_rectangle(PosX, PosY, PosX+10, PosY+10, width = 2, fill = 'red')
                                              vitesse = 10
                                          
                                              create_food()
                                          
                                              canevas.create_rectangle(0, 0, 10, HAUTEUR, fill = "black")
                                              canevas.create_rectangle(0, 0, LARGEUR, 10, fill = "black")
                                              canevas.create_rectangle(LARGEUR-10, 0, LARGEUR, HAUTEUR, fill = "black")
                                              canevas.create_rectangle(0, HAUTEUR-10, LARGEUR, HAUTEUR, fill = "black")
                                          
                                              start()
                                          
                                          # Lancement du programme ------------------------------------------------------
                                          
                                          # Fenêtre de Jeu
                                          Mafenetre = Tk()
                                          Mafenetre.title('Snake!')
                                          
                                          # Le cannevas dans lequel apparaîtront les dessins
                                          canevas = Canvas(Mafenetre, bg = 'white', height = HAUTEUR, width = LARGEUR)
                                          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, PosY, PosX+10, PosY+10, 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, HAUTEUR, fill = "black")
                                          canevas.create_rectangle(0, 0, LARGEUR, 10, fill = "black")
                                          canevas.create_rectangle(LARGEUR-10, 0, LARGEUR, HAUTEUR, fill = "black")
                                          canevas.create_rectangle(0, HAUTEUR-10, LARGEUR, HAUTEUR, 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 = resume)
                                          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)
                                          
                                          newGame()
                                          
                                          Mafenetre.mainloop()

                                          Il y a aussi un petit bogue graphique quand on frôle les bords du cadre.

                                          -
                                          Edité par Escargotine 15 mai 2014 à 20:56:15

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            15 mai 2014 à 21:43:39

                                            D'accord en tout cas un grand MERCI a vous de m'avoir aidé, je pense continuer et découvrir d'autre module, je trouve ça intéressant :p
                                            • 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