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
| from tkinter import *
class Application(object) : # cree la fenêtre et les graphismes
def __init__(self) : # initialise le jeu
self.root = Tk() # ouvre une fenetre
self.root.title("Jeu du Morpion") # titre de la fenetre
self.tour = 1
self.can = Canvas(self.root, width=300, height=300, bg="ivory") # cree un canvas blanc ( espace graphique )
self.can.pack()
self.can.bind("<Button-1>", self.oriente) # definit l'action du fait d'utiliser le click gauche de la souris dans le canvas
self.grille = Grille(self.can) # cree une grille 3X3 occupant tout l'espace du canvas ( voir fonction grille )
self.root.mainloop()
def oriente(self, event) : # fonction qui permet l'alternation des joueurs et la determination du vainqueur
if self.tour == 1 : # alternation des joueurs
self.tour = 2
elif self.tour == 2 :
self.tour = 1
self.x, self.y = event.x, event.y
if not self.grille.coord_to_case(self.x//100, self.y//100): # si case vide
if self.tour == 1 : # joueur 1 (croix)
self.grille.croix((self.x//100)*100, (self.y//100)*100)
self.grille.grille_num[self.grille.index] = 1
else : # joueur 2 (rond)
self.grille.rond((self.x//100)*100, (self.y//100)*100)
self.grille.grille_num[self.grille.index] = 2
gagnant = self.grille.verif() # determine le gagnant ( 3 croix/ronds alignes )
if gagnant : # si il y a un gagnant
print("joueur", gagnant, "a gagne")
class Grille(object) :
"Gere la grille"
def __init__(self, can) : # initialise la grille en memoire et la trace dans le canvas
self.grille_num = [0, 0, 0,
0, 0, 0,
0, 0, 0]
self.can = can
self.can.create_line(100,0,100,300) # cree la premiere ligne verticale
self.can.create_line(200,0,200,300) # cree la deuxieme ligne verticale
self.can.create_line(0,100,300,100) # cree la premiere ligne horizontale
self.can.create_line(0,200,300,200) # cree la deuxieme ligne horizontale
def recommencer(self): # fonction qui permet de reinitialiser le jeu
self.can.delete(ALL) # supprime l'integralite du contenu present dans le canvas
self.Application() # retour a l'initialisation du jeu ( voir class application )
def croix(self, x, y) : # fonction qui permet de tracer une croix dans le canvas
self.can.create_line(x+20, y+20, x+80, y+80, fill="blue", width=5) # cree deux lignes en diagonales formant une croix de couleur bleu
self.can.create_line(x+80, y+20, x+20, y+80, fill="blue", width=5)
def rond(self, x, y) : # fonction qui permet de tracer un rond dans le canvas
self.can.create_oval(x+20, y+20, x+80, y+80, outline="red", width=5) # cree un rond de couleur rouge
def coord_to_case(self, x, y) : # converti des coordonnées ( de position ) en numero de case
# [0, 1, 2]
# [3, 4, 5]
# [6, 7, 8]
if x == 0 :
if y == 0 : # case 0
self.index = 0
return self.grille_num[self.index]
if y == 1 : # case 3
self.index = 3
return self.grille_num[self.index]
if y == 2 : # case 6
self.index = 6
return self.grille_num[self.index]
elif x == 1 :
if y == 0 : # case 1
self.index = 1
return self.grille_num[self.index]
if y == 1 : # case 4
self.index = 4
return self.grille_num[self.index]
if y == 2 : # case 7
self.index = 7
return self.grille_num[self.index]
elif x == 2 :
if y == 0 : # case 2
self.index = 2
return self.grille_num[self.index]
if y == 1 : # case 5
self.index = 5
return self.grille_num[self.index]
if y == 2 : # case 8
self.index = 8
return self.grille_num[self.index]
def verif(self) :
i = 0
while i <= 6 : # verif horizontale
print(self.grille_num,i)
if self.grille_num[i] == self.grille_num[i+1] and\
self.grille_num[i+1] == self.grille_num[i+2] :
return self.grille_num[i] # renvoie le num du gagnant
i = i + 3
i = 0
while i < 3 : # verif verticale
if self.grille_num[i] == self.grille_num[i+3] and \
self.grille_num[i+3] == self.grille_num[i+6] :
return self.grille_num[i] # renvoie le num gagnant
i += 1
# verif diagonale :
if self.grille_num[0] == self.grille_num[4] and \
self.grille_num[4] == self.grille_num[8] :
return self.grille_num[0]
elif self.grille_num[2] == self.grille_num[4] and \
self.grille_num[4] == self.grille_num[6] :
return self.grille_num[2]
return False # pas trouve de gagnant
jeu = Application() |
Partager