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 192 193 194 195
|
from tkinter import *
from random import randint, shuffle
from timeit import default_timer
# ----- variables globales ---------------------------------------------------
images = [] # contient les liens aux fichiers images
cartes = [] # contient le lien vers l'image des différentes cartes
cartes_jouees = [] # contient les cartes jouées
nb_lignes, nb_colonnes = 5, 4
joueur_actuel = 0
score = [0,0]
fini = False
peut_jouer = True
# ----- Images ----------------------------------------------------------------
def charger_images():
del images[:] # vide la liste
nb_images = 21 # l'image no 0 est le dos des cartes
choixCartes = []
choixCartes.append(0)#ajouter un element a la fin de la liste
i=0
while i < nb_images-1: # tirage au sort des cartes à utiliser
x = randint(1, nb_images-1) #randomint pour le tirage aleatoire
if x not in choixCartes:
choixCartes.append(x)
i += 1
for i in range(nb_images): # importation des images
nom = 'carte-' + str(choixCartes[i]) + '.gif'
image = PhotoImage(file = nom)
images.append(image)
# ----- Melange des cartes -----------------------------------------------------
def melanger_cartes():
global nb_colonnes, nb_lignes, cartes
nb_cartes = nb_colonnes * nb_lignes
cartes=list(range(1,nb_cartes//2+1))*2
shuffle(cartes) #melange dans cartes
# ----- Retourne les deux cartes à la fin de la sélection ----------------------
def gerer_tirage():
global nb_colonnes, nb_lignes, cartes_jouees
global joueur_actuel, fini, peut_jouer
if cartes[cartes_jouees[0]-1] == cartes[cartes_jouees[1]-1]:
# enlève les cartes identiques. Le joueur actuel reste le même
canvas.delete(cartes_jouees[0])
canvas.delete(cartes_jouees[1])
score[joueur_actuel] += 1
else:
# retourne les cartes différentes. Le joueur actuel change
canvas.itemconfig(cartes_jouees[0], image = images[0])
canvas.itemconfig(cartes_jouees[1], image = images[0])
cartes_jouees = []
text1 = 'Joueur 1 : ' + str(score[0]*2)
points_joueur1.config(text = text1)
peut_jouer = True # réactive l'effet du clic de la souris
if joueur_actuel == 0: # celui qui joue est en orange
points_joueur1.config(bg = 'orange')
else:
points_joueur1.config(bg = 'white')
if score[0] + score[1] == (nb_colonnes*nb_lignes)//2:
fini=True # afficher le résultat de la partie
if score[0] > score[1]:
texte = "Facile non ?"
canvas.create_rectangle(0,0,(110*nb_colonnes)+20,(110*nb_lignes)+20,
fill='white')
canvas.create_text((55*nb_colonnes)+10,(55*nb_lignes)+10,
text=texte,font='Calibri 24',fill='black')
# ----- Retourne la carte sélectionnée -----------------------------------------
def cliquer_carte(event):
global fini, plateau, cartes_jouees, peut_jouer
if len(cartes_jouees) < 2:
carteSel = canvas.find_closest(event.x, event.y)
carteID = carteSel[0]
if fini:
fini = False
reinit()
else:
canvas.itemconfig(carteID, image = images[cartes[carteID-1]]) # montre la carte
if len(cartes_jouees) == 0:
cartes_jouees.append(carteID) # enregistre la carte jouée
elif carteID != cartes_jouees[0]: # ne pas cliquer 2x sur la même carte !
cartes_jouees.append(carteID)
if peut_jouer and len(cartes_jouees) == 2:
peut_jouer = False # désactive l'effet du clic de la souris
plateau.after(1500,gerer_tirage) # patiente 1,5 secondes avant de continuer
# ----- Change la taille du plateau de jeu -------------------------------------
def jeu5x4():
global nb_colonnes
nb_colonnes = 4
reinit()
def jeu5x6():
global nb_colonnes
nb_colonnes = 6
reinit()
def jeu5x8():
global nb_colonnes
nb_colonnes = 8
reinit()
# ----- création des menus et sous-menus ------------------------------------------
def creer_menus(fen):
top = Menu(fen)
fen.config(menu=top)
jeu = Menu(top, tearoff=False)
top.add_cascade(label='Jeu', menu=jeu)
jeu.add_command(label='Nouvelle partie', command=reinit)
submenu=Menu(jeu, tearoff=False)
jeu.add_cascade(label='Dimensions', menu=submenu)
submenu.add_command(label='5 x 4', command=jeu5x4)
submenu.add_command(label='5 x 6', command=jeu5x6)
submenu.add_command(label='5 x 8', command=jeu5x8)
jeu.add_command(label='Quitter', command=fen.destroy)
# ----- Création du canvas --------------------------------------------------------
def creer_canevas(fen, col, lig):
return Canvas(fen, width=(110*col)+10, height=(110*lig)+10, bg='white')
# ----- Modifier le canvas --------------------------------------------------------
# Redémarre une partie et change éventuellement la difficulté
def reinit():
global canvas, joueur_actuel, score, nb_lignes, nb_colonnes
joueur_actuel = 0
score =[0,0]
del cartes[:]
del cartes_jouees[:]
canvas.destroy()
canvas = creer_canevas(plateau, nb_colonnes, nb_lignes)
canvas.pack(side = TOP, padx = 5, pady = 5)
canvas.bind("<Button-1>", cliquer_carte) # permet le clic sur les cartes
melanger_cartes()
for i in range(nb_colonnes): # dessin des cartes retournées
for j in range(nb_lignes):
canvas.create_image((110*i)+60, (110*j)+60, image=images[0])
text1 = 'Joueur 1 : ' + str(score[0]*2)
points_joueur1.config(text = text1, bg = 'orange')
# ----- Programme principal ----------------------------------------------------
fenetre = Tk()
fenetre.title("Memory")
creer_menus(fenetre)
# création du canvas dont la taille dépend du nombre de cartes
plateau = Frame(fenetre)
plateau.pack()
canvas=creer_canevas(plateau, nb_colonnes, nb_lignes)
canvas.pack(side = TOP, padx = 2, pady = 2)
points_joueur1 = Label(fenetre, text = "Joueur 1 : 0",
bg="orange", font="Helvetica 16")
points_joueur1.pack(pady = 2, side = LEFT)
charger_images()
melanger_cartes()
for i in range(nb_colonnes): # dessin des cartes retournées
for j in range(nb_lignes):
canvas.create_image((110*i)+60, (110*j)+60, image = images[0])
canvas.bind("<Button-1>", cliquer_carte) # permet le clic sur les cartes
def updateTime():
now = default_timer() - start
minutes, seconds = divmod(now, 60)
hours, minutes = divmod(minutes, 60)
str_time = "%d:%02d:%02d" % (hours, minutes, seconds)
canvas.itemconfigure(text_clock, text=str_time)
fenetre.after(1000, updateTime)
start = default_timer()
text_clock = canvas.create_text(60,60)
updateTime()
fenetre.mainloop() |
Partager