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.pysans problème)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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()
le fichier à problème: memory.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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()