Table des matières
Le morpion
Au morpion le premier joueur fait des O, le second joueur fait des X.
Chacun place à son tour, soit O, soit X dans une grille 3×3, un seul sybmbole par case.
Si un joueur arrive à créer un alignement de 3 symboles identiques, il a gagné.
Si la grille devient pleine sans qu'aucun alignement ne soit réalisé, c'est un match nul (c'est la situation la plus courante au morpion)
Ci-dessous, une partie gagnante pour O.
Exemple d'implémentation Python
Attention : L'implémentation proposée définit les règles de fonctionnement d'une partie. Elle ne définit pas l'interface d'une partie. C'est à dire que pour jouer une partie, il faudrait intégrer le module dans une programme qui se chargerait d'initialiser la partie, de commander son affichage à chaque coup, de demander aux joueurs ce qu'ils veulent faire pour leur prochain coup…
Avec classes
'''
module morpion
'''
class Morpion:
P_1 = 'O' # symbole pour joueur 1
P_2 = 'X' # symbole pour joueur 2
EMPTY = ' ' # symbole pour case vide
N = 3 # taille de la grille
def __init__(self):
'''
Crée une partie de morpion
'''
# définit un attribut __grid donnant l'état actuel du jeu
# on peut opter pour une grille donnée en ligne correspondant
# à la grille lue dans l'ordre de lecture : gauche à droite, haut en bas
self.__grid = [self.EMPTY for i in range(self.N**2)]
# joueur en cours : 1
# True si le joueur en cours est P1
# False si le joeir en cours est P2
self.__current_player_is_1 = True
def get(self, indice_line, indice_column):
'''
renvoie le contenue aux indices fournis en argument
'''
assert 0 <= indice_line < self.N
assert 0 <= indice_column < self.N
return self.__grid[indice_line*self.N + indice_column]
def current_player_set(self, indice_line, indice_column):
'''
écrit le symbole pour joueur en cours à la position indiquée, change de joueur
'''
assert self.cell_is_empty(indice_line, indice_column), "La case n'est pas vide"
self.__grid[indice_line*self.N + indice_column] = self.get_current_player_symbol()
self.change_player()
def cell_is_empty(self, indice_line, indice_column):
'''
renvoie True si la case sélectionnée est vide
'''
return self.get(indice_line, indice_column) == self.EMPTY
def get_current_player_symbol(self):
if self.__current_player_is_1:
return self.P_1
return self.P_2
def current_player_is_1(self):
'''
indique si le joueur en cours est P1
'''
return self.__current_player_is_1
def change_player(self):
'''
change de joueur en cours
'''
self.__current_player_is_1 = not self.__current_player_is_1
def clone(self):
'''
renvoie une copie du jeu courant
'''
c = Morpion()
for i in range(self.N**2):
c.__grid[i] = self.__grid[i]
c.__current_player = self.__current_player
return c
def is_full(self):
'''
renvoie True si la grille est pleine
'''
return self.EMPTY not in self.__grid
def game_over(self):
'''
renvoie True si la partie est terminée (victoire ou nul)
'''
return self.is_full() or self.winner() != None
def winner(self):
'''
renvoie le symbole du gagnant s'il y en a un, None sinon
'''
# je vous laisse le soin d'y réfléchir
def __str__(self):
'''
renvoie une version texte de la grille
'''
out = "┏" + "━┳"*(self.N-1) + "━┓\n"
for i in range(self.N):
out += "┃" + "┃".join(self.__grid[i*self.N:(i+1)*self.N]) + "┃\n"
if i == self.N-1:
out += "┗" + "━┻"*(self.N-1) + "━┛\n"
else:
out += "┣" + "━╋"*(self.N-1) + "━┫\n"
return out
def get_availables_cells(self):
'''
renvoie un tableau contenant les paires (incice ligne, indice colonne) des cases vides
'''
# je vous laisse le soin d'y réfléchir
Variantes
- En 3D, avec plus de cases…
