Guest User

Untitled

a guest
Dec 14th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.60 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from Tkinter import *
  5. from tkMessageBox import *
  6. from tkSimpleDialog import *
  7.  
  8.  
  9.  
  10. def damier(): #fonction qui affiche un damier
  11. for x in range(10):
  12. for y in range(10):
  13. if (x+y) % 2 == 0:
  14. can.create_rectangle(x * case, y * case, (x + 1) * case, (y + 1) * case, fill="black") #on dessine des carrés noirs sur le fond rouge
  15.  
  16. def start_game():
  17. global started, liste_des_joueurs
  18.  
  19. #on demande le nom des joueurs
  20. nom_j1 = askstring("Nouvelle Partie...", "Joueur 1:")
  21. nom_j2 = askstring("Nouvelle Partie...", "Joueur 2:")
  22. nom_j1 += ' (rouge)' #on ajoute des suffixes pour être sur que les joueurs connaissent leur couleur
  23. nom_j2 += ' (jaune)'
  24.  
  25. damier() #on affiche le damier
  26. initialisation_pion() #on reinitialise la position de tous les points
  27. joueur_qui_joue = 1 # On definit que c'est au tour du joueur 1
  28. showinfo('Tour', 'C\'est le tour de ' + nom_j1) # On affiche que c'est au joueur 1 de jouert
  29. liste_des_joueurs = [0, nom_j1, nom_j2] #On crée une liste avec les noms des joueurs de facon à pouvoir y accéder facilement
  30. started = True #On dit que la partie commence
  31.  
  32. def dessiner_cercle(x_milieu, y_milieu, rayon, couleur): #Fonction qui déssine un cercle en fonction de l'origine, du rayon et de la couleur
  33. can.create_oval(x_milieu - rayon, y_milieu - rayon, x_milieu + rayon, y_milieu + rayon, fill=couleur)
  34.  
  35. def placePions(Pions): #fonction qui recupère la liste bi-dimentionnelle et qui affiche tous les pions
  36. for x in range(len(Pions)): #len(Pions) = 10
  37. for y in range(len(Pions[0])): #len(Pions[0]) = 10
  38. if Pions[x][y] != 0: #Si la case n'est pas vide
  39.  
  40. #on definit l'origine du cercle
  41. x_milieu = x * case + case / 2
  42. y_milieu = y * case + case / 2
  43.  
  44. if Pions[x][y] == 1: #si le pion appartient au joueur 1
  45. dessiner_cercle(x_milieu, y_milieu, 15, 'red') #on dessine un cercle rouge
  46. if Pions[x][y] == 2: #si le pion appartient au joueur 2
  47. dessiner_cercle(x_milieu, y_milieu, 15, 'yellow') #on dessine un cercle jaune
  48. if Pions[x][y] == 10: #si c'est une dame qui appartient au joueur 1
  49. #on dessine un cercle rouge avec un anneau noir à l'interieur
  50. dessiner_cercle(x_milieu, y_milieu, 15, 'red')
  51. dessiner_cercle(x_milieu, y_milieu, 10, 'black')
  52. dessiner_cercle(x_milieu, y_milieu, 9, 'red')
  53. if Pions[x][y] == 20: #si c'est une dame qui appartient au joueur 2
  54. #on dessine un cercle jaune avec un anneau noir à l'interieur
  55. dessiner_cercle(x_milieu, y_milieu, 15, 'yellow')
  56. dessiner_cercle(x_milieu, y_milieu, 10, 'black')
  57. dessiner_cercle(x_milieu, y_milieu, 9, 'yellow')
  58.  
  59. def initialisation_pion(): #fonction qui reinitialise la position des pions
  60. global position_pion #la liste position_pion contient pour chaque case du damier une information : 0 pour une case vide, 1/2 pour un pion du joueur 1/2 ou 10/20 pour une dame du joueur 1/2
  61.  
  62. #on reinitialise la position des pions sur le damier
  63. position_pion =\
  64. [[1, 0, 1, 0, 0, 0, 2, 0, 2, 0],
  65. [0, 1, 0, 1, 0, 0, 0, 2, 0, 2],
  66. [1, 0, 1, 0, 0, 0, 2, 0, 2, 0],
  67. [0, 1, 0, 1, 0, 0, 0, 2, 0, 2],
  68. [1, 0, 1, 0, 0, 0, 2, 0, 2, 0],
  69. [0, 1, 0, 1, 0, 0, 0, 2, 0, 2],
  70. [1, 0, 1, 0, 0, 0, 2, 0, 2, 0],
  71. [0, 1, 0, 1, 0, 0, 0, 2, 0, 2],
  72. [1, 0, 1, 0, 0, 0, 2, 0, 2, 0],
  73. [0, 1, 0, 1, 0, 0, 0, 2, 0, 2]]
  74.  
  75. placePions(position_pion) #On affiche les pions
  76.  
  77. def test_victoire(): # fonction qui verifie si un des joueurs a gagné
  78. #on cree 2 listes "temporaires"
  79. liste_test_j1 = []
  80. liste_test_j2 = []
  81.  
  82. for x in range(10): # On test pour chaque colone
  83. if 1 in position_pion[x] or 10 in position_pion[x]: # Si aucun pion n'est dans la colonne, on ajoute un False
  84. liste_test_j1.append(False)
  85.  
  86. elif 2 in position_pion[x] or 20 in position_pion[x]: #Si aucun pion n'est dans la colonne, on ajoute un False
  87. liste_test_j2.append(False)
  88.  
  89. if True not in liste_test_j1: # Si dans liste_test_j1, il y a que des True, alors aucun pion du joueur 1 n'est sur le damier
  90. return False # Ainsi, on arrete de jouer
  91. elif True not in liste_test_j2: #Si dans liste_test_j2, il y a que des True, alors aucun pion du joueur 2 n'est sur le damier
  92. return False # Ainsi, on arrete de jouer
  93. else:
  94. return True #Ainsi, on continue à jouer
  95.  
  96. def select(clic): # Fonction qui traite les clics de la souris sur le damier
  97. global selected, ligne, colonne #on rends les variables selected, ligne et colonne globales de facon à éviter les erreurs "NameError: name 'variable' is not defined"
  98.  
  99. if started == False: #on verifie que l'on a bien commencé une partie (et donc que les pionts sont bien mis en place)
  100. showinfo('Erreur', 'Veuillez commencez une partie en cliquant sur le bouton en bas à droite')
  101. return None # on quitte la fonction select
  102.  
  103. if selected == False: # selected est une variable booléenne qui permet de savoir si le pion(ou la dame) que l'on veut deplacer a été selectionné
  104. if est_dans_le_damier(clic): # On verifie que le clic se trouve sur le damier
  105. ligne = clic.x // case # On calcule la partie entiere dans la division de clic.x par case, cela nous permet de transformer les coordonnés du clic (en pixel) en indice pour la liste position_pion
  106. colonne = clic.y // case # On calcule la partie entiere dans la division de clic.y par case
  107. if position_pion[ligne][colonne] == 0: # Si la case est vide, alors aucun pion n'est selectionne et on s'arrete
  108. return None # on quitte la fonction select
  109. elif position_pion[ligne][colonne] != joueur_qui_joue and position_pion[ligne][colonne] != joueur_qui_joue *10: # Si la case n'est pas vide et qu'il y a un pion qui n'appartient pas au joueur qui joue, alors le pion n'appartient pas au joueur qui joue
  110. showinfo('Erreur', 'Ce n\'est pas votre pion')
  111. return None # on quitte la fonction select
  112. selected = True #Sinon, le piont position_pion[ligne][colonne] a été selectionné
  113.  
  114. else: #On attend qu'une case soit selectionnee:
  115. if est_dans_le_damier(clic): # On verifie que le second clic se trouve sur le damier
  116. ligne_arrivee = clic.x // case # On calcule la partie entiere dans la division de clic.x par case, cela nous permet de transformer les coordonnés du clic (en pixel) en indice pour la liste position_pion
  117. colonne_arrivee = clic.y // case # On calcule la partie entiere dans la division de clic.y par case
  118. if ligne_arrivee == ligne and colonne_arrivee == colonne: # Si on reclic le pion sélectionné, alors
  119. selected = False #on deselectionne le pion
  120. return None # on quitte la fonction select
  121.  
  122. nature_deplacement = verification_deplacement(ligne, colonne, ligne_arrivee, colonne_arrivee) #on verifie le type de deplacement en utilisant la fonction verification_deplacement puis on stocke le resultat dans une variable (pour ne pas avoir à reappeler la fonction)
  123. if nature_deplacement == 'Deplacement invalide': # Si le deplacement a été qualifié d'invalide
  124. showinfo("Erreur", "Déplacement invalide") # On affiche une fenetre qui informe le joueur
  125. selected = False # On deselectionne le pion
  126. return None # on quitte la fonction select
  127.  
  128. elif nature_deplacement == 'Deplacement valide': # Si le deplacement a été qualifié de valide (pion qui se déplace)
  129. position_pion[ligne][colonne] = 0 #On enlève le pion au point de départ
  130. if detection_transformation(joueur_qui_joue, colonne_arrivee): # on vérifie que le pion ne doit pas se transformer en dame
  131. position_pion[ligne_arrivee][colonne_arrivee] = joueur_qui_joue*10 #si le pion doit se transformer en dame on fait *10 pour obtenir 10 ou 20, soit les differentes "codes" pour les dames
  132. else:
  133. position_pion[ligne_arrivee][colonne_arrivee] = joueur_qui_joue #Sinon on place un pion normal à l'endroit où le pion de déplace
  134. damier() #on réaffiche le damier (par dessus)
  135. placePions(position_pion) #on réaffiche les pions (par dessus)
  136. tour_suivant() #on passe au tour suivant
  137. selected = False #on deselectionne le pion
  138. return None # on quitte la fonction select
  139.  
  140.  
  141. elif nature_deplacement == 'Un pion est mangé': #Si le deplacement constitue un pion mange un autre pion(ou dame)
  142. #On calcule les coordonnées de la dame ou du pion mangé en calculant le milieu entre le point de départ et le point d'arrivée
  143. x_dame_mangee = (ligne + ligne_arrivee) / 2
  144. y_dame_mangee = (colonne + colonne_arrivee) / 2
  145. position_pion[ligne][colonne] = 0 #On enlève la dame au point de départ
  146. position_pion[x_dame_mangee][y_dame_mangee] = 0 # On enleve la dame mangée
  147. if detection_transformation(joueur_qui_joue, colonne_arrivee): # on vérifie que le pion ne doit pas se transformer en dame
  148. position_pion[ligne_arrivee][colonne_arrivee] = joueur_qui_joue*10 #si le pion doit se transformer en dame on fait *10 pour obtenir 10 ou 20, soit les differentes "codes" pour les dames
  149. else:
  150. position_pion[ligne_arrivee][colonne_arrivee] = joueur_qui_joue #Sinon on place un pion normal à l'endroit où le pion de déplace
  151. damier( )#on réaffiche le damier (par dessus)
  152. placePions(position_pion)
  153. etat_partie = test_victoire() #on vérifie si un des joueurs a gagné et on stocke le resultat dans une variable
  154. if etat_partie: #si un joueur a gagné, alors on affiche quel joueur a gagné puis on ferme la fenetre quand on a cliqué sur OK
  155. showinfo('Victoire', liste_des_joueurs[joueur_qui_joue] + ' a gagné la partie')
  156. fen.destroy()
  157. else: # Sinon, on dis que le joueur qui joue a mangé un pion
  158. showinfo('Alerte','Un pion est mangé, le joueur : ' + liste_des_joueurs[joueur_qui_joue] + ' rejoue.')
  159. selected = False #on deselectionne le pion
  160. return None # on quitte la fonction select
  161.  
  162. elif nature_deplacement == 'Deplacement dame valide': #Si le deplacement est un deplacement de dame et qu'il est valide (auncun pion/dame mangé)
  163. position_pion[ligne][colonne] = 0 # On enlève le pion au point de départ
  164. position_pion[ligne_arrivee][colonne_arrivee] = joueur_qui_joue * 10 # On remet la dame à l'endroit d'arrivé
  165. damier() #on affiche le damier (par dessus)
  166. placePions(position_pion) #on affiche les pions (par dessus)
  167. tour_suivant() #on passe au tour suivant
  168. selected = False #on deselectionne le pion
  169. return None # on quitte la fonction select
  170.  
  171. elif 'Deplacement dame mange et valide' in nature_deplacement: #si le resultat comprend 'Deplacement dame mange et valide'
  172. nature_deplacement = nature_deplacement[36:] #on enleve "Deplacement dame mange et valide. x=' de la string retournée par la fonction verification_deplacement()
  173. coord_x_du_point_mange = int(nature_deplacement[:1]) #on prend donc le 1er caractere de la string retourné, on le passe en entier (car on l'utilise comme un indice de liste) et on le stock dans une variable
  174. nature_deplacement = nature_deplacement[5:] #on enleve "x. y=" de la string
  175. coord_y_du_point_mange = int(nature_deplacement[:1]) #on prend donc le 1er caractere de la string retourné, on le passe en entier (car on l'utilise comme un indice de liste) et on le stock dans une variable
  176. position_pion[ligne][colonne] = 0 #on enleve la dame à l'endroit avant qu'elle bouge
  177. position_pion[coord_x_du_point_mange][coord_y_du_point_mange] = 0 # on enleve le pion mangé
  178. position_pion[ligne_arrivee][colonne_arrivee] = joueur_qui_joue * 10 # on rajoute la dame après son déplacement
  179. damier() # on affiche le damier (par dessus)
  180. placePions(position_pion) # on affiche les pions (par dessus)
  181. etat_partie = test_victoire() # on vérifie si un des joueurs a gagné et on stocke le resultat dans une variable
  182. if etat_partie: # si un joueur a gagné, alors on affiche quel joueur a gagné puis on ferme la fenetre quand on a cliqué sur OK
  183. showinfo('Victoire', liste_des_joueurs[joueur_qui_joue] + ' a gagné la partie')
  184. fen.destroy()
  185. else: # Sinon, on dis que le joueur qui joue a mangé un pion
  186. showinfo('Alerte','Un pion est mangé, le joueur : ' + liste_des_joueurs[joueur_qui_joue] + ' rejoue.')
  187. selected = False # on deselectionne le pion
  188. return None # on quitte la fonction select
  189.  
  190. def detection_transformation(joueur_qui_joue, y): #fonction qui renvoit True si le pion est arrivée au bout du damier et False sinon
  191. if joueur_qui_joue == 1 and y == 9: #si le pion appartient au joueur 1 et qu'il est en bas du damier
  192. return True #on renvoit True
  193. elif joueur_qui_joue == 2 and y == 0: #si le pion appartient au joueur 2 et qu'il est en haut du damier
  194. return True #on renvoit True
  195. else: #sinon
  196. return False #on renvoit False
  197.  
  198. def tour_suivant():
  199. global joueur_qui_joue #on rends la variable joueur_qui_joue globale de facon à éviter les erreurs "NameError: name 'variable' is not defined"
  200.  
  201. if joueur_qui_joue == 1: #si le joueur 1 est entrain de jouer
  202. joueur_qui_joue = 2 # C'est au tour du joueur 2
  203. elif joueur_qui_joue == 2: #si le joueur 2 est entrain de jouer
  204. joueur_qui_joue = 1 # C'est au tour du joueur 1
  205.  
  206. showinfo('Tour', 'C\'est le tour de ' + liste_des_joueurs[joueur_qui_joue]) # On affiche un message pour dire quel joueur doit jouer
  207.  
  208. def verification_deplacement(depart_x, depart_y, arrivee_x, arrivee_y): #On verifie la validite du deplacement, quel est le type de pion qui se déplace (pion ou dame) et si un pion/dame est mangé.
  209. global un_pion_est_deja_mange_par_ce_deplacement, x_piont_mange, y_piont_mange
  210.  
  211. #1ère etape, on calcule les valeurs de déplacements sur les différentes variables
  212. deplacement_en_x = arrivee_x - depart_x
  213. deplacement_en_y = arrivee_y - depart_y
  214. deplacement_en_x = abs(deplacement_en_x) # On utilise la fonction valeur absolue pour determiner le deplacement en x
  215. deplacement_en_y = abs(deplacement_en_y) # On utilise la fonction valeur absolue pour determiner le deplacement en y
  216.  
  217. if position_pion[depart_x][depart_y] > 5: # Si le pion est une dame, alors on a soit 10>5 soit 20>5 (donc ce n'est pas un pion normal)
  218. pion_normal = False
  219. else:
  220. pion_normal = True
  221. if pion_normal == True: #Si les règles de déplacement sont celles d'un piont
  222. if deplacement_en_x == 0 or deplacement_en_y == 0: # Un pion ne peut pas rester statique et donc le deplacement n'est pas valide
  223. return 'Deplacement invalide'
  224. if deplacement_en_y > 1 or deplacement_en_x > 1: #Valable uniquement dans le cas où on "mange" une dame
  225. if deplacement_en_x != 2 or deplacement_en_y != 2: #On vérifie que le deplacement correspond bien à un cas où on mange une dame
  226. return 'Deplacement invalide'
  227.  
  228. else:
  229. joueur_qui_mange = position_pion[depart_x][depart_y] #on vérifie quel est le joueur qui mange
  230. # On calcule les coordonnées de la dame mangee en calculant le milieu entre le point de départ et le point d'arrivée
  231. x_dame_mangee = (depart_x + arrivee_x) / 2
  232. y_dame_mangee = (depart_y +
  233. arrivee_y) / 2
  234. if position_pion[x_dame_mangee][y_dame_mangee] == 0: # on vérifie que l'on ne mange pas une case vide
  235. return 'Deplacement invalide'
  236. elif position_pion[x_dame_mangee][y_dame_mangee] == joueur_qui_mange: # On vérifie que l'on ne mange pas un pion de son propre camp
  237. return 'Deplacement invalide'
  238. elif position_pion[arrivee_x][arrivee_y] != 0: #On vérifie qu'il n'y ai pas de pion à l'endroit où on veut aller (par dessus le pion qu'on mange)
  239. return 'Deplacement invalide'
  240. else: # Sinon le deplacement est valide et correspond à un pion qui mange
  241. return 'Un pion est mangé'
  242.  
  243. else: #dans le cas où on ne mange pas de dame
  244. if position_pion[arrivee_x][arrivee_y] == 0: #on verifie que la case est libre
  245. #ce bloc vérifie que si aucun pion n'est mangé, alors le déplacement en bien "vers l'avant" (en fonction du joueur)
  246. if joueur_qui_joue == 1:
  247. if arrivee_y > depart_y:
  248. return 'Deplacement valide' # On valide le déplacement
  249. else:
  250. return 'Deplacement invalide'
  251. elif joueur_qui_joue == 2:
  252. if arrivee_y < depart_y:
  253. return 'Deplacement valide'
  254. else:
  255. return 'Deplacement invalide'
  256. else:
  257. return 'Deplacement invalide'
  258.  
  259. elif pion_normal == False:
  260. if deplacement_en_x == 0 or deplacement_en_y == 0: # Un pion ne peut pas rester statique et donc le deplacement n'est pas valide
  261. print(3)
  262. return 'Deplacement invalide'
  263. if deplacement_en_x == deplacement_en_y: #on vérifie si le deplacement est bien en diagonal
  264. print(1)
  265. if position_pion[arrivee_x][arrivee_y] == 0: #on verifie que la case est libre d'arrivé est libre
  266. un_pion_est_deja_mange_par_ce_deplacement = False #on définit que pour l'instant aucun pion n'est mangé
  267. #donc les coordonnées sont nulles
  268. x_piont_mange = -1
  269. y_piont_mange = -1
  270.  
  271. while depart_x != arrivee_x and depart_y != arrivee_y: #on vérifie que chaque case entre le point de départ et le point d'arrivé ne contienent pas de pion de son camp et uniquement un seul pion adverse (à l'aide de la varible un_pion_est_deja_mange_par_ce_deplacement)
  272. #on vérifie pour chaque cas de déplacement en diagonal
  273. if depart_x > arrivee_x and depart_y > arrivee_y:
  274. depart_x -= 1
  275. depart_y -= 1
  276. verification_deplacement_dame(depart_x,depart_y)
  277. elif depart_x < arrivee_x and depart_y < arrivee_y:
  278. depart_x += 1
  279. depart_y += 1
  280. verification_deplacement_dame(depart_x, depart_y)
  281. elif depart_x > arrivee_x and depart_y < arrivee_y:
  282. depart_x -= 1
  283. depart_y += 1
  284. verification_deplacement_dame(depart_x, depart_y)
  285. elif depart_x < arrivee_x and depart_y > arrivee_y:
  286. depart_x += 1
  287. depart_y -= 1
  288. verification_deplacement_dame(depart_x, depart_y)
  289. if un_pion_est_deja_mange_par_ce_deplacement == True: #Si uniquement un pion est mangé par le deplacement,
  290. return 'Deplacement dame mange et valide. x=' + str(x_piont_mange) + '. y=' + str(y_piont_mange) #alors on renvoit 'Deplacement dame mange et valide' et les coordonnéss du pion mangé pour qu'il soit traité plus tard
  291. else:
  292. return 'Deplacement dame valide' #Si aucun pion n'est mangé, alors le déplacement est valide
  293. else:
  294. print(1)
  295. return 'Deplacement invalide'
  296. else:
  297. return 'Deplacement invalide'
  298.  
  299. def verification_deplacement_dame(depart_x, depart_y):
  300. global un_pion_est_deja_mange_par_ce_deplacement, x_piont_mange, y_piont_mange #on rends les variables un pion_est_deja_mange_par_ce_deplacement, x_piont_mange et y_piont_mange globales de facon à éviter les erreurs "NameError: name 'variable' is not defined"
  301.  
  302. if position_pion[depart_x][depart_y] != 0: # Si la case n'est pas libre
  303. if position_pion[depart_x][depart_y] == joueur_qui_joue or position_pion[depart_x][depart_y] == joueur_qui_joue * 10: #si il y a un pion ou une dame du même camp que nous sur la case que nous testons
  304. return 'Deplacement invalide'
  305. else:
  306. if un_pion_est_deja_mange_par_ce_deplacement == True: #si la case n'est pas libre et qu'un piont a déjà été mangé, alors il y a au moins deux pions sur la trajectoire
  307. return 'Deplacement invalide'
  308. else:
  309. un_pion_est_deja_mange_par_ce_deplacement = True #si c'est le premier pion qu'on mange, on stocke ses coordonnées
  310. x_piont_mange = depart_x
  311. y_piont_mange = depart_y
  312.  
  313. def est_dans_le_damier(clic):
  314. if clic.y <= 800 and clic.x <= 800: #si le clic se situe dans un carré de 800 par 800 donc une des arrêtes est le coin en haut à gauche de la fenetre
  315. return True
  316. else:
  317. return False
  318.  
  319. ###PROGRAMME PRINCPAL###
  320.  
  321. fen = Tk() # Lance la fenêtre
  322. fen.title("Jeu de Dame")
  323. fen.resizable(width=False, height=False) # On désactive les modifications de taille de la fenetre pour éviter les complications avec l'enregistrement des clics
  324.  
  325. can = Canvas(fen, width=800, height=800, bg="red") # On dimensione la fenetre par un carré de 800 pixels et on y met un fond rouge
  326. can.bind("<Button-1>", select)
  327. can.pack(side=TOP, padx=5, pady=5) # Un rebord de 5 pixels
  328.  
  329. b1 = Button(fen, text="DAMONIUM !", command=start_game) # Le bouton DAMONIUM situé en bas à droite lance la fonciton start_game
  330. b1.pack(side=RIGHT)
  331.  
  332. b2 = Button(fen, text="Quitter", command=fen.destroy)# Bouton en bas à gauche qui ferme la fenêtre
  333. b2.pack(side=LEFT)
  334.  
  335. joueur_qui_joue = 1 # C'est au joueur 1 de jouer en premier
  336. started = False # La partie n'a pas encore commencé
  337. case = 80 # On dimensione la case ici pour pouvoir l'utiliser partout
  338. selected = False # Rien n'est selectioné
  339. damier() # Affiche le damier
  340. can.bind("<Button-1>", select)
  341. fen.mainloop() # dernière instruction du programme : enclenche la réception d'événements
Add Comment
Please, Sign In to add comment