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
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)
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
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
def getInitBoard(self): """ Возвращает стартовую доску, преобразованную в массив numpy. """ b = Board(self.n) return np.array(b.pieces)
def getCount(self, board, player): b = Board(self.n) b.pieces = np.copy(board) return b.get_count(player)
def getScore(self, board, player): b = Board(self.n) b.pieces = np.copy(board) return b.count_diff(player)