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 () |
Partager