示例#1
0
    def getGameEnded(self, board, player):
        """
        Определяет, закончилась ли игра. Если закончилась, то с каким результатом.
        :param board: Текущая доска.
        :param player: Текущий игрок.

        :return: 1, если игрок player выиграл,
                 -1, если игрок player проиграл,
                 0, если игра не закончилась
                 1е-4, если ничья.
        """
        b = Board(self.n)
        b.pieces = np.copy(board)
        if any([sum(b.pieces[i]) == self.n for i in range(self.n)]) or \
                any([sum(b.pieces[:, i]) == self.n for i in range(self.n)]) or \
                sum([b[i][(self.n - 1) - i] for i in range(self.n)]) == self.n or \
                sum(np.diag(b.pieces)) == self.n:
            return 1
        elif any([sum(b.pieces[i]) == -self.n for i in range(self.n)]) or \
                any([sum(b.pieces[:, i]) == -self.n for i in range(self.n)]) or \
                sum([b[i][(self.n - 1) - i] for i in range(self.n)]) == -self.n or \
                sum(np.diag(b.pieces)) == -self.n:
            return -1
        elif any([
                b.pieces[i, j] == 0 for i in range(self.n)
                for j in range(self.n)
        ]):
            return 0
        else:
            return 1e-4
示例#2
0
    def getValidMoves(self, board, player):
        """
        Возвращает numpy массив с допустимыми ходами для состояния доски
        board и текущего игрока player.

        :param board: Текущее состояние доски.
        :param player: Текущий игрок.
        """
        valids = [0] * self.getActionSize()
        b = Board(self.n)
        b.pieces = np.copy(board)
        legal_moves = b.get_legal_moves()
        if len(legal_moves) == 0:
            valids[-1] = 1
            return np.array(valids)
        for x, y in legal_moves:
            valids[self.n * x + y] = 1
        return np.array(valids)
示例#3
0
    def getNextState(self, board, player, action):
        """
        Возвращает следующее состояние доски.

        :param board: Текущая доска.
        :param player: Текущий игрок.
        :param action:
                    Действие, которое нужно применить.
                    Действие должно быть допустимым ходом.
        :return: следующее состояние доски, после совершение действия.
        """
        if action == self.n * self.n:
            return board, -player
        b = Board(self.n)
        b.pieces = np.copy(board)
        move = (int(action / self.n), int(action % self.n))
        b.execute_move(move, player)
        return b.pieces, -player
示例#4
0
    def getGameEnded(self, board, player):
        """
        Определяет, закончилась ли игра. Если закончилась, то с каким результатом.
        :param board: Текущая доска.
        :param player: Текущий игрок.

        :return: 1, если игрок player выиграл,
                 -1, если игрок player проиграл,
                 0, если игра не закончилась
                 1е-4, если ничья.
        """
        b = Board(self.n)
        b.pieces = np.copy(board)

        if b.is_win(player):
            return 1
        if b.is_win(-player):
            return -1
        if b.has_legal_moves():
            return 0
        # draw has a very little value
        return 1e-4
示例#5
0
 def getInitBoard(self):
     """
     Возвращает стартовую доску, преобразованную в массив numpy.
     """
     b = Board(self.n)
     return np.array(b.pieces)
示例#6
0
 def getCount(self, board, player):
     b = Board(self.n)
     b.pieces = np.copy(board)
     return b.get_count(player)
示例#7
0
 def getScore(self, board, player):
     b = Board(self.n)
     b.pieces = np.copy(board)
     return b.count_diff(player)