Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pouvez-me proposer une version Pygame de ce code ?

Sujet résolu
    25 janvier 2023 à 19:54:06

    Bonjour j'ai écrit ce programme avec l'interface graphique Tkinter : 

    from tkinter import *
    from random import randint
    from time import sleep, time
    from math import sqrt
     
    HAUTEUR = 500
    LARGEUR = 800
    fenêtre = Tk()
    fenêtre.title('Le sous marin')
    c = Canvas(fenêtre, height = HAUTEUR, width = LARGEUR, bg='darkblue')
    c.pack()
     
    id_sousmarin = c.create_polygon(5, 5, 5, 25, 30, 15, fill='red')
    id_sousmarin2 = c.create_oval(0, 0, 30, 30, outline="red")
    R_SOUSMARIN = 15
    X_MIL = LARGEUR/2
    Y_MIL = HAUTEUR/2
    c.move(id_sousmarin, X_MIL, Y_MIL)
    c.move(id_sousmarin2, X_MIL, Y_MIL)
     
    VIT_SOUSMARIN = 10
     
    id_bulle = list()
    r_bulle = list()
    vitesse_bulle = list()
    R_BULLE_MIN = 10
    R_BULLE_MAX = 30
    VITESSE_BULLE_MAX = 10
    ECART = 100
     
    def déplacer_sousmarin(évènement):
        if évènement.keysym == 'Up':
            c.move(id_sousmarin, 0, -VIT_SOUSMARIN)
            c.move(id_sousmarin2, 0, -VIT_SOUSMARIN)
        elif évènement.keysym == 'Down':
            c.move(id_sousmarin, 0, VIT_SOUSMARIN)
            c.move(id_sousmarin2, 0, VIT_SOUSMARIN)
        elif évènement.keysym == 'Left':
            c.move(id_sousmarin, -VIT_SOUSMARIN, 0)
            c.move(id_sousmarin2, -VIT_SOUSMARIN, 0)
        elif évènement.keysym == 'Right':
            c.move(id_sousmarin, VIT_SOUSMARIN, 0)
            c.move(id_sousmarin2, VIT_SOUSMARIN, 0)
    c.bind_all('<Key>', déplacer_sousmarin)
     
    def créer_bulle():
        x = LARGEUR + ECART
        y = randint(0, HAUTEUR)
        r = randint(R_BULLE_MIN, R_BULLE_MAX)
        id1 = c.create_oval (x - r, y - r, x + r, y + r, outline='white')
        id_bulle.append(id1)
        r_bulle.append(r)
        vitesse_bulle.append(randint(1, VITESSE_BULLE_MAX))
     
    def déplacer_bulles():
        for i in range(len(id_bulle)):
            c.move(id_bulle[i], -vitesse_bulle[i], 0)
     
    def trouver_coords(num_id):
        pos = c.coords(num_id)
        x = (pos[0] + pos[2])/2
        y = (pos[1] + pos[3])/2
        return x, y
     
    def suppr_bulle(i):
        del r_bulle[i]
        del vitesse_bulle[i]
        c.delete(id_bulle[i])
        del id_bulle [i]
     
    def effacer_bulle():
        for i in range (len(id_bulle)-1, -1, -1):
            x, y = trouver_coords(id_bulle[i])
            if x < -ECART:
                suppr_bulle(i)
     
    def distance(id1, id2):
        x1, y1 = trouver_coords(id1)
        x2, y2 = trouver_coords(id2)
        return sqrt((x2 - x1)**2 + (y2 - y1)**2)
     
    def collision():
        points = 0
        for bulle in range(len(id_bulle)-1, -1, -1):
            if distance(id_sousmarin2, id_bulle[bulle]) < (R_SOUSMARIN + r_bulle[bulle]):
                points += (r_bulle[bulle] + vitesse_bulle[bulle])
                suppr_bulle(bulle)
        return points
     
    c.create_text(100, 30, text='TEMPS RESTANT', fill='white')
    c.create_text(200, 30, text='SCORE', fill='white')
    texte_temps = c.create_text(100, 50, fill='white')
    texte_score = c.create_text(200, 50, fill='white')
     
    def afficher_score(score):
        c.itemconfig(texte_score, text=str(score))
     
    def afficher_temps(temps_restant):
        c.itemconfig(texte_temps, text=str(temps_restant))
     
    BULLE_HASARD = 10
    LIMITE_TEMPS = 30
    SCORE_BONUS = 1000
    score = 0
    bonus = 0
    fin = time() + LIMITE_TEMPS
     
    while time() < fin:
        if randint(1, BULLE_HASARD) == 1:
            créer_bulle()
        déplacer_bulles()
        effacer_bulle()
        score += collision()
        if(int(score/SCORE_BONUS)) > bonus:
            bonus += 1
            fin += LIMITE_TEMPS
        afficher_score(score)
        afficher_temps(int(fin - time()))
        fenêtre.update()
        sleep(0.01)
     
    c.create_text(X_MIL, Y_MIL, \
                  text='PARTIE TERMINÉE', fill='white', font=('Helvetica', 30))
    c.create_text(X_MIL, Y_MIL + 30, \
                  text='Score : ' + str(score), fill='white')
    c.create_text(X_MIL, Y_MIL + 45, \
                  text='Temps bonus : ' + str(bonus*LIMITE_TEMPS), fill='white')

    Pourriez-vous me proposer une version Pygame s'il vous plait. Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      25 janvier 2023 à 20:07:31

      j'ai pas inséré toutes les fonctions ...
      from pygame import *
      from random import randint
      
      scr = display.set_mode((800,500))
      
      class SousMarin:
          
          r    = 15   # radius
          x    = 50.  # position en pixels
          y    = 250. # du SousMarin
          spd  = 200. # vitesse en pixels par seconde
          clk  = time.Clock()
          tick = 0
          drct = {0:(0,0),K_DOWN:(0,1),K_UP:(0,-1), K_LEFT:(-1,0),K_RIGHT:(1,0)}
          keys = [0]
          
          img  = Surface((30,30))
          rect = Rect(0,0,30,30)
          draw.polygon(img,Color('red'),((5,5),(5,25),(30,15)))
          draw.circle (img,Color('red'),(15,15),15,1)
          
          @staticmethod
          def update(ev=None):
              # déplacement en fonction du temps écoulé
              v = (SousMarin.spd/1000)*SousMarin.clk.tick()
              SousMarin.x += SousMarin.drct[SousMarin.keys[-1]][0]*v
              SousMarin.y += SousMarin.drct[SousMarin.keys[-1]][1]*v
              SousMarin.rect.center = (SousMarin.x,SousMarin.y)
              # empêche de sortir du cadre
              if not scr.get_rect().contains(SousMarin.rect):
                  SousMarin.rect.clamp_ip(scr.get_rect())
                  SousMarin.x,SousMarin.y = SousMarin.rect.center
              
              # gestion des touches fléchées
              if ev:
                  if ev.type == KEYDOWN:
                      if ev.key in (K_DOWN,K_UP,K_LEFT,K_RIGHT):
                          SousMarin.keys.append(ev.key)
                  elif ev.type == KEYUP:
                      if ev.key in SousMarin.keys:
                          SousMarin.keys.remove(ev.key)
      
      
      class Bulles:
          
          alls = []
          clk  = time.Clock()
          tick = 0
          
          class Bulle:
              
              min_radius = 30 # fourchette de diamètre
              max_radius = 80 # des bulles
              
              def __init__(self):
                  self.r   = randint(self.min_radius,self.max_radius)
                  self.x   = 800+self.r
                  self.y   = randint(self.r,500-self.r)
                  self.s   = randint(100,300) # fourchette de vitesse des bulles
                  self.clk = time.Clock()
              
              def update(self):
                  self.x -= (self.s/1000)*self.clk.tick()
                  # si la bulle sort de la scène
                  if self.x+self.r < 0:
                      return False
                  # si la bulle touche le SousMarin
                  if (self.x-SousMarin.x)**2+(self.y-SousMarin.y)**2 < (self.r+SousMarin.r)**2:
                      return False
                  return True
                  
                  
          @staticmethod
          def update():
              Bulles.tick += Bulles.clk.tick()
              if Bulles.tick >= 500: # une nouvelle bulle toutes les 500ms
                  Bulles.alls.append(Bulles.Bulle())
                  Bulles.tick -= 500
              Bulles.alls = [bulle for bulle in Bulles.alls if bulle.update()]        
          
      
      # redessine la scène, framerate de 50 images/seconde
      def redraw():
          redraw.tick += redraw.clk.tick()
          if redraw.tick >= 20:
              scr.fill(Color('darkblue'))
              for bulle in Bulles.alls:
                  draw.circle(scr,Color('white'),(bulle.x,bulle.y),bulle.r,1)
              scr.blit(SousMarin.img,SousMarin.rect)
              display.flip()
              redraw.tick -= 20
      redraw.clk  = time.Clock()
      redraw.tick = 0
      
      clk  = time.Clock()
      tick = 0
      # mainloop
      while True:
          
          tick += clk.tick(100)
          # limite de 30 secondes
          if tick >= 30_000:
              break
          
          for ev in event.get():
              
              if ev.type == QUIT:
                  break
              # envoie la commande au SousMarin
              SousMarin.update(ev)
          
          else:
              
              Bulles.update()
              SousMarin.update()
              redraw()
              continue
          
          break
      
      
      

      -
      Edité par josmiley 25 janvier 2023 à 21:38:58

      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        26 janvier 2023 à 8:04:56

        josmiley a écrit:

        j'ai pas inséré toutes les fonctions ...

        from pygame import *
        from random import randint
        
        scr = display.set_mode((800,500))
        
        class SousMarin:
            
            r    = 15   # radius
            x    = 50.  # position en pixels
            y    = 250. # du SousMarin
            spd  = 200. # vitesse en pixels par seconde
            clk  = time.Clock()
            tick = 0
            drct = {0:(0,0),K_DOWN:(0,1),K_UP:(0,-1), K_LEFT:(-1,0),K_RIGHT:(1,0)}
            keys = [0]
            
            img  = Surface((30,30))
            rect = Rect(0,0,30,30)
            draw.polygon(img,Color('red'),((5,5),(5,25),(30,15)))
            draw.circle (img,Color('red'),(15,15),15,1)
            
            @staticmethod
            def update(ev=None):
                # déplacement en fonction du temps écoulé
                v = (SousMarin.spd/1000)*SousMarin.clk.tick()
                SousMarin.x += SousMarin.drct[SousMarin.keys[-1]][0]*v
                SousMarin.y += SousMarin.drct[SousMarin.keys[-1]][1]*v
                SousMarin.rect.center = (SousMarin.x,SousMarin.y)
                # empêche de sortir du cadre
                if not scr.get_rect().contains(SousMarin.rect):
                    SousMarin.rect.clamp_ip(scr.get_rect())
                    SousMarin.x,SousMarin.y = SousMarin.rect.center
                
                # gestion des touches fléchées
                if ev:
                    if ev.type == KEYDOWN:
                        if ev.key in (K_DOWN,K_UP,K_LEFT,K_RIGHT):
                            SousMarin.keys.append(ev.key)
                    elif ev.type == KEYUP:
                        if ev.key in SousMarin.keys:
                            SousMarin.keys.remove(ev.key)
        
        
        class Bulles:
            
            alls = []
            clk  = time.Clock()
            tick = 0
            
            class Bulle:
                
                min_radius = 30 # fourchette de diamètre
                max_radius = 80 # des bulles
                
                def __init__(self):
                    self.r   = randint(self.min_radius,self.max_radius)
                    self.x   = 800+self.r
                    self.y   = randint(self.r,500-self.r)
                    self.s   = randint(100,300) # fourchette de vitesse des bulles
                    self.clk = time.Clock()
                
                def update(self):
                    self.x -= (self.s/1000)*self.clk.tick()
                    # si la bulle sort de la scène
                    if self.x+self.r < 0:
                        return False
                    # si la bulle touche le SousMarin
                    if (self.x-SousMarin.x)**2+(self.y-SousMarin.y)**2 < (self.r+SousMarin.r)**2:
                        return False
                    return True
                    
                    
            @staticmethod
            def update():
                Bulles.tick += Bulles.clk.tick()
                if Bulles.tick >= 500: # une nouvelle bulle toutes les 500ms
                    Bulles.alls.append(Bulles.Bulle())
                    Bulles.tick -= 500
                Bulles.alls = [bulle for bulle in Bulles.alls if bulle.update()]        
            
        
        # redessine la scène, framerate de 50 images/seconde
        def redraw():
            redraw.tick += redraw.clk.tick()
            if redraw.tick >= 20:
                scr.fill(Color('darkblue'))
                for bulle in Bulles.alls:
                    draw.circle(scr,Color('white'),(bulle.x,bulle.y),bulle.r,1)
                scr.blit(SousMarin.img,SousMarin.rect)
                display.flip()
                redraw.tick -= 20
        redraw.clk  = time.Clock()
        redraw.tick = 0
        
        clk  = time.Clock()
        tick = 0
        # mainloop
        while True:
            
            tick += clk.tick(100)
            # limite de 30 secondes
            if tick >= 30_000:
                break
            
            for ev in event.get():
                
                if ev.type == QUIT:
                    break
                # envoie la commande au SousMarin
                SousMarin.update(ev)
            
            else:
                
                Bulles.update()
                SousMarin.update()
                redraw()
                continue
            
            break
        
        
        

        -
        Edité par josmiley il y a environ 10 heures

        Merci beaucoup !!! ce n'est pas grave pour les fonctions. J'ai une question : est-ce que tu sais s'il existe des cours pour pygame ?



        • Partager sur Facebook
        • Partager sur Twitter
          26 janvier 2023 à 8:11:27

          Y a des tutos sur YouTube , sinon j'ai appris juste en lisant la doc , c'est assez facile à comprendre en fait car le principe est plutôt simple .

          -
          Edité par josmiley 26 janvier 2023 à 8:11:41

          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

          Pouvez-me proposer une version Pygame de ce code ?

          × 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