[Echecs] Ajout vérification Echec et Mat

This commit is contained in:
Geoffrey Frogeye 2014-12-07 14:21:13 +01:00
parent b11dce6472
commit 6cdd795602

View file

@ -20,6 +20,9 @@ class LogiqueEchecs:
self.cGrille() self.cGrille()
self.remplirGrille() self.remplirGrille()
self.joueur = True self.joueur = True
self.partieFinie = False
self.victorieux = None
self.nvPartie() self.nvPartie()
@staticmethod @staticmethod
@ -34,12 +37,14 @@ class LogiqueEchecs:
self.grille.append(colonne) self.grille.append(colonne)
def remplirGrille(self): def remplirGrille(self):
speciales = [2, 3, 4, 6, 5, 4, 3, 2] # speciales = [2, 3, 4, 6, 5, 4, 3, 2]
for i in range(0, 8): # for i in range(0, 8):
self.grille[i][0] = speciales[i] + 10 # self.grille[i][0] = speciales[i] + 10
self.grille[i][1] = 11 # self.grille[i][1] = 11
self.grille[i][6] = 1 # self.grille[i][6] = 1
self.grille[i][7] = speciales[i] # self.grille[i][7] = speciales[i]
self.grille = [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 4, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 6], [0, 0, 0, 3, 0, 0, 0, 0], [16, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
self.joueur = False
def nvPartie(self): def nvPartie(self):
self.cGrille() self.cGrille()
@ -222,6 +227,20 @@ class LogiqueEchecs:
self.grille[x1][y1], self.grille[x2][y2] = 0, self.grille[x1][y1] self.grille[x1][y1], self.grille[x2][y2] = 0, self.grille[x1][y1]
self.joueur = not self.joueur self.joueur = not self.joueur
def vEchecMat(self):
"""
Vérifie si le joueur actuel est en échec et mat et prend les mesures nécessiares.
(CÀD Le joueur actuel ne peut effectuer aucun mouvement)
"""
for x in range(0, CASES_COTE):
for y in range(0, CASES_COTE):
if len(self.mvtsPossibles(x, y)) > 0:
print(x, y, self.mvtsPossibles(x, y))
return False
self.partieFinie = True
self.victorieux = not self.joueur
return True
def dPion(self, x1, y1, x2, y2): def dPion(self, x1, y1, x2, y2):
test = self.mvtPossible(x1, y1, x2, y2) test = self.mvtPossible(x1, y1, x2, y2)
retour = { retour = {
@ -229,6 +248,7 @@ class LogiqueEchecs:
'message': test, 'message': test,
'deplacer': [], # Pions à déplacer 'deplacer': [], # Pions à déplacer
'supprimer': [], # Pions à supprimer 'supprimer': [], # Pions à supprimer
'echecMat': False
} }
if test == MVT_OK: if test == MVT_OK:
retour['valide'] = True retour['valide'] = True
@ -237,6 +257,7 @@ class LogiqueEchecs:
retour['deplacer'].append([x1, y1, x2, y2]) retour['deplacer'].append([x1, y1, x2, y2])
self.grille[x1][y1], self.grille[x2][y2] = 0, self.grille[x1][y1] self.grille[x1][y1], self.grille[x2][y2] = 0, self.grille[x1][y1]
self.joueur = not self.joueur self.joueur = not self.joueur
self.vEchecMat()
return retour return retour
# GUI # GUI
@ -387,12 +408,18 @@ class PlateauTk:
self.cPion(x, y, j_grilleF[x][y]) self.cPion(x, y, j_grilleF[x][y])
# Interaction # Interaction
def statutPrendre(self): @staticmethod
if self.logique.joueur: def nomJoueur(joueur, pluriel=True):
joueur = 'blancs' if joueur:
nom = 'blanc'
else: else:
joueur = 'noirs' nom = 'noir'
self.statut('Prendre (' + joueur + ')') if pluriel:
nom += 's'
return nom
def statutPrendre(self):
self.statut('Prendre (' + self.nomJoueur(self.logique.joueur) + ')')
@staticmethod @staticmethod
def animationDCoords(i): def animationDCoords(i):
@ -477,6 +504,9 @@ class PlateauTk:
} }
self.animer(animation) self.animer(animation)
def victoire(self):
self.statut('Victoire des ' + self.nomJoueur(self.logique.victorieux) + ' !')
self.coulDamier()
def dPion(self, x1, y1, x2, y2): def dPion(self, x1, y1, x2, y2):
test = self.logique.dPion(x1, y1, x2, y2) test = self.logique.dPion(x1, y1, x2, y2)
@ -489,12 +519,15 @@ class PlateauTk:
self.animerD((d[0] + .5) * COTE_CASE, (d[1] + .5) * COTE_CASE, \ self.animerD((d[0] + .5) * COTE_CASE, (d[1] + .5) * COTE_CASE, \
(d[2] + .5) * COTE_CASE, (d[3] + .5) * COTE_CASE, \ (d[2] + .5) * COTE_CASE, (d[3] + .5) * COTE_CASE, \
self.grillePions[d[2]][d[3]]) self.grillePions[d[2]][d[3]])
if test['echecMat']:
print('Win!')
else: else:
self.statut('Déplacment impossible ! (' + test['message'] + ')') self.statut('Déplacment impossible ! (' + test['message'] + ')')
return test['valide'] return test['valide']
def dClic(self, x, y): def dClic(self, x, y):
# if not len(self.animations): if not self.logique.partieFinie:
if self.dEtape: # Prendre if self.dEtape: # Prendre
self.dx1, self.dy1 = x, y self.dx1, self.dy1 = x, y
self.coulDamier() # Effacement des surbrillances self.coulDamier() # Effacement des surbrillances
@ -508,12 +541,14 @@ class PlateauTk:
else: # Si pas pssible jouer else: # Si pas pssible jouer
self.coulCase(self.dx1, self.dy1, 3) self.coulCase(self.dx1, self.dy1, 3)
self.animerC(self.dx1, self.dy1) self.animerC(self.dx1, self.dy1)
else: # Poser else: # Poser
self.dx2, self.dy2 = x, y self.dx2, self.dy2 = x, y
if self.dPion(self.dx1, self.dy1, self.dx2, self.dy2) or (self.dx1 == self.dx2 and self.dy1 == self.dy2): # Si déplacement fait / Annule dépalcement if self.dPion(self.dx1, self.dy1, self.dx2, self.dy2) or (self.dx1 == self.dx2 and self.dy1 == self.dy2): # Si déplacement fait / Annule dépalcement
self.coulDamier() # Effacer Surbrillance self.coulDamier() # Effacer Surbrillance
self.dEtape = not self.dEtape self.dEtape = not self.dEtape
if self.logique.partieFinie:
self.victoire()
else:
self.statutPrendre() self.statutPrendre()
else: # Si mauvais déplacement else: # Si mauvais déplacement
self.coulCase(self.dx2, self.dy2, 3) self.coulCase(self.dx2, self.dy2, 3)