Bonjour,

Je suis étudiant en info et on me demande de rendre un TP qui est de faire le jeu du Taquin, de faire la partie graphique. Mais je n'y comprend rien. Je suis bloqué à un exercice dont je ne vois toujours aucune issue. L'énoncé est le suivant :

"Le contrôleur de bouge case (1). Nous allons écrire une première version du contrôleur
qui gère l'événement l’utilisateur a cliqué sur une image. Chaque bouton qui affiche un chiffre doit être
associé à ce contrôleur. C’est une méthode ctrl_choisit_case(self) de VueTaquin, qui choisit
aléatoirement une case du plateau, et demande au modèle de bouger cette case. La vue se met ensuite
à jour.
Dans le dessin ci-dessus, cela pourrait conduire au fonctionnement suivant : l’utilisateur clique sur la
case 5, c’est la case 13 qui est choisie aléatoirement et permutée avec le vide (la case vide).
Spécifiez puis écrivez la méthode ctrl_choisit_case(self)."


Le problème dans mon code est que lorsque je clique sur une case , une case de vient bien vide mais du coup je me retrouve avec deux cases vides et non une seul, si je clique sur une troisième case je me retrouve avec trois cases vides, ca ne se termine jamais.

Voici mon code :
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
 
from taquin import *
import tkinter
from random import randint
class VueTaquin:
    def __init__(self,jeu):
        self.__jeu = jeu
        fenetre = tkinter.Tk()
        fenetre.title("Le Taquin")
        dim = self.__jeu.dim()
        self.__bouton_image = []
        self.__image = []
        for i in range(dim*dim):
            image = tkinter.PhotoImage(file=str(i)+".gif")
            self.__image.append(image)
        for i in range(dim):
            for j in range(dim):
                if i == dim - 1 and j == dim - 1:
                    btn = tkinter.Button(fenetre,image=self.__image[0])
                    self.__bouton_image.append(btn)
                    self.__bouton_image[(i*dim)+j].grid(row=i,column=j)
                else:
                    btn = tkinter.Button(fenetre,image=self.__image[(i*dim)+j+1])
                    self.__bouton_image.append(btn)
                    self.__bouton_image[(i*dim)+j].grid(row=i,column=j)
 
        btn_recommencer = tkinter.Button(fenetre,text="Recommencer")
        btn_recommencer.grid(row = dim + 1, column = 0)
 
        btn_quitter = tkinter.Button(fenetre, text="Quitter", command=fenetre.destroy)
        btn_quitter.grid(row = dim + 1, column = dim - 1)
        self.__fenetre = fenetre
        self.bouge_case()
 
    def clique(self):
        def ctrl_choisit_case():
            valeur = randint(0, len(self.__bouton_image)-1)
            self.__bouton_image[valeur]["image"] = self.__image[0]
        return ctrl_choisit_case
 
 
    def bouge_case(self):
        for i in range(self.__jeu.dim()) :
            for j in range(self.__jeu.dim()) : 
                self.__bouton_image[self.__jeu.get(i,j)]["command"] = self.clique()
        self.__fenetre.mainloop()
 
 
 
if __name__ == '__main__' :
    mon_appli = VueTaquin(Taquin())
Je vous remercie pour votre temps,