Ceci est une ancienne révision du document !
Warning: Constant SVG_DPI already defined in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 75
Warning: Undefined variable $ml_array in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 264
Warning: Undefined array key "inResponsiveUnits" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 282
Warning: Undefined array key "hasCssClasses" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 301
Warning: Undefined array key "print" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 322
Warning: Undefined variable $svg_width in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 239
Warning: Undefined variable $svg_width in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 244
Warning: Undefined variable $svg_height in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 245
Warning: Undefined variable $ml_array in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 264
Warning: Undefined array key "inResponsiveUnits" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 282
Warning: Undefined array key "hasCssClasses" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 301
Warning: Undefined array key "print" in /home/goupillf/wiki.goupill.fr/lib/plugins/svgembed/syntax.php on line 322
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
- morpion.py
''' 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…
