fix bug when looking the downward diagonals

This commit is contained in:
Mylloon 2021-11-04 18:16:32 +01:00
parent 252124d26f
commit e2ce777bc3

View file

@ -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