Jeu de cartes avec Pygame: comment afficher les cartes

gai_maito Messages postés 6 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je suis en train de programmer un jeu de cartes avec PYGAME. Je suis arrivé au point où quand je pioche(en cliquant sur l'image), je dois afficher les cartes une-à-une sauf que mon programme affiche directement toutes les cartes.

Quelqu'un pourrait me proposer une solution?
Merci d'avance


Configuration: Windows / Chrome 100.0.4896.88

2 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    peux-tu partager ton code en utilisant les balises de code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code ?
    1
    1. gai_maito Messages postés 6 Statut Membre
       
      Bonjour, merci je vous envoie ci-joint le code

      import pygame
      from random import shuffle
      pygame.init()


      pygame.display.set_caption("Alliance des réussites")
      screen = pygame.display.set_mode((1095, 720))

      background = pygame.image.load('assets1/bg.jpg')
      background = pygame.transform.scale(background,(2000,720))


      clock = pygame.time.Clock()


      class Carte(pygame.sprite.Sprite):

      def __init__(self, value, color, pos_x, pos_y) -> None:
      super().__init__()
      self.color = color
      self.value = value
      self.image = pygame.image.load(f"assets1/cartes/carte-{value}-{color}.png")
      self.image = pygame.transform.scale(self.image,(72,96))
      self.rect = self.image.get_rect()
      self.rect.x = 15
      self.rect.y = 15
      self.pos_x = pos_x
      self.pos_y= pos_y
      self.velocity = 3
      self.clicked = False
      self.Isvisible = True

      def draw_card(self,screen):
      if(self.rect.x < self.pos_x):
      self.rect.x += self.velocity
      if(self.rect.y < self.pos_y):
      self.rect.y += self.velocity
      screen.blit(self.image, (self.rect.x,self.rect.y))

      def set_visible(self, bVisible):
      if bVisible == False:
      self.image = pygame.image.load("assets1/cartes/carte-dos-dos.png")
      self.image = pygame.transform.scale(self.image,(72,96))

      def compare(self, other):
      info1 = self.value, self.color
      info2 = other.value, other.color
      a, b = False, False

      if info1[0] == info2[0]:
      a = True
      if info1[1] == info2[1]:
      b = True

      return(a or b) #soit même valeur soit même couleur


      def init_liste_Card(self):
      liste = []
      i = 0
      while(i < len(game.card_infos)):
      carte = Carte(game.card_infos[i]['valeur'],game.card_infos[i]['couleur'], 15, 15)
      liste.append(carte)
      i += 1
      return liste

      def battre(self, liste):
      shuffle(liste)


      def init_liste_Card_Pos(pos_X = 15, pos_Y = 200): #au départ la 1ere carte est en bas de la pioche
      liste_card = []
      i, j = 0, 0
      while(i < len(game.card_infos)):

      if (pos_X + 72) < (screen.get_width()-87): #87 = bordure fin + une carte
      pos_X = 15+90*j
      carte = Carte(game.card_infos[i]['valeur'],game.card_infos[i]['couleur'],pos_X, pos_Y)
      liste_card.append(carte)
      j += 1

      else:
      pos_X = 15
      pos_Y += 115
      j = 0
      i -= 1
      i +=1
      return liste_card

      list_pioche_Pos = init_liste_Card_Pos() #liste cartes deja en positions differentes

      jeu = []

      class Game:

      def __init__(self, mode) -> None:
      self.mode = mode
      self.card_infos = init_pioche_fichier(f"jeu-{mode}.txt") #une fonction qui lit dans un fichier contenant les valeurs des cartes

      list_pioche_Stable = Carte.init_liste_Card()
      jeu = [] #jeu vide qu'on va contenir au fur et à mesure les cartes piochées

      def affiche():
      screen.blit(background, (0, 0))
      pioche.draw_card(screen)

      index_card_afficher = 0

      #!!!C'est ici que je dois implémenter l'affichage des cartes une-à-une!!!!#

      if pioche.clicked == True and len(list_pioche_Stable) != 0:
      pioche_liste(jeu, list_pioche_Stable) #pioche dans la liste_pioche la met dans jeu et efface dans liste_pioche

      index_card_afficher = len(jeu) - 1 #toujours vouloir afficher la dernière carte prise

      jeu[index_card_afficher].draw_card(screen) #carte pioché affichée

      #!!!Et c'est ici qu'il y a un problème!!!#

      pygame.display.flip()

      # _______________________BUTTON__________________________#
      for event in pygame.event.get():
      if event.type == pygame.QUIT:
      running = False
      pygame.quit()
      if event.type == pygame.KEYDOWN:
      if event.key == pygame.K_ESCAPE:
      running = False
      pygame.quit()
      if event.type == pygame.MOUSEBUTTONDOWN:
      if pioche.rect.collidepoint(event.pos):
      if pygame.mouse.get_pressed()[0] == 1:
      pioche.clicked = True

      elif pygame.mouse.get_pressed()[0] == 0:
      pioche.clicked = False



      pioche = Carte('dos','dos',15,15)
      game = Game(32)


      def main():

      running = True

      while running:
      affiche()

      clock.tick(30)


      if __name__ == '__main__':
      main()
      0
    2. gai_maito Messages postés 6 Statut Membre
       

      import pygame
      from random import shuffle
      from test import init_pioche_fichier
      from test import pioche_liste

      pygame.init()


      pygame.display.set_caption("Alliance des réussites")
      screen = pygame.display.set_mode((1095, 720))

      background = pygame.image.load('assets1/bg.jpg')
      background = pygame.transform.scale(background,(2000,720))


      clock = pygame.time.Clock()


      class Carte(pygame.sprite.Sprite):

      def __init__(self, value, color, pos_x, pos_y) -> None:
      super().__init__()
      self.color = color
      self.value = value
      self.image = pygame.image.load(f"assets1/cartes/carte-{value}-{color}.png")
      self.image = pygame.transform.scale(self.image,(72,96))
      self.rect = self.image.get_rect()
      self.rect.x = 15
      self.rect.y = 15
      self.pos_x = pos_x
      self.pos_y= pos_y
      self.velocity = 3
      self.clicked = False
      self.Isvisible = True

      def draw_card(self,screen):
      if(self.rect.x < self.pos_x):
      self.rect.x += self.velocity
      if(self.rect.y < self.pos_y):
      self.rect.y += self.velocity
      screen.blit(self.image, (self.rect.x,self.rect.y))

      def set_visible(self, bVisible):
      if bVisible == False:
      self.image = pygame.image.load("assets1/cartes/carte-dos-dos.png")
      self.image = pygame.transform.scale(self.image,(72,96))

      def compare(self, other):
      info1 = self.value, self.color
      info2 = other.value, other.color
      a, b = False, False

      if info1[0] == info2[0]:
      a = True
      if info1[1] == info2[1]:
      b = True

      return(a or b) #soit même valeur soit même couleur


      def init_liste_Card(self):
      liste = []
      i = 0
      while(i < len(game.card_infos)):
      carte = Carte(game.card_infos[i]['valeur'],game.card_infos[i]['couleur'], 15, 15)
      liste.append(carte)
      i += 1
      return liste

      def battre(self, liste):
      shuffle(liste)

      class Game:

      def __init__(self, mode) -> None:
      self.mode = mode
      self.card_infos = init_pioche_fichier(f"jeu-{mode}.txt") #une fonction qui lit dans un fichier contenant les valeurs des cartes

      pioche = Carte('dos','dos',15,15)
      game = Game(32)

      def init_liste_Card_Pos(pos_X = 15, pos_Y = 200): #au départ la 1ere carte est en bas de la pioche
      liste_card = []
      i, j = 0, 0
      while(i < len(game.card_infos)):

      if (pos_X + 72) < (screen.get_width()-87): #87 = bordure fin + une carte
      pos_X = 15+90*j
      carte = Carte(game.card_infos[i]['valeur'],game.card_infos[i]['couleur'],pos_X, pos_Y)
      liste_card.append(carte)
      j += 1

      else:
      pos_X = 15
      pos_Y += 115
      j = 0
      i -= 1
      i +=1
      return liste_card

      list_pioche_Pos = init_liste_Card_Pos() #liste cartes deja en positions differentes

      carte = Carte('dos','dos', 15, 15)

      list_pioche_Stable = carte.init_liste_Card()
      jeu = [] #jeu vide qu'on va contenir au fur et à mesure les cartes piochées

      def affiche():
      screen.blit(background, (0, 0))
      pioche.draw_card(screen)

      index_card_afficher = 0

      #!!!C'est ici que je dois implémenter l'affichage des cartes une-à-une!!!!#

      if pioche.clicked == True and len(list_pioche_Stable) != 0:
      pioche_liste(jeu, list_pioche_Stable) #pioche dans la liste_pioche la met dans jeu et efface dans liste_pioche

      index_card_afficher = len(jeu) - 1 #toujours vouloir afficher la dernière carte prise

      jeu[index_card_afficher].draw_card(screen) #carte pioché affichée

      #!!!Et c'est ici qu'il y a un problème!!!#

      pygame.display.flip()

      # _______________________BUTTON__________________________#
      for event in pygame.event.get():
      if event.type == pygame.QUIT:
      running = False
      pygame.quit()
      if event.type == pygame.KEYDOWN:
      if event.key == pygame.K_ESCAPE:
      running = False
      pygame.quit()
      if event.type == pygame.MOUSEBUTTONDOWN:
      if pioche.rect.collidepoint(event.pos):
      if pygame.mouse.get_pressed()[0] == 1:
      pioche.clicked = True

      elif pygame.mouse.get_pressed()[0] == 0:
      pioche.clicked = False



      def main():

      running = True

      while running:
      affiche()

      clock.tick(30)


      if __name__ == '__main__':
      main()

      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > gai_maito Messages postés 6 Statut Membre
         
        Es-tu certain d'avoir partagé tout ton code?
        0
      2. gai_maito Messages postés 6 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Oui, mais là où j'ai commenté #c'est ici qu'il y a un problème
        J'ai un peu modifié mais ça ne marche pas, mais c'est le code intégral
        0
      3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > gai_maito Messages postés 6 Statut Membre
         
        as-tu partagé la fonction
        init_pioche_fichier()
        ?
        0
  2. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    OK mais tu n'as pas mis les balises de code comme expliqué dans le lien donne par yg_be ...
    1
    1. gai_maito Messages postés 6 Statut Membre
       
          
      import pygame
      from random import shuffle
      from test import init_pioche_fichier
      from test import pioche_liste
      
      pygame.init()
      
      
      pygame.display.set_caption("Alliance des réussites")
      screen = pygame.display.set_mode((1095, 720))
      
      background = pygame.image.load('assets1/bg.jpg')
      background = pygame.transform.scale(background,(2000,720))
      
      
      clock = pygame.time.Clock()
      
      
      class Carte(pygame.sprite.Sprite):
      
          def __init__(self, value, color, pos_x, pos_y) -> None:
              super().__init__()
              self.color = color
              self.value = value
              self.image = pygame.image.load(f"assets1/cartes/carte-{value}-{color}.png")
              self.image = pygame.transform.scale(self.image,(72,96))
              self.rect = self.image.get_rect()
              self.rect.x = 15
              self.rect.y = 15
              self.pos_x = pos_x 
              self.pos_y= pos_y
              self.velocity = 3
              self.clicked = False
              self.Isvisible = True
          
          def draw_card(self,screen):
              if(self.rect.x < self.pos_x):
                  self.rect.x += self.velocity
              if(self.rect.y < self.pos_y):
                  self.rect.y += self.velocity        
              screen.blit(self.image, (self.rect.x,self.rect.y))
      
          def set_visible(self, bVisible):
              if bVisible == False:
                  self.image = pygame.image.load("assets1/cartes/carte-dos-dos.png")
                  self.image = pygame.transform.scale(self.image,(72,96))
      
          def compare(self, other):
              info1 = self.value, self.color
              info2 = other.value, other.color
              a, b = False, False
      
              if info1[0] == info2[0]:
                  a = True
              if info1[1] == info2[1]:
                  b = True
      
              return(a or b)  #soit même valeur soit même couleur    
      
      
          def init_liste_Card(self):
              liste = []
              i = 0
              while(i < len(game.card_infos)):
                  carte = Carte(game.card_infos[i]['valeur'],game.card_infos[i]['couleur'], 15, 15)
                  liste.append(carte)
                  i += 1
              return liste
      
          def battre(self, liste):
              shuffle(liste)
      
      class Game:
      
          def __init__(self, mode) -> None:
              self.mode = mode
              self.card_infos = init_pioche_fichier(f"jeu-{mode}.txt") #une fonction qui lit dans un fichier contenant les valeurs des cartes
      
      pioche = Carte('dos','dos',15,15)
      game = Game(32)
      
      def init_liste_Card_Pos(pos_X = 15, pos_Y = 200): #au départ la 1ere carte est en bas de la pioche
          liste_card = []
          i, j = 0, 0
          while(i < len(game.card_infos)):
      
              if (pos_X + 72) < (screen.get_width()-87): #87 = bordure fin + une carte
                  pos_X = 15+90*j
                  carte = Carte(game.card_infos[i]['valeur'],game.card_infos[i]['couleur'],pos_X, pos_Y)
                  liste_card.append(carte)
                  j += 1
              
              else:
                  pos_X = 15
                  pos_Y += 115
                  j = 0
                  i -= 1
              i +=1
          return liste_card
      
      list_pioche_Pos = init_liste_Card_Pos()     #liste cartes deja en positions differentes
      
      carte = Carte('dos','dos', 15, 15)
      
      list_pioche_Stable = carte.init_liste_Card()
      jeu = []    #jeu vide qu'on va contenir au fur et à mesure les cartes piochées
      
      def affiche():
          screen.blit(background, (0, 0))
          pioche.draw_card(screen)
          
          index_card_afficher = 0
      
      #!!!C'est ici que je dois implémenter l'affichage des cartes une-à-une!!!!#    
      
          if pioche.clicked == True and len(list_pioche_Stable) != 0:
              pioche_liste(jeu, list_pioche_Stable) #pioche dans la liste_pioche la met dans jeu et efface dans liste_pioche
              
              index_card_afficher = len(jeu) - 1      #toujours vouloir afficher la dernière carte prise
      
              jeu[index_card_afficher].draw_card(screen)  #carte pioché affichée
      
      #!!!Et c'est ici qu'il y a un problème!!!#        
      
          pygame.display.flip()
      
      # _______________________BUTTON__________________________#
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                  running = False
                  pygame.quit()
              if event.type == pygame.KEYDOWN:
                  if event.key == pygame.K_ESCAPE:
                      running = False
                      pygame.quit()
              if event.type == pygame.MOUSEBUTTONDOWN:
                  if pioche.rect.collidepoint(event.pos):
                      if pygame.mouse.get_pressed()[0] == 1:
                          pioche.clicked = True
      
                      elif pygame.mouse.get_pressed()[0] == 0:
                          pioche.clicked = False
      
      
      
      def main():
      
          running = True
          
          while running:
              affiche()
      
              clock.tick(30)
      
      
      if __name__ == '__main__':
          main()
        
      0
      1. gai_maito Messages postés 6 Statut Membre > gai_maito Messages postés 6 Statut Membre
         
        Désolé, voilà
        merci beaucoup
        0