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
| from random import randint
from PIL import Image, ImageTk
from tkinter import Canvas, Tk, NW, LEFT
# Constantes
ROW = 5
COLUMN = 5
INIT = -1
def create(row, column, k):
return [[k for i in range(column)] for j in range(row)]
def add(value, nbr, case, k=-1):
counter = 0
while counter < nbr:
row, column = randint(0, 4), randint(0, 4)
if case[row][column] == k:
case[row][column] = value
counter += 1
return case
def reckon(line, val=None):
'''
Exemple d'utilisation
reckon(line, 0) -> compte le nombre de 0 dans une ligne
reckon(line) -> calcule la somme d'une ligne
'''
if val is None: # Si on ne recherche pas un nombre en particulier
counter = sum(line) # on calcule la somme des valeurs de la ligne
else:
counter = line.count(val)
return counter # Dans tous les cas on retourne la variable counter
def draw(path):
"path est l'endroit où se trouve ton dessin"
image = Image.open(path)
photo = ImageTk.PhotoImage(image)
return photo
def construct(can, size, begin, y_begin, case, picture):
'''
can -> le canvas
size -> taille du carré
begin -> valeur de x où commence la ligne
y_begin -> valeur de y où commence la ligne
case -> tableau de situation des objets
picture -> instance de PhotoImage
'''
DISTANCE = 5 # distance entre chaque carré
y = y_begin
for line in case:
y += (size + DISTANCE)
x = begin
for n in line:
canvas.create_image(x, y, image=picture)
x += (size + DISTANCE)
def construct_value(can, size, begin, y_begin, case):
DISTANCE = 5
y = y_begin
for line in case:
y += (size + DISTANCE)
x = begin
for n in line:
canvas.create_text(x, y, text=n)
x += (size + DISTANCE)
def click(event):
global score
item = canvas.find_closest(event.x, event.y) # recherche l'item en fonction des coordonnées du click
canvas.delete(item) # suppression de l'item
item = canvas.find_closest(event.x, event.y) # on récupère la valeur en dessous de la case rouge
val = int(canvas.itemcget(item, 'text')) # on la transforme en entier
score += val
canvas.itemconfig(c, text="score : {}".format(score))
def calculate(case):
"Calcul du score maxi"
score_max = 0
for line in case:
for n in line:
if n > 0:
score_max += n
return score_max
# création d'un tableau à 2 dimensions composé de -1
cases = create(ROW, COLUMN, INIT)
# Ajout du nombre 0, 1, 2, 3 (value), 3 fois (nbr), k vaut -1 par défaut
cases = add(0, 6, cases)
cases = add(1, 4, cases)
cases = add(2, 5, cases)
cases = add(3, 5, cases)
root = Tk()
score = 0
canvas = Canvas(root, width = 640, height = 480) # Création du canvas
canvas.pack()
construct_value(canvas, 50, 20, 0, cases)
carre = draw("Carre_rouge.save.jpg") # retourne l'instance photoimage
construct(canvas, 50, 20, 0, cases, carre) # construction des carrés
c = canvas.create_text(350, 20, justify=LEFT, text="score : {}".format(score))
canvas.create_text(350, 40, justify=LEFT, text="score maximum : {}".format(calculate(cases)))
canvas.bind("<Button-1>", click) # Exécution de la fonction click lors de l'appui sur le bouton gauche
root.mainloop() |
Partager