Partage
  • Partager sur Facebook
  • Partager sur Twitter

Début de snake tkinter

probleme de mobilité

Sujet résolu
    13 mai 2014 à 7:14:56

    Salut,

    Je suis aussi en spé isn et je passe mardi mais on a cependant un problème c'est que on était parti sur un snake et que ca a foirer pour diverse raisons.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 problème 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 =)

    # -*- coding: utf-8 -*-
    """
    Created on Thu Feb 20 07:18:31 2014
    
    @author: oyanel
    """
    
    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 à 19:45:48

      salut,

      ça fait déjà plusieurs fois que je vois cette erreur dans le forum:lol:

      quand tu appelles la fonction depl_haut, depl_bas, depl_gauche ou depl_droite, tu modifies les variables sans bouger le serpent!!!

      therence a écrit:

      et je passe mardi

      euh... ce mardi?:euh:

      EDIT:erreur

      -
      Edité par pythan 13 mai 2014 à 20:35:46

      • 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
        13 mai 2014 à 20:05:18

        ba si je fais

        snake[0]=snake[0]+dx        
        
        snake[1]=snake[1]+dy
        
        snake[2]=snake[0]+20
        snake[3]=snake[1]+20



        et avec les flèches directionnelles je change dx et dy donc ça le fait déplacer? Et meme sans toucher aux fleches directionnelles il devrait aller a droite tout seul non ?
        et sinon je passe mardi prochain pas aujourd'hui mais oui ça presse ^^ j'ai du refaire tout notre programme car c'était sans liste donc je ne pouvait pas faire les carrés enfin je suppose..

        -
        Edité par therence 13 mai 2014 à 20:06:38

        • Partager sur Facebook
        • Partager sur Twitter
          13 mai 2014 à 20:25:55

          therence a écrit:

          ba si je fais [...] et avec les flèches directionnelles je change dx et dy donc ça le fait déplacer?

          Sans vouloir t'agresser... c'est aussi débile que de dire

          citation: une personne débile:-°

          ba si je fais a=2 ça devrait m'écrire 2 dans la console?

          EDIT:ah mais non! j'avais pas lu ton code en entier. exucse

          -
          Edité par pythan 13 mai 2014 à 20:40:02

          • 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
            13 mai 2014 à 20:47:42

            Donc c'est censé fonctionner ou pas ?

            heu je crois que tu as quand même raison car si je rajoute

            Serpent=[can1.create_rectangle(snake[0], snake[1], snake[2], snake[3], fill="yellow")]

            dans la fonction serpent_avance et bien ca fais bien avancer le serpent mais il laisse une trainé derriere lui ^^

            Ca veut dire que si je change les paramètres du serpent dans les fonctions mais que je ne rappelle pas mon serpent dans cette même fonction alors c'est comme si j'avais rien fait car ca ne le met pas a jour dans le programme principal ? ?

            -
            Edité par therence 13 mai 2014 à 20:54:36

            • Partager sur Facebook
            • Partager sur Twitter
              13 mai 2014 à 21:00:01

              je sais pas si tu as inspiré ton programme de ce code(exercice 8.33), mais il peut aider...
              • 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
                13 mai 2014 à 22:12:54

                Re je n'avait jamais vu ce code avant il est différent du mien mais semble fonctionner, du coup j'ai refait le mien a partir de celui-ci tout en essayant de le comprendre et voila ce que ca donne : le serpent ne bouge toujours pas !!!!

                def newGame(): 
                    global flag, pX, pY, p, flag2, flag4, score, Serpent, snake
                    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
                    bou2.config(state= DISABLED) #Désactiver (griser) le bouton démarrer
                    Serpent_avance() #Activation de la fonction "serpent avance"
                    
                def manger():
                    global p, pX, pY,score, snake
                        
                    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
                        snake.append([cq, xq, yq])
                  
                        
                def Serpent_avance(): 
                    "déplacement du snake" #Fonction qui permet le deplacement du snake
                    global  dx, dy, flag, flag2, snake, manger #Global: repertorie les variables utilisées dans la fonction du dessus
                    
                    c = snake[0]	     # réf. de ce carré (coordonnées inutiles ici)
                    cq = c[0]
                    longueur=len(snake)
                    tete_serpent = snake[longueur-1]
                    x_tete, y_tete = tete_serpent[1], tete_serpent[2]
                    x_queue, y_queue = x_tete+dx*cc, y_tete+dy*cc # la queue devient tete
                    
                    if x_queue > fen1.winfo_screenwidth()-100: #Quand serpent arrive sur le mur coté droit,
                        x_queue=10 #Réapparait de l'autre coté        
                    if  y_queue > fen1.winfo_screenheight()-5:  #IDEM mur du bas
                         y_queue=10 #Réapparait au mur du haut
                    if x_queue < 5:                            #Quand serpent arrive sur le mur coté gauche
                        x_queue=fen1.winfo_screenwidth()-100 #Réapparait mur coté droit
                    if  y_queue < 5:                            #Quand serpent arrive sur le mur haut
                         y_queue=fen1.winfo_screenheight()-10   #Réapparait sur le mur bas
                           
                    can1.coords(cq, x_queue, y_queue, x_queue+cc, y_queue+cc)	  # déplacement effectif 
                    snake.append([cq, xq, yq])	# mémorisation du nouveau carré de tête 
                    del(snake[0])		# effacement (retrait de la liste)# faire avancer le serpent automatiquement
                    
                    manger()    # 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, direction
                    if flag==1 and direction!=2:
                        dx, dy = -20, 0
                        direction = 1
                        
                def depl_droite(event):
                    global flag, dx, dy, direction
                    if flag==1 and direction!=1:
                        dx, dy = 20, 0 
                        direction=2
                        
                def depl_haut(event):
                    global flag, dx, dy, direction
                    if flag==1 and direction !=4:
                        dx, dy = 0, -20
                        direction = 3
                        
                def depl_bas(event):
                    global flag, dx, dy, direction
                    if flag==1 and direction!=3:
                        dx, dy = 0, 20
                        direction=4
                
                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, cc = 600,400,20
                dx, dy = 20, 0
                flag =1
                flag4=0  
                direction =2                                               #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)
                
                # Création du serpent initial (= ligne de 5 carrés). 
                # On mémorisera les infos concernant les carrés créés dans une liste de listes :
                snake =[]	       # liste vide 
                # Création et mémorisation des 5 carrés : le dernier (à droite) est la tête.
                i =0 
                while i <5: 
                  carre =can1.create_rectangle(x, y, x+cc, y+cc, fill="yellow") 
                  # Pour chaque carré, on mémorise une petite sous-liste contenant
                  # 3 éléments : la référence du carré et ses coordonnées de base :
                  snake.append([carre, x, y])
                  x =x+cc	   # le carré suivant sera un peu plus à droite 
                  i =i+1 
                
                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()



                • Partager sur Facebook
                • Partager sur Twitter
                  14 mai 2014 à 7:00:52

                  Desole pour mon poste je crois savoir pourquoi ca marche pas. Merci pour ton aide je travail dessus cette aprèm et si j'ai besoin d'aide je reposte :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 mai 2014 à 16:21:15

                    Salut me revoila j'ai traviailler sur le snake et voial ce que c a donne je voulais avoir topn avis général et je ne sais pas pourquoi je ne peux pas me mordre.

                    voila le programme en entier =):

                    # -*- coding: utf-8 -*-
                    """
                    Created on Tue May 13 21:07:34 2014
                    
                    @author: User
                    """
                    
                    from tkinter import *
                    from random import randrange
                     
                    # === Définition de quelques gestionnaires d'événements :
                     
                    def start_it(): 
                      "Démarrage de l'animation" 
                      global flag, pX, pY,p,score
                      if flag ==0: 
                          flag =1
                          score=0
                          pX = randrange(15,500,15) #réapparition de la pomme
                          pY = randrange(15,500,15)
                          p=can.create_oval(pX, pY, pX+cc, pY+cc,fill="red")
                          bou1.config(state= DISABLED)
                          Serpent()
                          move() 
                     
                    def pause():  #Pause
                        global flag, pause, score, score1
                        if flag == 1:
                            pause=can.create_text(250,250,font=('Fixedsys',18),text="PAUSE")
                            score1=can.create_text(110,30,font=('Fixedsys',18),text="Score : "+str(score))
                            flag=0
                        elif flag==0:
                            flag=1
                            can.delete(pause)
                            can.delete(score1)
                            move()
                     
                    def depl_gauche(event):
                        global flag, dx, dy, direction
                        if flag==1 and direction!=2:
                            dx, dy = -1, 0
                            direction = 1
                            
                    def depl_droite(event):
                        global flag, dx, dy, direction
                        if flag==1 and direction!=1:
                            dx, dy = 1, 0 
                            direction=2
                            
                    def depl_haut(event):
                        global flag, dx, dy, direction
                        if flag==1 and direction !=4:
                            dx, dy = 0, -1
                            direction = 3
                            
                    def depl_bas(event):
                        global flag, dx, dy, direction
                        if flag==1 and direction!=3:
                            dx, dy = 0, 1
                            direction=4
                            
                    def move(): 
                      "Animation du serpent par récursivité" 
                      global flag,p,manger,xq,yq,cq,h
                      # Principe du mouvement opéré : on déplace le carré de queue, dont les 
                      # caractéristiques sont mémorisées dans le premier élément de la liste 
                      # <serp>, de manière à l'amener en avant du carré de tête, dont les 
                      # caractéristiques sont mémorisées dans le dernier élément de la liste. 
                      # On définit ainsi un nouveau carré de tête pour le serpent, dont on 
                      # mémorise les caractéristiques en les ajoutant à la liste. 
                      # Il ne reste plus qu'à effacer alors le premier élément de la liste, 
                      # et ainsi de suite ... : 
                      c = serp[0]	       # extraction des infos concernant le carré de queue 
                      cq = c[0]	     # réf. de ce carré (coordonnées inutiles ici) 
                      l =len(serp)	     # longueur actuelle du serpent (= n. de carrés) 
                      c = serp[l-1]      # extraction des infos concernant le carré de tête 
                      xt, yt = c[1], c[2]	   # coordonnées de ce carré 
                      # Préparation du déplacement proprement dit. 
                      # (cc est la taille du carré. dx & dy indiquent le sens du déplacement) : 
                      xq, yq = xt+dx*cc, yt+dy*cc	       # coord. du nouveau carré de tête 
                      # Vérification : a-t-on atteint les limites du canevas ? : 
                      if xq > 500: #Quand serpent arrive sur le mur coté droit,
                            xq=0 #Réapparait de l'autre coté        
                      if yq> 500:  #IDEM mur du bas
                            yq=0 #Réapparait au mur du haut
                      if xq< 0:                            #Quand serpent arrive sur le mur coté gauche
                            xq=500 #Réapparait mur coté droit
                      if yq < 0:                            #Quand serpent arrive sur le mur haut
                            yq=500   #Réapparait sur le mur bas
                            
                            #si il se mord il perd
                      j=0    
                      while j<l:
                          if xq==serp[j] and yq==serp[j]:
                              flag=0
                              can.create_text(250,250,font=('Fixedsys',18),text="Perdu")
                              bou2.config(state=DISABLED)
                          j+=1
                        
                         
                          
                          
                          
                            
                      can.coords(cq, xq, yq, xq+cc, yq+cc)	  # déplacement effectif 
                      serp.append([cq, xq, yq])	# mémorisation du nouveau carré de tête 
                      del(serp[0])		# effacement (retrait de la liste) 
                      # Appel récursif de la fonction par elle-même (=> boucle d'animation) :
                      if flag >0: 
                          fen.after(h, move)
                          manger()
                          
                          
                    def Serpent():
                        global i,x,y,cc,carre,lg
                        while i <lg: 
                          carre =can.create_rectangle(x, y, x+cc, y+cc, fill="green") 
                          # Pour chaque carré, on mémorise une petite sous-liste contenant
                          # 3 éléments : la référence du carré et ses coordonnées de base :
                          serp.append([carre, x, y]) 
                          x =x+cc	   # le carré suivant sera un peu plus à droite 
                          i =i+1 
                          
                          
                    def manger():
                        global pX,pY,p,cq,xq,yq,h,lg,x,y,cc,score
                        
                        if abs(xq-pX)<15 and abs(yq-pY) <15 : #Quand serpent passe sur la pomme,
                            score=score+100
                            can.delete(p)# disparition
                            pX = randrange(0,500,10) #réapparition de la pomme
                            pY = randrange(0,500,10)
                            p=can.create_oval(pX, pY, pX+cc, pY+cc,fill="green")
                            while h>10:
                                h=h-2 
                                break
                            lg=lg+1
                            x= xq+dx*cc
                            y=yq+dy*cc
                            Serpent()
                            #serp.append([cq, xq, yq])
                            
                     
                    # === Programme principal : ======== 
                     
                    # Variables globales modifiables par certaines fonctions : 
                    flag =0 	# commutateur pour l'animation 
                    dx, dy = 1, 0	     # indicateurs pour le sens du déplacement 
                    h=65
                    # Autres variables globales :
                    canX, canY = 500, 500	 # dimensions du canevas 
                    x, y, cc = 100, 100, 15     # coordonnées et coté du premier carré 
                     
                    # Création de l'espace de jeu (fenêtre, canevas, boutons ...) : 
                    fen =Tk() 
                    can =Canvas(fen, bg ='dark gray', height =canX, width =canY) 
                    can.pack(padx =10, pady =10) 
                    bou1 =Button(fen, text="Start", width =10, command =start_it) 
                    bou1.pack(side =LEFT) 
                    bou2 =Button(fen, text="pause", width =10, command =pause) 
                    bou2.pack(side =LEFT) 
                    direction=()
                     
                    # Association de gestionnaires d'événements aux touches fléchées du clavier :
                    fen.bind("<Left>", depl_gauche)	  # Attention : les événements clavier 
                    fen.bind("<Right>", depl_droite)	    # doivent toujours être associés à la 
                    fen.bind("<Up>", depl_haut)        # fenêtre principale, et non au canevas 
                    fen.bind("<Down>", depl_bas)	  # ou à un autre widget. 
                     
                    # Création du serpent initial (= ligne de 5 carrés). 
                    # On mémorisera les infos concernant les carrés créés dans une liste de listes :
                    serp =[]	       # liste vide 
                    # Création et mémorisation des 5 carrés : le dernier (à droite) est la tête.
                    i =0 
                    lg=5
                     
                    fen.mainloop()



                    -
                    Edité par therence 14 mai 2014 à 16:50:03

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 mai 2014 à 17:53:53

                      salut,

                      à la ligne 94, tu compares une liste à un entier. remplace-la par:

                      if xq==serp[j][1] and yq==serp[j][2]:

                      • 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
                        14 mai 2014 à 18:47:54

                        Super ca marche mais pourquoi tu a fais ca ? j

                        e vais pouvoir utiliser ca pour faire réapparaitre les pommes en dehors du serpent =) merci bcp !!

                        Sinon tu ne saurais pas comment faire pour supprimer un texte du canevas car can.delete(text) ne fonctionne pas.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 mai 2014 à 19:26:35

                          therence a écrit:

                          Super ca marche mais pourquoi tu a fais ca ?

                          ???o_O

                          therence a écrit:

                          Sinon tu ne saurais pas comment faire pour supprimer un texte du canevas car can.delete(text) ne fonctionne pas.

                           heu... si ça marche:-°

                          ou alors j'ai pas compris...



                          • 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
                            14 mai 2014 à 20:46:35

                            pythan a écrit:

                            therence a écrit:

                            Super ca marche mais pourquoi tu a fais ca ?

                            ???o_O

                            ba je veux dire pourquoi tu as du rajouter [1] et [2] a la fin .

                            et tiens voici le snake et tu va voir on a mis des texte qui doivent s'effacer et ca ne fonctionne pas ;/

                            # -*- coding: utf-8 -*-
                            """
                            Created on Tue May 13 21:07:34 2014
                            
                            @author: User
                            """
                            
                            from tkinter import *
                            from random import randrange
                             
                            # === Définition de quelques gestionnaires d'événements :
                             
                            def newGame(): 
                              "Démarrage de l'animation" 
                              global flag, pX, pY,p,score
                              if flag ==0: 
                                  flag =1
                                  score=0
                                  pX = randrange(15,485,15) #réapparition de la pomme
                                  pY = randrange(15,485,15)
                                  p=can.create_oval(pX, pY, pX+cc, pY+cc,fill="red")
                                  bou1.config(state= DISABLED)
                                  Serpent()
                                  move() 
                                  
                            def pause():  #Pause
                                global flag, pause, score, score1
                                if flag == 1:
                                    pause=can.create_text(250,250,font=('Fixedsys',18),text="PAUSE")
                                    score1=can.create_text(110,30,font=('Fixedsys',18),text="Score : "+str(score))
                                    flag=0
                                elif flag==0:
                                    flag=1
                                    can.delete(pause)
                                    can.delete(score1)
                                    move()
                             
                            def depl_gauche(event):
                                global flag, dx, dy, direction
                                if flag==1 and direction!=2:
                                    dx, dy = -1, 0
                                    direction = 1
                                    
                            def depl_droite(event):
                                global flag, dx, dy, direction
                                if flag==1 and direction!=1:
                                    dx, dy = 1, 0 
                                    direction=2
                                    
                            def depl_haut(event):
                                global flag, dx, dy, direction
                                if flag==1 and direction !=4:
                                    dx, dy = 0, -1
                                    direction = 3
                                    
                            def depl_bas(event):
                                global flag, dx, dy, direction
                                if flag==1 and direction!=3:
                                    dx, dy = 0, 1
                                    direction=4
                                    
                            def move(): 
                              "Animation du serpent par récursivité" 
                              global flag,xq,yq,h,score, niveau1, niveau2, niveau3
                              # Principe du mouvement opéré : on déplace le carré de queue, dont les 
                              # caractéristiques sont mémorisées dans le premier élément de la liste 
                              # <serp>, de manière à l'amener en avant du carré de tête, dont les 
                              # caractéristiques sont mémorisées dans le dernier élément de la liste. 
                              # On définit ainsi un nouveau carré de tête pour le serpent, dont on 
                              # mémorise les caractéristiques en les ajoutant à la liste. 
                              # Il ne reste plus qu'à effacer alors le premier élément de la liste, 
                              # et ainsi de suite ... : 
                              c = serp[0]	       # extraction des infos concernant le carré de queue 
                              cq = c[0]	     # réf. de ce carré (coordonnées inutiles ici) 
                              l =len(serp)	     # longueur actuelle du serpent (= n. de carrés) 
                              c = serp[l-1]      # extraction des infos concernant le carré de tête 
                              xt, yt = c[1], c[2]	   # coordonnées de ce carré 
                              # Préparation du déplacement proprement dit. 
                              # (cc est la taille du carré. dx & dy indiquent le sens du déplacement) : 
                              xq, yq = xt+dx*cc, yt+dy*cc	       # coord. du nouveau carré de tête 
                              # Vérification : a-t-on atteint les limites du canevas ? : 
                              if score <1000:
                                    niveau1= can.create_text(250,250,font=('fixedsys',20),text='Niveau 1')
                                    if score  >=100:
                                        can.delete(niveau1)
                                    if xq > 500: #Quand serpent arrive sur le mur coté droit,
                                        xq=0 #Réapparait de l'autre coté        
                                    if yq> 500:  #IDEM mur du bas
                                        yq=0 #Réapparait au mur du haut
                                    if xq< 0:                            #Quand serpent arrive sur le mur coté gauche
                                        xq=500 #Réapparait mur coté droit
                                    if yq < 0:                            #Quand serpent arrive sur le mur haut
                                        yq=500   #Réapparait sur le mur bas
                              if score >= 1000 :#nouveaux niveau (=nvlle fonctionnalité)
                                        niveau2 = can.create_text(250,250,font=('fixedsys',20),text='Niveau 2')
                                        if score ==1000:
                                            can.create_rectangle(0,0,3,500,fill="black")# mur gauche
                                            can.create_rectangle(0,0,500,3,fill="black")# mur haut
                                            can.create_rectangle(499,0,500,500,fill="black")# mur droit
                                            can.create_rectangle(0,500,500,499,fill="black")# mur bas
                                        if score == 1100:
                                            can.delete(niveau2)
                                        if xq > 499 or yq> 499 or xq< 1 or yq < 1 :
                                            flag=0
                                            can.create_text(250,250,font=('Fixedsys',18),text="Perdu")
                                            bou2.config(state=DISABLED)
                              if score >= 2000:
                                    niveau3=can.create_text(250,250,font=('fixedsys',20),text='Niveau 3')
                                    if score ==2100:
                                      can.delete(niveau3)
                                    can.create_oval(150,150,150+cc,150+cc,outline='blue')
                                    can.create_oval(300,300,300+cc,300+cc,outline='orange')
                                    if abs (xq-150)<10 and abs(yq-150)<10:
                                      xq,yq=300,300
                                             
                                    #si il se mord il perd
                              j=0    
                              while j<len(serp):
                                  if xq==serp[j][1] and yq==serp[j][2]:
                                      flag=0
                                      can.create_text(250,250,font=('Fixedsys',18),text="Perdu")
                                      bou2.config(state=DISABLED)
                                  j+=1      
                                    
                              can.coords(cq, xq, yq, xq+cc, yq+cc)	  # déplacement effectif 
                              serp.append([cq, xq, yq])	# mémorisation du nouveau carré de tête 
                              del(serp[0])		# effacement (retrait de la liste) 
                              # Appel récursif de la fonction par elle-même (=> boucle d'animation) :
                              if flag >0: 
                                  fen.after(h, move)
                                  manger()
                                  
                                  
                            def Serpent():
                                global i,x,y,cc,carre,lg
                                while i <lg: 
                                  carre =can.create_rectangle(x, y, x+cc, y+cc, fill="yellow",outline="dark red") 
                                  # Pour chaque carré, on mémorise une petite sous-liste contenant
                                  # 3 éléments : la référence du carré et ses coordonnées de base :
                                  serp.append([carre, x, y]) 
                                  x =x+cc	   # le carré suivant sera un peu plus à droite 
                                  i =i+1 
                                  
                                  
                            def manger():
                                global pX,pY,p,cq,xq,yq,h,lg,x,y,cc,score
                                
                                if abs(xq-pX)<15 and abs(yq-pY) <15 : #Quand serpent passe sur la pomme,
                                    score=score+100
                                    can.delete(p)# disparition
                                    pX = randrange(15,485,15) #réapparition de la pomme
                                    pY = randrange(15,485,15)
                                    # on vérifie que les coordonnées de la pomme ne sont pas celles d'un des carré du serpent =)
                                    i2=0    
                                    while i2<len(serp):
                                        while pX==serp[i2][1] and pY==serp[i2][2]:# si la pome réaparait sur le serpent alors
                                                pX = randrange(15,485,15) # nouvelles coordonnées de la pomme
                                                pY = randrange(15,485,15)
                                        i2+=1      
                                    p=can.create_oval(pX, pY, pX+cc, pY+cc,fill="red")
                                    while h>10:
                                        h=h-2 
                                        break
                                    lg=lg+1
                                    x= xq+dx*cc
                                    y=yq+dy*cc
                                    Serpent()
                                    #serp.append([cq, xq, yq])
                                    
                             
                            # === Programme principal : ======== 
                             
                            # Variables globales modifiables par certaines fonctions : 
                            flag =0 	# commutateur pour l'animation 
                            dx, dy = 1, 0	     # indicateurs pour le sens du déplacement 
                            h=65
                            # Autres variables globales :
                            canX, canY = 500, 500	 # dimensions du canevas 
                            x, y, cc = 100, 100, 15     # coordonnées et coté du premier carré 
                             
                            # Création de l'espace de jeu (fenêtre, canevas, boutons ...) : 
                            fen =Tk() 
                            fen.title('Snake')
                            can =Canvas(fen, bg ='dark gray', height =canX, width =canY) 
                            can.pack(padx =10, pady =10) 
                            bou1 =Button(fen, text="Jouer", width =10, command =newGame) 
                            bou1.pack(side =LEFT) 
                            bou2 =Button(fen, text="Pause", width =10, command =pause) 
                            bou2.pack(side =LEFT)
                            direction=()
                             
                            # Association de gestionnaires d'événements aux touches fléchées du clavier :
                            fen.bind("<Left>", depl_gauche)	  # Attention : les événements clavier 
                            fen.bind("<Right>", depl_droite)	    # doivent toujours être associés à la 
                            fen.bind("<Up>", depl_haut)        # fenêtre principale, et non au canevas 
                            fen.bind("<Down>", depl_bas)	  # ou à un autre widget. 
                             
                            # Création du serpent initial (= ligne de 5 carrés). 
                            # On mémorisera les infos concernant les carrés créés dans une liste de listes :
                            serp =[]	       # liste vide 
                            # Création et mémorisation des 5 carrés : le dernier (à droite) est la tête.
                            i =0 
                            lg=5
                             
                            fen.mainloop()






                            • Partager sur Facebook
                            • Partager sur Twitter
                              14 mai 2014 à 21:20:45

                              therence a écrit:

                              ba je veux dire pourquoi tu as du rajouter [1] et [2] a la fin .

                              ben j'ai fait des tests et j'ai remarqué que c'étaient des listes et que c'étaient les éléments 1 et 2 qui correspondaient....
                              voilà la ligne de code qui m'a permis de débusquer l'erreur:

                              print("if", xq, "==", serp[j][1], " and ", yq, "==",  serp[j][2])

                              sinon pour le non-effacage du texte, je rame...

                              • 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
                                14 mai 2014 à 21:28:57

                                pythan a écrit:

                                sinon pour le non-effacage du texte, je rame...

                                trouvé!

                                à chaque tour de boucle, tu le recrées, puis tu l'effaces!

                                • 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
                                  14 mai 2014 à 22:04:09

                                  Ok super merci j'ai compris j'ai fait le test et du coup je viens de comprendre. Et sinon j'ai refait la boucle et ca ne s'efface toujours pas alors que le niveau ne s'affiche qu'une fois :/

                                    if score <1000:
                                          if score== 0:
                                              niveau= can.create_text(250,250,font=('fixedsys',20),text='Niveau 1')
                                          if score==100:
                                              can.delete(niveau)
                                          if xq > 500: #Quand serpent arrive sur le mur coté droit,
                                              xq=0 #Réapparait de l'autre coté        
                                          if yq> 500:  #IDEM mur du bas
                                              yq=0 #Réapparait au mur du haut
                                          if xq< 0:                            #Quand serpent arrive sur le mur coté gauche
                                              xq=500 #Réapparait mur coté droit
                                          if yq < 0:                            #Quand serpent arrive sur le mur haut
                                              yq=500   #Réapparait sur le mur bas
                                    if score >= 1000 :#nouveaux niveau (=nvlle fonctionnalité)
                                              if score== 1000:
                                                niveau = can.create_text(250,250,font=('fixedsys',20),text='Niveau 2')
                                              if score == 1000:
                                                  can.create_rectangle(0,0,3,500,fill="black")# mur gauche
                                                  can.create_rectangle(0,0,500,3,fill="black")# mur haut
                                                  can.create_rectangle(499,0,500,500,fill="black")# mur droit
                                                  can.create_rectangle(0,500,500,499,fill="black")# mur bas
                                              if score == 1100:
                                                  can.delete(niveau)
                                              if xq > 499 or yq> 499 or xq< 1 or yq < 1 :
                                                  flag=0
                                                  can.create_text(250,250,font=('Fixedsys',18),text="Perdu")
                                                  bou2.config(state=DISABLED)
                                    if score >= 2000:
                                          if score== 2000:
                                            niveau=can.create_text(250,250,font=('fixedsys',20),text='Niveau 3')
                                          if score ==2100:
                                            can.delete(niveau)
                                          can.create_oval(150,150,150+cc,150+cc,outline='blue')
                                          can.create_oval(300,300,300+cc,300+cc,outline='orange')
                                          if abs (xq-150)<10 and abs(yq-150)<10:
                                            xq,yq=300,300



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 mai 2014 à 19:48:17

                                    C'est bon j'ai trouvé l'erreur hier, notre projet est terminé ! =) merci pour ton aide tu as été très sympa et tu m'a bien aidé a comprendre.

                                    Merci beaucoup =)

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      16 mai 2014 à 19:50:35

                                      de rien, c'est résolu?

                                      sinon tu peux mettre le prog en entier?

                                      • 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

                                      Début de 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