Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme jeu boucle

Sujet résolu
    25 octobre 2023 à 22:38:16

    je suis vraiment débutant en python est j'essaie de faire un jeu un peu dans le style snake vs block un serpent se déplace verticalement sur un terrain infini.

    Une fonction permet le défilement du terrain qui est basé sur une liste.

    J'aimerai qu'elle tourne en boucle mais je n'arrive pas à la faire tourner en même temps que le reste de mon code.

    import tkinter
    import random
    import time
    
    jeu = True
    tete = "@"
    queue = "a"
    fond = '#4F565E'
    fond2 = '#2F3841'
    terrain = [[0 for i in range(5)] for j in range(12)]
    terrain[4][2]=tete
    longueur=6
    
    fenetre=tkinter.Tk()
    fenetre.title("snake")
    fenetre.geometry("375x900")
    fenetre.resizable(width=False, height=False)
    espace_dessin=tkinter.Canvas(bg=fond2,width=375, height=900,cursor=None,highlightthickness=0)
    espace_dessin.place(x=0, y=0)
    
    def print_terrain():
        global ligne
        for ligne in terrain:
            print(ligne)
    
    def dessiner_fond():
        for x in range(0,375,75):
            if x%150==0 :
                color=fond2
            else :
                color=fond
            espace_dessin.create_rectangle(x,0,x+75,900,outline='white',width=0,fill=color)
    
    def dessiner_cercle(n,color):
        for x in range(len(terrain)):
            for y in range(len(terrain[0])):
                if terrain[x][y]==n :
                    espace_dessin.create_oval(75*(y+1/5),75*(x+1/5),75*(y+4/5),75*(x+4/5),outline='white',width=0,fill=color)
    
    def dessiner_carré(n):
        for y in range(len(terrain)-1):
            for x in range(len(terrain[0])-1):
                if terrain[y][x]==n :
                    espace_dessin.create_rectangle(75*x,75*y,75*(x+1),75*(y+1),outline='white',width=0,fill='blue')
    
    
    def deplacement_gauche(event):
        global terrain
        for x in range(len(terrain)):
            for y in range(len(terrain[0])):
                if terrain[x][y]==tete :
                    if y>0:
                        terrain[x][y]=0
                        terrain[x][y-1]=tete
                        defiler()
                        return(print_terrain())
    
    def deplacement_droite(event):
        global terrain
        for x in range(len(terrain)):
            for y in range(len(terrain[0])):
                if terrain[x][y]==tete :
                    if y<len(terrain[0])-1:
                        terrain[x][y+1]=tete
                        terrain[x][y]=0
                        defiler()
                        return(print_terrain())
    
    def defiler():
        global terrain
        for x in range(len(terrain)):
            for y in range(len(terrain[0])):
                if terrain[x][y]==tete :
                    terrain[x][y]=queue
                    terrain[x-1][y]=tete
                    raccourcir()
        extension=[0 for i in range(5)]
        extension[random.randint(0,4)]=-1
        dessiner_fond()
        dessiner_cercle(tete,'red')
        dessiner_cercle(queue,'yellow')
        dessiner_carré(-1)
        terrain.pop()
        terrain.insert(0,extension)
    
    def raccourcir():
        for x in range((2+longueur),len(terrain)):
            for y in range(len(terrain[0])):
                if terrain[x][y]==queue :
                    terrain[x][y]=0
    
    print_terrain()   
    dessiner_fond()
    dessiner_carré(-1)
    dessiner_cercle(tete,'red')
    dessiner_cercle(queue,'yellow')
    fenetre.bind('<Left>', deplacement_gauche)
    fenetre.bind('<Right>', deplacement_droite)
    fenetre.mainloop()



    • Partager sur Facebook
    • Partager sur Twitter
      26 octobre 2023 à 13:40:24

      Le terrain doit défiler, le joueur éviter les obstacles et les 2 actions doivent être indépendantes. Pour faire çà, tkinter dispose de la méthode after pour appeler défiler toutes les x secondes (chercher des exemples qui utilisent cette fonction/méthode).

      -
      Edité par mps 26 octobre 2023 à 13:40:50

      • Partager sur Facebook
      • Partager sur Twitter
        27 octobre 2023 à 11:25:10

        Bonjour,

        A tout hasard, un exemple avec des obstacles qui défilent et une balle qui doit les éviter en sautant

        (flèche "haut" du clavier)

        from tkinter import *
        
        def create_obstacles():
            global obst1, obst2
        
            obst1 = graph_area.create_polygon(370, 100+ball_dia, 370+ball_dia, 100+ball_dia, 370+ball_dia*0.5, 100, fill = 'green', tags = 'obst')
            obst2 = graph_area.create_polygon(390, 100+ball_dia, 390+ball_dia, 100+ball_dia, 390+ball_dia*0.5, 90, fill = 'green', tags = 'obst')
        
        def move_obst():
            global dx, obst1, obst2
        
            graph_area.move('obst',dx,0)
            graph_area.after(50, move_obst)
            if(graph_area.coords(obst1)[0] < 0):
                graph_area.coords(obst1, 370, 100+ball_dia, 370+ball_dia, 100+ball_dia, 370+ball_dia*0.5, 100)
                graph_area.coords(obst2, 390, 100+ball_dia, 390+ball_dia, 100+ball_dia, 390+ball_dia*0.5, 90)
        
        def move_circ():
            global dy, circ, stop
        
            if(not stop):
                graph_area.move(circ,0,dy)
                graph_area.after(40, move_circ)
        
                if(graph_area.coords(circ)[1] < 30): dy = 8
                if(graph_area.coords(circ)[1] > 100):
                    graph_area.coords(circ, 100, 100+ball_dia, 100+ball_dia, 100)
                    stop = True
        
        def key_up(event):
            global dy, stop
        
            dy = -8
            stop = False
            move_circ()
        
        WIDTH, HEIGHT = 400, 200
        dx, ball_dia = -5, 20
        stop = False
        
        main_win = Tk()
        main_win.title('Test - pressez fleche haut pour sauter')
        main_win.geometry(str(WIDTH)+'x'+str(HEIGHT)+'+400+100')
        main_win.bind('<Up>', key_up)
        
        graph_area = Canvas(main_win,bg='ivory',height=180,width=380)
        graph_area.place(x = 10,y = 10)
        
        graph_area.create_line(0,100+ball_dia, 380, 100+ball_dia)
        circ = graph_area.create_oval(100, 100+ball_dia, 100+ball_dia, 100 , width=1, outline='yellow', fill='yellow')
        create_obstacles()
        move_obst()
        
        main_win.mainloop()



        • Partager sur Facebook
        • Partager sur Twitter
          10 novembre 2023 à 11:55:53

          merci j'ai reussi grace à vos pistes

          je poste mon code actuel

          import tkinter
          import random
          import time
          
          tete = "@"
          queue = "a"
          terrain = [[0 for i in range(5)] for j in range(12)]
          terrain[5][2]=tete
          taille=72
          longueur=1
          vitesse=500
          score=0
          jeu = True
          delai=True
          
          contour=0
          couleur_texte="white"
          couleur_serpent='#FED713'
          fond='#4F565E'
          fond2='#2F3841'
          couleur_theme=['#FED713','#F4AD4B','#EC5F66','#BC95C4','#6499CC','#5AB4B4','#98C693',]
          
          fenetre=tkinter.Tk()
          fenetre.title("snake")
          fenetre.geometry("360x842")
          fenetre.resizable(width=False, height=False)
          espace_dessin=tkinter.Canvas(bg=fond2,width=len(terrain[0])*taille, height=len(terrain)*taille,cursor=None,highlightthickness=0)
          espace_dessin.place(x=0, y=0)
          
          def print_terrain():
              for ligne in terrain:
                  print(ligne)
          
          def dessiner_fond():
              for x in range(0,len(terrain[0])*taille,taille):
                  couleur=fond
                  if x%(2*taille)==0 :
                      couleur=fond2
                  espace_dessin.create_rectangle(x,0,x+taille,taille*len(terrain),outline=None,width=contour,fill=couleur)
          
          def dessiner_cercle(n):
              for x in range(len(terrain)):
                  for y in range(len(terrain[0])):
                      if terrain[x][y]==n :
                          espace_dessin.create_oval(taille*(y+1/5),taille*(x+1/5),taille*(y+4/5),taille*(x+4/5),outline=None,width=contour,fill=couleur_serpent)
          
          def dessiner_carré():
              for y in range(len(terrain)):
                  for x in range(len(terrain[0])):
                      if isinstance(terrain[y][x],int) :
                          if terrain[y][x]<0 :
                              espace_dessin.create_rectangle(taille*x,taille*y,taille*(x+1),taille*(y+1),outline=None,width=contour,fill=couleur_theme[(-terrain[y][x])%len(couleur_theme)])
                              label=tkinter.Label(fenetre,text=terrain[y][x],font=("Helvetica",10+taille//10))
                              label.configure(bg=couleur_theme[(-terrain[y][x])%len(couleur_theme)],width=2,fg="black")
                              label.place(x=taille*(x+1/2),y=taille*(y+1/2),anchor="center")
          
          def dessiner_bonus():
              for y in range(len(terrain)):
                  for x in range(len(terrain[0])):
                      if isinstance(terrain[y][x],int) :
                          if terrain[y][x]>0 :
                              espace_dessin.create_oval(taille*(x+1/4),taille*(y+1/4),taille*(x+3/4),taille*(y+3/4),outline=None,width=contour,fill=couleur_serpent)
                              label=tkinter.Label(fenetre,text=terrain[y][x],font=("Impact",5+taille//12))
                              label.configure(bg=couleur_serpent,width=2,fg="black")
                              label.place(x=taille*(x+1/2),y=taille*(y+1/2),anchor="center")
          
          def deplacement_gauche(event):
              global terrain,longueur
              if delai:
                  for x in range(len(terrain)):
                      for y in range(len(terrain[0])):
                          if terrain[x][y]==tete :
                              if y>0:
                                  terrain[x][y]=0
                                  terrain[x][y-1]=tete
                                  blocage_fonction
                                  return print(terrain)
          
          def deplacement_droite(event):
              global terrain,longueur
              if delai:
                  for x in range(len(terrain)):
                      for y in range(len(terrain[0])):
                          if terrain[x][y]==tete :
                              if y<len(terrain[0])-1:
                                  terrain[x][y]=0
                                  terrain[x][y+1]=tete
                                  blocage_fonction()
                                  return
          
          def defiler():
              global terrain,vitesse,longueur
              for x in range(len(terrain)):
                  for y in range(len(terrain[0])):
                      if terrain[x][y]==tete :
                          longueur=longueur+terrain[x-1][y]
                          terrain[x][y]=queue
                          terrain[x-1][y]=tete
                          raccourcir()
              if longueur>0:
                  extension=[0 for i in range(5)]
                  extension[random.randint(0,4)]=-random.randint(1,longueur+4)
                  extension[random.randint(0,4)]=random.randint(1,5)*random.randint(0,1)
                  terrain.pop()
                  terrain.insert(0,extension)
                  raffraichir()
                  vitesse=int(vitesse//1.005)
                  fenetre.after(vitesse+100, defiler)
          
          def raffraichir():
              global espace_dessin,score,labelscore
              score=score+longueur
              espace_dessin=tkinter.Canvas(bg=fond2,width=len(terrain[0])*taille, height=len(terrain)*taille,cursor=None,highlightthickness=0)
              espace_dessin.place(x=0, y=0)
              labelscore=tkinter.Label(fenetre,text=("longueur: "+str(longueur)+"      score: "+str(score)),font=("Helveticae",10+taille//10),fg="white",bg=fond2)
              labelscore.place(x=taille*2.5,y=10*taille,anchor="center")
              dessiner_fond()
              dessiner_cercle(tete)
              dessiner_cercle(queue)
              dessiner_carré()
              dessiner_bonus()
          
          def raccourcir():
              for x in range((4+longueur),len(terrain)):
                  for y in range(len(terrain[0])):
                      if terrain[x][y]==queue :
                          terrain[x][y]=0
          
          def blocage_fonction():
              global delai
              delai = False
              time.sleep((vitesse+100)/1000)
              delai=True
          
          raffraichir()
          fenetre.bind("<Left>", deplacement_gauche)
          fenetre.bind("<Right>", deplacement_droite)
          fenetre.after(600, defiler())
          fenetre.mainloop()



          • Partager sur Facebook
          • Partager sur Twitter

          probleme jeu boucle

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown