Outils pour utilisateurs

Outils du site


nsi:jeu:morpion

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…
nsi/jeu/morpion.txt · Dernière modification : de goupillwiki