From e2ce777bc3534feeb45559dbcf7b4ad3fdbea890 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Thu, 4 Nov 2021 18:16:32 +0100 Subject: [PATCH] fix bug when looking the downward diagonals --- minimax.py | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/minimax.py b/minimax.py index e6b37ca..7b63dda 100644 --- a/minimax.py +++ b/minimax.py @@ -134,12 +134,13 @@ class Morpion(Minimax): if self._caseOccupee(i, j): # si case occupé par un joueur rechercheLigne = 0 rechercheColonne = 0 + # les diagonales vont vers la droite rechercheDiagonaleVersBas = 0 rechercheDiagonaleVersHaut = 0 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 -- - 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: 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 @@ -148,11 +149,11 @@ class Morpion(Minimax): 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 - rechercheLigne = -1 fini = True + break # si partie finie ça ne sert a rien de continuer, donc on quitte la boucle while - # -- recherche colonne -- - if len(self.plateau) - i - rechercheColonne >= self.nbCasesGagnantes - rechercheColonne: # s'il y a techniquement assez de cases devant pour gagner + # -- recherche en colonne -- + 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: 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 @@ -161,11 +162,11 @@ class Morpion(Minimax): 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 - rechercheColonne = -1 fini = True + break # si partie finie ça ne sert a rien de continuer, donc on quitte la boucle while - # -- recherche 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 + # -- recherche en diagonale vers le bas -- + 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: 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 @@ -174,12 +175,13 @@ class Morpion(Minimax): 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 - rechercheDiagonaleVersBas = -1 fini = True + break # si partie finie ça ne sert a rien de continuer, donc on quitte la boucle while - # -- recherche 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 self.plateau[i - rechercheDiagonaleVersHaut][j + rechercheDiagonaleVersHaut] == joueur: + # -- recherche en diagonale vers le haut -- + 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 + idxI = i - rechercheDiagonaleVersHaut # i ne peut pas être <= 0 + if idxI >= 0 and self.plateau[idxI][j + rechercheDiagonaleVersHaut] == joueur: 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 rechercheDiagonaleVersHaut = -1 @@ -187,12 +189,12 @@ class Morpion(Minimax): 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 - rechercheDiagonaleVersHaut = -1 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 - break - if fini: # meme chose, on quitte la boucle si on a fini + if fini: # meme chose, on quitte la boucle for (j) si on a fini + break + if fini: # meme chose, on quitte la boucle for (i) si on a fini break return fini @@ -239,5 +241,5 @@ class Morpion(Minimax): self.afficher() # affichage du plateau final 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