Jeu de cartes avec Pygame: comment afficher les cartes

gai_maito Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 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
A voir également:

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
peux-tu partager ton code en utilisant les balises de code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code ?
1
gai_maito Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
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
gai_maito Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 

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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > gai_maito Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Es-tu certain d'avoir partagé tout ton code?
0
gai_maito Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > gai_maito Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
as-tu partagé la fonction
init_pioche_fichier()
?
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
OK mais tu n'as pas mis les balises de code comme expliqué dans le lien donne par yg_be ...
1
gai_maito Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
    
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
gai_maito Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   > gai_maito Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Désolé, voilà
merci beaucoup
0