[Echecs] Empêche de mettre son roi en Echec
This commit is contained in:
parent
39ba53fcb8
commit
b11dce6472
|
@ -1,3 +1,5 @@
|
||||||
|
import copy
|
||||||
|
|
||||||
CASES_COTE = 8
|
CASES_COTE = 8
|
||||||
|
|
||||||
MVT_INCONNU = 'Cause inconnue'
|
MVT_INCONNU = 'Cause inconnue'
|
||||||
|
@ -9,6 +11,7 @@ MVT_SAUT_AMI = 'Saut ami'
|
||||||
MVT_PION_INC = 'Pion inconnu'
|
MVT_PION_INC = 'Pion inconnu'
|
||||||
MVT_N_AUTORISE = 'Non-autorisé'
|
MVT_N_AUTORISE = 'Non-autorisé'
|
||||||
MVT_OBSTRUCTION = 'Pion en chemin'
|
MVT_OBSTRUCTION = 'Pion en chemin'
|
||||||
|
MVT_ECHEC = 'Échec au roi'
|
||||||
|
|
||||||
class LogiqueEchecs:
|
class LogiqueEchecs:
|
||||||
|
|
||||||
|
@ -62,7 +65,7 @@ class LogiqueEchecs:
|
||||||
return (self.ePionNoir(pion) and self.joueur == False) or \
|
return (self.ePionNoir(pion) and self.joueur == False) or \
|
||||||
(self.ePionBlanc(pion) and self.joueur == True)
|
(self.ePionBlanc(pion) and self.joueur == True)
|
||||||
|
|
||||||
def mvtPossiblePion(self, x1, y1, x2, y2):
|
def mvtPossibleSansEchecPion(self, x1, y1, x2, y2):
|
||||||
if x1 == x2 and self.grille[x2][y2] <= 0: # Avance
|
if x1 == x2 and self.grille[x2][y2] <= 0: # Avance
|
||||||
if self.joueur:
|
if self.joueur:
|
||||||
if y2 == y1 - 1:
|
if y2 == y1 - 1:
|
||||||
|
@ -94,7 +97,7 @@ class LogiqueEchecs:
|
||||||
else:
|
else:
|
||||||
return MVT_N_AUTORISE
|
return MVT_N_AUTORISE
|
||||||
|
|
||||||
def mvtPossibleTour(self, x1, y1, x2, y2):
|
def mvtPossibleSansEchecTour(self, x1, y1, x2, y2):
|
||||||
if y1 == y2:
|
if y1 == y2:
|
||||||
sens = (x2-x1)//abs(x2-x1)
|
sens = (x2-x1)//abs(x2-x1)
|
||||||
for x in range(x1+sens, x2, sens):
|
for x in range(x1+sens, x2, sens):
|
||||||
|
@ -109,7 +112,7 @@ class LogiqueEchecs:
|
||||||
return MVT_N_AUTORISE
|
return MVT_N_AUTORISE
|
||||||
return MVT_OK
|
return MVT_OK
|
||||||
|
|
||||||
def mvtPossibleFou(self, x1, y1, x2, y2):
|
def mvtPossibleSansEchecFou(self, x1, y1, x2, y2):
|
||||||
if abs(x2-x1) == abs(y2-y1):
|
if abs(x2-x1) == abs(y2-y1):
|
||||||
sensX = (x2-x1)//abs(x2-x1)
|
sensX = (x2-x1)//abs(x2-x1)
|
||||||
sensY = (y2-y1)//abs(y2-y1)
|
sensY = (y2-y1)//abs(y2-y1)
|
||||||
|
@ -130,29 +133,29 @@ class LogiqueEchecs:
|
||||||
else:
|
else:
|
||||||
return MVT_N_AUTORISE
|
return MVT_N_AUTORISE
|
||||||
|
|
||||||
def mvtPossibleCavalier(self, x1, y1, x2, y2):
|
def mvtPossibleSansEchecCavalier(self, x1, y1, x2, y2):
|
||||||
if (abs(x2-x1) == 2 and abs(y2-y1) == 1) or (abs(y2-y1) == 2 and abs(x2-x1) == 1):
|
if (abs(x2-x1) == 2 and abs(y2-y1) == 1) or (abs(y2-y1) == 2 and abs(x2-x1) == 1):
|
||||||
return MVT_OK
|
return MVT_OK
|
||||||
else:
|
else:
|
||||||
return MVT_N_AUTORISE
|
return MVT_N_AUTORISE
|
||||||
|
|
||||||
def mvtPossible(self, x1, y1, x2, y2):
|
def mvtPossibleSansEchec(self, x1, y1, x2, y2):
|
||||||
pion = self.grille[x1][y1]
|
pion = self.grille[x1][y1]
|
||||||
if self.aSonTour(pion):
|
if self.aSonTour(pion):
|
||||||
if (x1 != x2 or y1 != y2):
|
if (x1 != x2 or y1 != y2):
|
||||||
if not self.aSonTour(self.grille[x2][y2]):
|
if not self.aSonTour(self.grille[x2][y2]):
|
||||||
tPion = pion % 10
|
tPion = pion % 10
|
||||||
if tPion == 1: # Pion
|
if tPion == 1: # Pion
|
||||||
return self.mvtPossiblePion(x1, y1, x2, y2)
|
return self.mvtPossibleSansEchecPion(x1, y1, x2, y2)
|
||||||
elif tPion == 2: # Tour
|
elif tPion == 2: # Tour
|
||||||
return self.mvtPossibleTour(x1, y1, x2, y2)
|
return self.mvtPossibleSansEchecTour(x1, y1, x2, y2)
|
||||||
elif tPion == 3: # Cavalier
|
elif tPion == 3: # Cavalier
|
||||||
return self.mvtPossibleCavalier(x1, y1, x2, y2)
|
return self.mvtPossibleSansEchecCavalier(x1, y1, x2, y2)
|
||||||
elif tPion == 4: # Fou
|
elif tPion == 4: # Fou
|
||||||
return self.mvtPossibleFou(x1, y1, x2, y2)
|
return self.mvtPossibleSansEchecFou(x1, y1, x2, y2)
|
||||||
elif tPion == 5: # Dame
|
elif tPion == 5: # Dame
|
||||||
tour = self.mvtPossibleTour(x1, y1, x2, y2)
|
tour = self.mvtPossibleSansEchecTour(x1, y1, x2, y2)
|
||||||
fou = self.mvtPossibleFou(x1, y1, x2, y2)
|
fou = self.mvtPossibleSansEchecFou(x1, y1, x2, y2)
|
||||||
if tour == MVT_OK or fou == MVT_OK:
|
if tour == MVT_OK or fou == MVT_OK:
|
||||||
return MVT_OK
|
return MVT_OK
|
||||||
elif tour == MVT_OBSTRUCTION or fou == MVT_OBSTRUCTION:
|
elif tour == MVT_OBSTRUCTION or fou == MVT_OBSTRUCTION:
|
||||||
|
@ -174,6 +177,37 @@ class LogiqueEchecs:
|
||||||
return MVT_SELECTION
|
return MVT_SELECTION
|
||||||
return MVT_INCONNU
|
return MVT_INCONNU
|
||||||
|
|
||||||
|
def mvtPossible(self, x1, y1, x2, y2):
|
||||||
|
test = self.mvtPossibleSansEchec(x1, y1, x2, y2)
|
||||||
|
if test == MVT_OK:
|
||||||
|
# On copie la partie actuelle pour tester le mouvement et vérifier l'échec
|
||||||
|
copie = copy.deepcopy(self);
|
||||||
|
copie.dPionSansEchec(x1, y1, x2, y2)
|
||||||
|
mvtsPossiblesTousAdverses = []
|
||||||
|
pionRoi = 6
|
||||||
|
if not self.joueur:
|
||||||
|
pionRoi += 10
|
||||||
|
roi = [-1, -1]
|
||||||
|
for x in range(0, CASES_COTE):
|
||||||
|
for y in range(0, CASES_COTE):
|
||||||
|
mvtsPossiblesTousAdverses += copie.mvtsPossiblesSansEchec(x, y)
|
||||||
|
if copie.grille[x][y] == pionRoi:
|
||||||
|
roi = [x, y]
|
||||||
|
if roi in mvtsPossiblesTousAdverses:
|
||||||
|
return MVT_ECHEC
|
||||||
|
else:
|
||||||
|
return test
|
||||||
|
else:
|
||||||
|
return test
|
||||||
|
|
||||||
|
def mvtsPossiblesSansEchec(self, x1, y1):
|
||||||
|
tableau = []
|
||||||
|
for x2 in range(0, CASES_COTE):
|
||||||
|
for y2 in range(0, CASES_COTE):
|
||||||
|
if self.mvtPossibleSansEchec(x1, y1, x2, y2) == MVT_OK:
|
||||||
|
tableau.append([x2, y2])
|
||||||
|
return tableau
|
||||||
|
|
||||||
def mvtsPossibles(self, x1, y1):
|
def mvtsPossibles(self, x1, y1):
|
||||||
tableau = []
|
tableau = []
|
||||||
for x2 in range(0, CASES_COTE):
|
for x2 in range(0, CASES_COTE):
|
||||||
|
@ -182,6 +216,12 @@ class LogiqueEchecs:
|
||||||
tableau.append([x2, y2])
|
tableau.append([x2, y2])
|
||||||
return tableau
|
return tableau
|
||||||
|
|
||||||
|
def dPionSansEchec(self, x1, y1, x2, y2):
|
||||||
|
test = self.mvtPossibleSansEchec(x1, y1, x2, y2)
|
||||||
|
if test == MVT_OK:
|
||||||
|
self.grille[x1][y1], self.grille[x2][y2] = 0, self.grille[x1][y1]
|
||||||
|
self.joueur = not self.joueur
|
||||||
|
|
||||||
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 = {
|
||||||
|
@ -460,8 +500,8 @@ class PlateauTk:
|
||||||
self.coulDamier() # Effacement des surbrillances
|
self.coulDamier() # Effacement des surbrillances
|
||||||
if self.logique.aSonTour(self.logique.grille[self.dx1][self.dy1]): # Si possible jouer
|
if self.logique.aSonTour(self.logique.grille[self.dx1][self.dy1]): # Si possible jouer
|
||||||
self.coulCase(self.dx1, self.dy1, 1)
|
self.coulCase(self.dx1, self.dy1, 1)
|
||||||
self.mvtPossibles = self.logique.mvtsPossibles(self.dx1, self.dy1) # Surbrillance bleue
|
self.mvtPossibleSansEchecs = self.logique.mvtsPossibles(self.dx1, self.dy1) # Surbrillance bleue
|
||||||
for i in self.mvtPossibles: # Surbrillances vertes
|
for i in self.mvtPossibleSansEchecs: # Surbrillances vertes
|
||||||
self.coulCase(i[0], i[1], 2)
|
self.coulCase(i[0], i[1], 2)
|
||||||
self.statut('Poser')
|
self.statut('Poser')
|
||||||
self.dEtape = not self.dEtape
|
self.dEtape = not self.dEtape
|
||||||
|
|
Reference in a new issue