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 -
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

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
-
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 ?-
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() -
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 mais tu n'as pas mis les balises de code comme expliqué dans le lien donne par 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()
-