diff --git a/minimax.py b/minimax.py index da6644e..650dc41 100644 --- a/minimax.py +++ b/minimax.py @@ -122,12 +122,16 @@ class Morpion(Minimax): print("%02c" % n, end = " | ") # espace automatique pour pas décaler l'affichage (comme au dessus mais avec la syntaxe de python2) print(espace) + def _caseOccupee(self, x: int, y: int) -> bool: + """Vrai si la case en `x` et `y` est déjà occupée par un joueur.""" + return type(self.plateau[x][y]) == str + def _terminer(self) -> bool: """Vrai si la partie est terminée.""" fini = False for i in range(len(self.plateau)): for j in range(len(self.plateau[i])): - if type(self.plateau[i][j]) == str: # si case occupé par un joueur + if self._caseOccupee(i, j): # si case occupé par un joueur rechercheLigne = 0 rechercheColonne = 0 rechercheDiagonaleVersBas = 0 @@ -193,6 +197,15 @@ class Morpion(Minimax): return fini + def _coordonneesCaseDepuisNumero(self, numero: int) -> tuple[int, int]: + """Renvoie les coordonnées d'une case.""" + return ((numero - 1) // len(self.plateau[0]), (numero - 1) % len(self.plateau[0])) + + def _placementPiece(self, joueur: str, n: int) -> None: + """Place la pièce d'un joueur dans le plateau.""" + x, y = self._coordonneesCaseDepuisNumero(n) + self.plateau[x][y] = joueur + def _demandeCase(self) -> int: """Demande au joueur sur quelle case il veut poser sa pièce.""" prefix = f"({self.joueurA} - {self.nbCasesGagnantes} cases successives pour gagner)" @@ -207,18 +220,16 @@ class Morpion(Minimax): erreur = "valeur trop grande" elif int(reponse) == 0: # < 0 pas considéré comme un nombre avec la fonction `isnumeric` erreur = "valeur trop petite" + else: + x, y = self._coordonneesCaseDepuisNumero(int(reponse)) + if self._caseOccupee(x, y): + erreur = "case déjà occupée" if len(erreur) > 0: - print(f"{prefix} Valeur invalide ({erreur}), réessayez : ", end = "") + print(f"{prefix} ❌ Valeur invalide ({erreur}), réessayez : ", end = "") reponse = -1 return int(reponse) - def _placementPiece(self, joueur: str, n: int) -> None: - """Place la pièce d'un joueur dans le plateau.""" - x = (n - 1) // len(self.plateau[0]) - y = (n - 1) % len(self.plateau[0]) - self.plateau[x][y] = joueur - def jouer(self) -> None: """Lance la partie de Morpion.""" while not self._terminer(): # tant que la partie n'est pas terminé @@ -226,7 +237,7 @@ class Morpion(Minimax): reponse = self._demandeCase() # on demande où le joueur veut posé sa pièce self._placementPiece(self.joueurA, reponse) # on place la pièce du joueur 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 Morpion('X', 'O', (6, 4)).jouer() # On lance la partie à l'instanciation du Morpion