преврати это в графический интерфейс, вместо ввод будут настраивымые сетки 5 на 5 где их можно нарисовать: import copy

# Определение фигур
pieces = {
    1: [[1]],
    2: [[1, 1]],
    3: [[1, 1, 1]],
    4: [[1, 1, 1, 1]],
    5: [[1, 1, 1, 1, 1]],
    6: [[1],
        [1]],
    7: [[1],
        [1],
        [1]],
    8: [[1],
        [1],
        [1],
        [1]],
    9: [[1],
        [1],
        [1],
        [1],
        [1]],
    10: [[1, 1],
         [1, 1]],
    11: [[0, 1],
         [1, 1]],
    12: [[1, 0],
         [1, 1]],
    13: [[1, 1],
         [1, 0]],
    14: [[1, 1],
         [0, 1]],
    15: [[1, 1, 1],
         [1, 0, 0],
         [1, 0, 0]],
    16: [[1, 1, 1],
         [0, 0, 1],
         [0, 0, 1]],
    17: [[0, 0, 1],
         [0, 0, 1],
         [1, 1, 1]],
    18: [[1, 0, 0],
         [1, 0, 0],
         [1, 1, 1]],
    19: [[1, 1, 0],
         [1, 0, 0],
         [1, 0, 0]],
    20: [[0, 1, 1],
         [0, 0, 1],
         [0, 0, 1]],
    21: [[0, 0, 0],
         [0, 0, 1],
         [1, 1, 1]],
    22: [[0, 0, 0],
         [1, 0, 0],
         [1, 1, 1]],
    23: [[0, 1, 0],
         [1, 1, 1]],
    24: [[1, 1, 1],
         [0, 1, 0]],
    25: [[0, 0, 0],
         [1, 1, 1]]
}

# Инициализация пустого поля 9x9 или с заданным состоянием
def create_board(initial_grid=None):
    if initial_grid:
        # Проверяем, что размерность правильная
        if len(initial_grid) != 9 or any(len(row) != 9 for row in initial_grid):
            raise ValueError("Начальная сетка должна быть размером 9x9.")
        return initial_grid
    else:
        # Создаем пустую сетку
        return [[0 for _ in range(9)] for _ in range(9)]

# Отображение игрового поля
def print_board(board):
    print("  " + " ".join(map(str, range(1, 10))))
    for i in range(9):
        row = ''
        for j in range(9):
            cell = board[i][j]
            if cell == 0:
                row += '░ '
            else:
                row += '▓ '
        print(str(i+1) + ' ' + row)

# Проверка возможности установки фигуры на позиции (x, y)
def can_place(board, piece, x, y):
    for i in range(len(piece)):
        for j in range(len(piece[0])):
            if piece[i][j]:
                if x + i >= 9 or y + j >= 9 or board[x + i][y + j]:
                    return False
    return True

# Установка фигуры на позиции (x, y)
def place_piece(board, piece, x, y):
    for i in range(len(piece)):
        for j in range(len(piece[0])):
            if piece[i][j]:
                board[x + i][y + j] = 1

# Удаление заполненных строк, столбцов и блоков 3x3
def clear_full_lines(board):
    cleared = False
    # Проверка строк
    for i in range(9):
        if all(board[i][j] for j in range(9)):
            for j in range(9):
                board[i][j] = 0
            cleared = True
    # Проверка столбцов
    for j in range(9):
        if all(board[i][j] for i in range(9)):
            for i in range(9):
                board[i][j] = 0
            cleared = True
    # Проверка блоков 3x3
    for block_x in range(0, 9, 3):
        for block_y in range(0, 9, 3):
            if all(board[i][j] for i in range(block_x, block_x + 3) for j in range(block_y, block_y + 3)):
                for i in range(block_x, block_x + 3):
                    for j in range(block_y, block_y + 3):
                        board[i][j] = 0
                cleared = True
    return cleared

# Функция игры с возможностью настроить начальное состояние сетки
def play_game():
    # Здесь вы можете задать начальную сетку
    # Например:
    initial_grid = [
        [0, 0, 0, 0, 0, 0, 0, 0, 0],  # Строка 1
        [0, 0, 0, 0, 0, 0, 0, 0, 0],  # Строка 2
        [0, 0, 0, 0, 0, 0, 0, 0, 0],  # Строка 3
        [0, 0, 0, 0, 0, 0, 0, 0, 0],  # Строка 4
        [0, 0, 0, 0, 0, 0, 0, 0, 0],  # Строка 5
        [0, 0, 0, 0, 0, 0, 0, 0, 0],  # Строка 6
        [0, 0, 0, 0, 0, 0, 0, 0, 0],  # Строка 7
        [0, 0, 0, 0, 0, 0, 0, 0, 0],  # Строка 8
        [0, 0, 0, 0, 0, 0, 0, 0, 0]   # Строка 9
    ]

    board = create_board(initial_grid)

    print("Добро пожаловать в Blockudoku!")
    print_board(board)
    while True:
        try:
            input_pieces = input("Введите номера трех фигур через пробел (или 'exit' для выхода): ")
            if input_pieces.lower() == 'exit':
                break
            piece_ids = list(map(int, input_pieces.strip().split()))
            if len(piece_ids) != 3 or not all(pid in pieces for pid in piece_ids):
                print("Некорректный ввод. Пожалуйста, введите три валидных номера фигур.")
                continue
            for pid in piece_ids:
                piece = pieces[pid]
                placed = False
                # Поиск доступных позиций для установки фигуры
                for x in range(9):
                    for y in range(9):
                        if can_place(board, piece, x, y):
                            place_piece(board, piece, x, y)
                            print(f"Фигура {pid} установлена на позицию ({x+1}, {y+1}).")
                            placed = True
                            break
                    if placed:
                        break
                if not placed:
                    print(f"Не удалось установить фигуру {pid}. Игра окончена.")
                    return
                # Очистка заполненных линий
                while clear_full_lines(board):
                    print("Линия заполнена и удалена!")
                print_board(board)
        except ValueError:
            print("Некорректный ввод. Попробуйте снова.")

play_game()