add emoji for better visibility and prevents user from playing a busy case

This commit is contained in:
Mylloon 2021-11-04 17:24:09 +01:00
parent d7210f8f4b
commit 18c80f4717

View file

@ -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("%02c" % n, end = " | ") # espace automatique pour pas décaler l'affichage (comme au dessus mais avec la syntaxe de python2)
print(espace) 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: def _terminer(self) -> bool:
"""Vrai si la partie est terminée.""" """Vrai si la partie est terminée."""
fini = False fini = False
for i in range(len(self.plateau)): for i in range(len(self.plateau)):
for j in range(len(self.plateau[i])): 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 rechercheLigne = 0
rechercheColonne = 0 rechercheColonne = 0
rechercheDiagonaleVersBas = 0 rechercheDiagonaleVersBas = 0
@ -193,6 +197,15 @@ class Morpion(Minimax):
return fini 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: def _demandeCase(self) -> int:
"""Demande au joueur sur quelle case il veut poser sa pièce.""" """Demande au joueur sur quelle case il veut poser sa pièce."""
prefix = f"({self.joueurA} - {self.nbCasesGagnantes} cases successives pour gagner)" prefix = f"({self.joueurA} - {self.nbCasesGagnantes} cases successives pour gagner)"
@ -207,18 +220,16 @@ class Morpion(Minimax):
erreur = "valeur trop grande" erreur = "valeur trop grande"
elif int(reponse) == 0: # < 0 pas considéré comme un nombre avec la fonction `isnumeric` elif int(reponse) == 0: # < 0 pas considéré comme un nombre avec la fonction `isnumeric`
erreur = "valeur trop petite" 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: if len(erreur) > 0:
print(f"{prefix} Valeur invalide ({erreur}), réessayez : ", end = "") print(f"{prefix} Valeur invalide ({erreur}), réessayez : ", end = "")
reponse = -1 reponse = -1
return int(reponse) 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: def jouer(self) -> None:
"""Lance la partie de Morpion.""" """Lance la partie de Morpion."""
while not self._terminer(): # tant que la partie n'est pas terminé 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 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._placementPiece(self.joueurA, reponse) # on place la pièce du joueur
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', (6, 4)).jouer() # On lance la partie à l'instanciation du Morpion Morpion('X', 'O', (6, 4)).jouer() # On lance la partie à l'instanciation du Morpion