Bonjour, je suis actuellement en première année de licence, et j'ai un projet de fin d'année à réaliser en informatique : le jeu taquin

Mon jeu fonctionne correctement en version "texte" mais je dois maintenant m'attaquer à la phase graphique, pourtant pas compliqué puisse tout est quasiment donnée dans le sujet
Sauf que je n'ai jamais fait de graphisme avec tkinter et je suis perdue

Je vous donne donc le code que le prof nous a donné ainsi que le sujet (les trucs a modifier dans le code)

Je suis preneuse de toute aide !
Merci d'avance


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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
"""
:mod: module
 
:author: FIL - IEEA - Univ. Lille1.fr <http://portail.fil.univ-lille1.fr>_
:completed by:
 
:date: 2015, december
 
Interface graphique pour jouer eu taquin
"""
 
from tkinter import *
import tkinter.filedialog as tkfdial
 
from taquin import *
 
# nbre de lignes et de pièces par lignes du taquin
DIM_TAQUIN = 4
# dimension en pixels de la taille de l'image du taquin
TAILLE_TAQUIN = 600
# taille d'une pièce carrée du taquin (en pixels)
TAILLE_PIECE = TAILLE_TAQUIN // DIM_TAQUIN
GEOMETRIE = '{:d}x{:d}'.format (30 + 2 * DIM_TAQUIN * TAILLE_PIECE,
                                52 + DIM_TAQUIN * TAILLE_PIECE)
 
image = None
image_decoupee = [None for k in range(DIM_TAQUIN * DIM_TAQUIN)]
taquin = None
fenetre = None
case_vide = None
puzzle = None
modele = None
 
 
 
def cases_voisines (c1, c2):
    """
    renvoie 
    - True si les cases c1 et c2 sont voisines
    - False sinon
 
    : CU: aucune
 
    :Exemples:
    >>> cases_voisines ((1,2), (1,3))
    True
    >>> cases_voisines ((1,2), (1,1))
    True
    >>> cases_voisines ((1,2), (0,2))
    True
    >>> cases_voisines ((1,2), (2,2))
    True
    >>> cases_voisines ((1,2), (2,1))
    False
    """
    if c1[0]==c2[0]:
        if c1[1]+1==c2[1]:
            return True
        elif c1[1]-1==c2[1]:
            return True
        else:
            return False
    if c1[1]==c2[1]:
        if c1[0]+1==c2[0]:
            return True
        elif c1[0]-1==c2[0]:
            return True
        else:
            return False
    else:
        return False
 
 
 
 
def afficher_pieces ():
    """
    affiche les pièces du puzzle.
    """
    for l in range (DIM_TAQUIN):
        for c in range (DIM_TAQUIN):
            num_piece = numero_piece (taquin, c, l)
#a modifier
            piece = image_decoupee [num_piece - 1]
            puzzle.create_image (c * (TAILLE_PIECE + 1),
                                 l * (TAILLE_PIECE + 1),
                                 anchor = NW,
                                 image = piece)
 
 
def melanger ():
    """
    mélange les pièces du taquin
    """
    if image != None:
        pass
 
def sous_image (src,xA,yA,xB,yB):
    """
    renvoie un morceau rectangulaire de l'image ``src``
    depuis le point supérieur gauche de coordonnées (xA,yA)
    au point inférieur droit de coordonnées (xB,yB).
    """
    pce = PhotoImage ()
    pce.tk.call (pce, 'copy', src,
                 '-from', xA, yA, xB, yB, '-to', 0, 0)
    return pce
 
def choix_image ():
    """
    permet de choisir via une boîte de dialogues un fichier contenant une image.
 
    Ce fichier doit être au format PNG ou GIF, et l'image qu'il contient doit 
    être au moins de taille 600x600.
 
    L'image choisie est découpée en morceaux.
    Les morceaux sont affichée à gauche, et l'image originale à droite.
    """
    global image, taquin
    taquin = cree_taquin (DIM_TAQUIN)
    imagename = tkfdial.askopenfilename (title = 'Choisir une image',
                                         filetypes = [('PNG','.png'),('GIF','.gif')])
    image = PhotoImage (file = imagename)
    for k in range (len(image_decoupee)):
        l = k // DIM_TAQUIN
        c = k % DIM_TAQUIN
        image_decoupee[k] = sous_image (image, c * TAILLE_PIECE, l * TAILLE_PIECE,
                                        (c+1) * TAILLE_PIECE, (l+1) * TAILLE_PIECE)
    afficher_pieces ()
    modele.create_image (0,0,anchor = NW, image = image)
 
 
def bouger_piece (event):
    """
    bouge la pièce désignée par le clic de souris (event),
    uniquement si cette pièce est voisine de la case vide.
    """
    c = event.x // (TAILLE_PIECE + 1)
    l = event.y // (TAILLE_PIECE + 1)
    # A COMPLETER
    afficher_pieces ()
 
 
def main ():
    global fenetre, case_vide, puzzle, modele
 
 
    # La fenêtre principale
    fenetre = Tk ()
    fenetre.title ('Jeu du taquin')
    fenetre.geometry (GEOMETRIE)
    fenetre.resizable (width=False, height= False)
 
    # L'image représentant la case vide
    case_vide = sous_image(PhotoImage(file='images/case_vide_bleue.gif'),
                           0, 0,
                           TAILLE_PIECE-1, TAILLE_PIECE-1)
 
    # La zone gauche contenant le puzzle
    puzzle = Canvas (fenetre, width = TAILLE_PIECE * DIM_TAQUIN + DIM_TAQUIN - 1,
                     height = TAILLE_PIECE * DIM_TAQUIN +  DIM_TAQUIN - 1,
                     background = 'blue')
    puzzle.bind ('<Button-1>',bouger_piece)
    puzzle.grid (row=0, column=0, rowspan = DIM_TAQUIN, columnspan = DIM_TAQUIN,
                 padx = 6, pady = 8)
 
    # La zone droite contenant l'image modèle à reconstituer
    modele = Canvas (fenetre, width = TAILLE_PIECE * DIM_TAQUIN,
                     height = TAILLE_PIECE * DIM_TAQUIN,
                     background = 'black')
    modele.grid (row=0, column=DIM_TAQUIN, rowspan = DIM_TAQUIN,
                 columnspan = DIM_TAQUIN, padx=6, pady=8)
 
    # La zone du bas contenant les boutons
    Bouton_choix = Button (fenetre, text ='Choix image',
                           command = choix_image)
    Bouton_choix.grid (row = DIM_TAQUIN, column = 1, padx = 5, sticky = N)
 
    Bouton_melanger = Button (fenetre, text ='Mélanger',
                              command = melanger)
    Bouton_melanger.grid(row = DIM_TAQUIN, column = 2)
 
    Bouton_quitter = Button (fenetre, text ='Quitter',
                             command = fenetre.destroy)
    Bouton_quitter.grid(row = DIM_TAQUIN, column = 3)
 
 
    fenetre.mainloop ()


Et voila le travail a réalisé :

Le fichier taquin_gr.py doit être complété par vos soins en

modifiant un peu la fonction afficher_pieces de sorte que la case vide soit représentée par un carré bleu (variable ̀̀case_vide``) ;
complétant la fonction melanger (remplacer le pass par ce qu’il faut) ;
compléter la fonction cases_voisines pour qu’elle satisfasse sa spécification ;
compléter la fonction bouger_piece.
Vous pourrez ensuite revenir sur les possibilités

d’abandonner
de compter le nombre de coups joués.