fix bug when looking the downward diagonals
This commit is contained in:
parent
252124d26f
commit
e2ce777bc3
1 changed files with 19 additions and 17 deletions
36
minimax.py
36
minimax.py
|
@ -134,12 +134,13 @@ class Morpion(Minimax):
|
||||||
if self._caseOccupee(i, j): # si case occupé par un joueur
|
if self._caseOccupee(i, j): # si case occupé par un joueur
|
||||||
rechercheLigne = 0
|
rechercheLigne = 0
|
||||||
rechercheColonne = 0
|
rechercheColonne = 0
|
||||||
|
# les diagonales vont vers la droite
|
||||||
rechercheDiagonaleVersBas = 0
|
rechercheDiagonaleVersBas = 0
|
||||||
rechercheDiagonaleVersHaut = 0
|
rechercheDiagonaleVersHaut = 0
|
||||||
joueur = self.plateau[i][j]
|
joueur = self.plateau[i][j]
|
||||||
while (rechercheLigne != -1) or (rechercheColonne != -1) or (rechercheDiagonaleVersHaut != -1) or (rechercheDiagonaleVersBas != -1):
|
while (rechercheLigne != -1) or (rechercheColonne != -1) or (rechercheDiagonaleVersBas != -1) or (rechercheDiagonaleVersHaut != -1):
|
||||||
# -- recherche en ligne --
|
# -- recherche en ligne --
|
||||||
if len(self.plateau[i]) - j - rechercheLigne >= self.nbCasesGagnantes - rechercheLigne: # s'il y a techniquement assez de cases devant pour gagner
|
if len(self.plateau[i]) - j >= self.nbCasesGagnantes: # s'il y a techniquement assez de cases devant pour gagner
|
||||||
if self.plateau[i][j + rechercheLigne] == joueur:
|
if self.plateau[i][j + rechercheLigne] == joueur:
|
||||||
rechercheLigne += 1
|
rechercheLigne += 1
|
||||||
else: # si l'élément ne correspond pas au joueur c'est que il n'a pas gagné depuis cette case avec cette direction
|
else: # si l'élément ne correspond pas au joueur c'est que il n'a pas gagné depuis cette case avec cette direction
|
||||||
|
@ -148,11 +149,11 @@ class Morpion(Minimax):
|
||||||
rechercheLigne = -1
|
rechercheLigne = -1
|
||||||
|
|
||||||
if self.nbCasesGagnantes == rechercheLigne: # si on a trouvé autant de cases à la suite du même joueur qu'il en faut pour gagner
|
if self.nbCasesGagnantes == rechercheLigne: # si on a trouvé autant de cases à la suite du même joueur qu'il en faut pour gagner
|
||||||
rechercheLigne = -1
|
|
||||||
fini = True
|
fini = True
|
||||||
|
break # si partie finie ça ne sert a rien de continuer, donc on quitte la boucle while
|
||||||
|
|
||||||
# -- recherche colonne --
|
# -- recherche en colonne --
|
||||||
if len(self.plateau) - i - rechercheColonne >= self.nbCasesGagnantes - rechercheColonne: # s'il y a techniquement assez de cases devant pour gagner
|
if len(self.plateau) - i >= self.nbCasesGagnantes: # s'il y a techniquement assez de cases devant pour gagner
|
||||||
if self.plateau[i + rechercheColonne][j] == joueur:
|
if self.plateau[i + rechercheColonne][j] == joueur:
|
||||||
rechercheColonne += 1
|
rechercheColonne += 1
|
||||||
else: # si l'élément ne correspond pas au joueur c'est que il n'a pas gagné depuis cette case avec cette direction
|
else: # si l'élément ne correspond pas au joueur c'est que il n'a pas gagné depuis cette case avec cette direction
|
||||||
|
@ -161,11 +162,11 @@ class Morpion(Minimax):
|
||||||
rechercheColonne = -1
|
rechercheColonne = -1
|
||||||
|
|
||||||
if self.nbCasesGagnantes == rechercheColonne: # si on a trouvé autant de cases à la suite du même joueur qu'il en faut pour gagner
|
if self.nbCasesGagnantes == rechercheColonne: # si on a trouvé autant de cases à la suite du même joueur qu'il en faut pour gagner
|
||||||
rechercheColonne = -1
|
|
||||||
fini = True
|
fini = True
|
||||||
|
break # si partie finie ça ne sert a rien de continuer, donc on quitte la boucle while
|
||||||
|
|
||||||
# -- recherche diagonale vers le bas --
|
# -- recherche en diagonale vers le bas --
|
||||||
if (len(self.plateau) - i - rechercheDiagonaleVersBas >= self.nbCasesGagnantes - rechercheDiagonaleVersBas) and (len(self.plateau[i]) - j - rechercheDiagonaleVersBas >= self.nbCasesGagnantes - rechercheDiagonaleVersBas): # s'il y a techniquement assez de cases devant pour gagner
|
if (len(self.plateau) - i >= self.nbCasesGagnantes) and (len(self.plateau[i]) - j >= self.nbCasesGagnantes): # s'il y a techniquement assez de cases devant pour gagner
|
||||||
if self.plateau[i + rechercheDiagonaleVersBas][j + rechercheDiagonaleVersBas] == joueur:
|
if self.plateau[i + rechercheDiagonaleVersBas][j + rechercheDiagonaleVersBas] == joueur:
|
||||||
rechercheDiagonaleVersBas += 1
|
rechercheDiagonaleVersBas += 1
|
||||||
else: # si l'élément ne correspond pas au joueur c'est que il n'a pas gagné depuis cette case avec cette direction
|
else: # si l'élément ne correspond pas au joueur c'est que il n'a pas gagné depuis cette case avec cette direction
|
||||||
|
@ -174,12 +175,13 @@ class Morpion(Minimax):
|
||||||
rechercheDiagonaleVersBas = -1
|
rechercheDiagonaleVersBas = -1
|
||||||
|
|
||||||
if self.nbCasesGagnantes == rechercheDiagonaleVersBas: # si on a trouvé autant de cases à la suite du même joueur qu'il en faut pour gagner
|
if self.nbCasesGagnantes == rechercheDiagonaleVersBas: # si on a trouvé autant de cases à la suite du même joueur qu'il en faut pour gagner
|
||||||
rechercheDiagonaleVersBas = -1
|
|
||||||
fini = True
|
fini = True
|
||||||
|
break # si partie finie ça ne sert a rien de continuer, donc on quitte la boucle while
|
||||||
|
|
||||||
# -- recherche diagonale vers le haut --
|
# -- recherche en diagonale vers le haut --
|
||||||
if (len(self.plateau) >= self.nbCasesGagnantes) and (len(self.plateau[i]) - j - rechercheDiagonaleVersHaut >= self.nbCasesGagnantes - rechercheDiagonaleVersHaut): # s'il y a techniquement assez de cases devant pour gagner
|
if (len(self.plateau) - self.nbCasesGagnantes >= 0) and (len(self.plateau[i]) - j >= self.nbCasesGagnantes): # s'il y a techniquement assez de cases devant pour gagner
|
||||||
if self.plateau[i - rechercheDiagonaleVersHaut][j + rechercheDiagonaleVersHaut] == joueur:
|
idxI = i - rechercheDiagonaleVersHaut # i ne peut pas être <= 0
|
||||||
|
if idxI >= 0 and self.plateau[idxI][j + rechercheDiagonaleVersHaut] == joueur:
|
||||||
rechercheDiagonaleVersHaut += 1
|
rechercheDiagonaleVersHaut += 1
|
||||||
else: # si l'élément ne correspond pas au joueur c'est que il n'a pas gagné depuis cette case avec cette direction
|
else: # si l'élément ne correspond pas au joueur c'est que il n'a pas gagné depuis cette case avec cette direction
|
||||||
rechercheDiagonaleVersHaut = -1
|
rechercheDiagonaleVersHaut = -1
|
||||||
|
@ -187,12 +189,12 @@ class Morpion(Minimax):
|
||||||
rechercheDiagonaleVersHaut = -1
|
rechercheDiagonaleVersHaut = -1
|
||||||
|
|
||||||
if self.nbCasesGagnantes == rechercheDiagonaleVersHaut: # si on a trouvé autant de cases à la suite du même joueur qu'il en faut pour gagner
|
if self.nbCasesGagnantes == rechercheDiagonaleVersHaut: # si on a trouvé autant de cases à la suite du même joueur qu'il en faut pour gagner
|
||||||
rechercheDiagonaleVersHaut = -1
|
|
||||||
fini = True
|
fini = True
|
||||||
|
break # si partie finie ça ne sert a rien de continuer, donc on quitte la boucle while
|
||||||
|
|
||||||
if fini: # si partie finie ça ne sert a rien de continuer, donc on quitte la boucle
|
if fini: # meme chose, on quitte la boucle for (j) si on a fini
|
||||||
break
|
break
|
||||||
if fini: # meme chose, on quitte la boucle si on a fini
|
if fini: # meme chose, on quitte la boucle for (i) si on a fini
|
||||||
break
|
break
|
||||||
|
|
||||||
return fini
|
return fini
|
||||||
|
@ -239,5 +241,5 @@ class Morpion(Minimax):
|
||||||
self.afficher() # affichage du plateau final
|
self.afficher() # affichage du plateau final
|
||||||
print("🎉 Partie terminé, un joueur a gagné !")
|
print("🎉 Partie terminé, un joueur a gagné !")
|
||||||
|
|
||||||
if __name__ == '__main__': # Si on lance directement le fichier et on s'en sert pas comme module
|
if __name__ == "__main__": # Si on lance directement le fichier et on s'en sert pas comme module
|
||||||
Morpion('X', 'O').jouer() # On lance la partie à l'instanciation du Morpion
|
Morpion('X', 'O').jouer() # On lance la partie à l'instanciation du Morpion
|
||||||
|
|
Reference in a new issue