Card game with Pygame: how to display the cards
gai_maito
Posted messages
6
Status
Member
-
yg_be Posted messages 23437 Registration date Status Contributor Last intervention -
yg_be Posted messages 23437 Registration date Status Contributor Last intervention -
Hello,
I am currently programming a card game using PYGAME. I have reached the point where when I draw (by clicking on the image), I need to display the cards one by one, but my program directly shows all the cards.
Could someone suggest a solution?
Thanks in advance
Configuration: Windows / Chrome 100.0.4896.88
I am currently programming a card game using PYGAME. I have reached the point where when I draw (by clicking on the image), I need to display the cards one by one, but my program directly shows all the cards.
Could someone suggest a solution?
Thanks in advance

Configuration: Windows / Chrome 100.0.4896.88
2 answers
-
Bonjour,
can you share your code using code tags: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code?-
-
```python 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() ```
-
-
OK but you didn't include the code tags as explained in the link provided by yg_be...
-
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()
-