Et oui, j'ai encore des problèmes avec mon jeu de memory(problème précédent sur le même sujet). je vous remercie d'avance pour votre patience et je jure que j'ai fait des recherches sur google mon ami avant de poster ici.
Le jeu n'est pas fini: il me manque un menu d'accueil, le remplacement des messages sur console par des messages sonores mais ça c'est de la finition.
Je vous envoie deux codes: le ficher carte.py ( pas de problème lorsque je le teste) et le fichier memory.py ( celui où j'ai un souci)
Le problème: je lance mon memory. Je retourne deux cartes. Si ce ne sont pas les mêmes, il ya un pause de 2 secondes puis les deux cartes redisparaissent.
Si je vais lentement, tout marche.
Si je clique vite, j'ai une erreur que je ne comprends pas:
ReactionAuClic \\NETWORKSPACE2\OpenShare\raf\jeux python\memory\memory.py 65
ValueError: list.remove(x): x not in list
concernant la ligne: self.cartes.remove(carte_cliquée)
il me dit donc que l'objet carte_cliquée n'est pas dans ma liste et qu'il ne peut la retirer de la liste.
Mais pourquoi cette erreur ne survient que si je vais trop vite?
Autre surprise pour moi: j'ai passé le programme sur un petit portbale tactile équipé de windows 8: si je clique à la souris lentement, le programme marche.
Si je clique avec le doigt, j'obtiens la même erreur que si j'étais allé trop vite.
J'explique mon but final: faire un jeu de memory sur ecran tactile pour ma fille de bientôt 3 ans.
remarque: le souci est que vous ne pouvez tester le programme que si vous disposez d'un dossier data avec au moins 6 fichiers nommés: carte1.png,carte2.png,etc....
Merci d'avance pour votre patience, vos réponses:
le fichier carte.py:(sans problème)
le fichier à problème: memory.pyCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 # Créé par rafoim, le 30/12/2013 en Python 3.2 import pygame import os from pygame.locals import * pygame.init() def load_image(name, colorkey=None): fullname = os.path.join('data', name) try: image = pygame.image.load(fullname) except (pygame.error): print ("Impossible de charger l'image :", name) raise (SystemExit) image = image.convert() if colorkey is not None: if colorkey is -1: colorkey = image.get_at((0,0)) image.set_colorkey(colorkey, RLEACCEL) return image class Carte(): def __init__(self,chemin_image_cachée,chemin_image_visible,rectangle): self.chemin=chemin_image_visible self.surface_visible=load_image(chemin_image_visible) self.surface_cachée=load_image(chemin_image_cachée) self.rectangle=rectangle self.visible=True self.Retourner() def Retourner(self): screen = pygame.display.get_surface() if self.visible==False: screen.blit(self.surface_visible,self.rectangle) self.visible=True else: screen.blit(self.surface_cachée,self.rectangle) self.visible=False pygame.display.update(self.rectangle) if __name__=="__main__": screen = pygame.display.set_mode((1300, 700)) fond=load_image("fond.png") screen.blit(fond,(0,0)) pygame.display.flip() rectangle=Rect(100,50,300,200) carte1=Carte("carte0.png","carte1.png",rectangle) continuer=1 while continuer: for event in pygame.event.get(): if event.type==QUIT: continuer=0 if event.type==MOUSEBUTTONDOWN: if carte1.rectangle.collidepoint(event.pos): carte1.Retourner() pygame.quit()
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 # Créé par rafoim, le 30/12/2013 en Python 3.2 from random import randint import pygame from pygame.locals import * from carte import * def TirageSansRemise(liste,nombre): # à partir d'une liste donnée, on renvoie une liste extraite de n éléments où n est le nombre sans répétition l1=liste l2=[] for i in range(nombre): pos=randint(0,len(l1)-1) l2.append(l1[pos]) l1.remove(l1[pos]) return l2 def ListePositions(largeur=280,hauteur=200,largeur_totale=1300,hauteur_totale=700,NbLignes= 3,NbColonnes=4): espace_horizontal=(largeur_totale-largeur*NbColonnes)//(NbColonnes+1) espace_vertical=(hauteur_totale-hauteur*NbLignes)//(NbLignes+1) rectangles=[] for i in range(NbLignes): #i est l'indice de ligne for j in range(NbColonnes): abscisse_coin= (j+1)*espace_vertical+j*largeur ordonnée_coin= (i+1)*espace_vertical+i*hauteur rectangle=Rect(abscisse_coin,ordonnée_coin,largeur,hauteur) rectangles.append(rectangle) return rectangles class Memory(): def __init__(self,liste,NbLignes=3,NbColonnes=4): #on dit que pour l'instant, il n'y a pas de carte déjà retournée self.premiere_carte_retournée=False self.premiere_carte=None # On tire 6 cartes dans la liste l=TirageSansRemise(liste,6) # On double la liste l=l*2 # On mélange les cartes l=TirageSansRemise(l,12) #On calcule la liste des positions liste_rectangles=ListePositions() # On initialise les cartes ce qui déclenche aussi l'affichage self.cartes=[] NbImages=NbColonnes*NbLignes for i in range(NbImages): chemin1="carte0.png" chemin2=l[i] rect=liste_rectangles[i] carte=Carte(chemin1,chemin2,rect) self.cartes.append(carte) def TestDeVictoire(self): if self.cartes==[]: print("tu as gagné la partie!!") pygame.time.wait(6000) continuer=0 def ReactionAuClic(self,carte_cliquée): if self.premiere_carte_retournée: if carte_cliquée.chemin==self.premiere_carte.chemin: print("bravo") self.cartes.remove(self.premiere_carte) self.cartes.remove(carte_cliquée) self.TestDeVictoire() else: print("raté!!!") pygame.time.wait(2000) carte_cliquée.Retourner() self.premiere_carte.Retourner() self.premiere_carte_retournée=False else: self.premiere_carte=carte_cliquée self.premiere_carte_retournée=True print("il faut trouver l'autre carte") if __name__=="__main__": screen = pygame.display.set_mode((1300, 700)) fond=load_image("fond.png") screen.blit(fond,(0,0)) pygame.display.flip() liste_images=[] for i in range(1,11): chemin="carte"+str(i)+".png" liste_images.append(chemin) memo=Memory(liste_images) continuer=1 while continuer: for event in pygame.event.get(): if event.type==QUIT: continuer=0 if event.type==MOUSEBUTTONDOWN: for carte in memo.cartes: if carte.rectangle.collidepoint(event.pos): carte.Retourner() memo.ReactionAuClic(carte) pygame.quit()