Пример #1
0
 def _generate_sudoku_map(self):
     N = 3
     field = generate(N)
     self._is_fail = self._is_game_over = False
     self._cells_value = [cell for row in field for cell in row]
     self._solve = [
         cell for row in next(solve_sudoku((N, N), field)) for cell in row
     ]
     self._const_cells = [bool(cell) for cell in self._cells_value]
Пример #2
0
    def new_sudoku(self):
        self.matrix, self.sudoku_size = sudoku_generator.gen()
        self.orig_matrix = copy.deepcopy(self.matrix)

        # Булевая матрица, описывающая местоположения элементов судоку, которые будут по умолчанию.
        # Их нельзя редактировать и выглядят внешне по другому
        self.def_num_matrix = [
            [bool(i) for i in row]
            for row in self.orig_matrix
        ]

        # Получим список решения этой судоку
        self.sudoku_solutions = list(solver.solve_sudoku(self.sudoku_size, copy.deepcopy(self.orig_matrix)))
Пример #3
0
def gen():
    """Функция генерации таблицы судоку."""

    example = grid()
    example.mix()

    flook = [[0 for j in range(example.n * example.n)]
             for i in range(example.n * example.n)]
    iterator = 0
    difficult = example.n**4  # Первоначально все элементы на месте

    if DEBUG:
        example.show()
        print("---------------------------")

    # TODO: Добавить возможность указывать сложность
    iterator = example.n**4 - 30

    while iterator < example.n**4:
        # Выбираем случайную ячейку
        i, j = random.randrange(0, example.n * example.n,
                                1), random.randrange(0, example.n * example.n,
                                                     1)
        if flook[i][j] == 0:  # Если её не смотрели
            iterator += 1
            flook[i][j] = 1  # Посмотрим

            temp = example.table[i][
                j]  # Сохраним элемент на случай если без него нет решения или их слишком много
            example.table[i][j] = 0
            difficult -= 1  # Усложняем если убрали элемент

            table_solution = []
            for copy_i in range(0, example.n * example.n):
                table_solution.append(
                    example.table[copy_i][:])  # Скопируем в отдельный список

            i_solution = 0
            for solution in solver.solve_sudoku((example.n, example.n),
                                                table_solution):
                i_solution += 1  # Считаем количество решений

            if i_solution != 1:  # Если решение не одинственное вернуть всё обратно
                example.table[i][j] = temp
                difficult += 1  # Облегчаем

    if DEBUG:
        example.show()
        print("difficult = ", difficult)

    return example.table, (example.n, example.n)
Пример #4
0
    def new_sudoku(self):
        self.invalid_indexes.clear()

        self.matrix, self.sudoku_size = sudoku_generator.gen()
        self.orig_matrix = copy.deepcopy(self.matrix)

        # Булевая матрица, описывающая местоположения элементов судоку, которые будут по умолчанию.
        # Их нельзя редактировать и выглядят внешне по другому
        self.def_num_matrix = [[bool(i) for i in row]
                               for row in self.orig_matrix]

        # Получим список решения этой судоку
        self.sudoku_solutions = list(
            solver.solve_sudoku(self.sudoku_size,
                                copy.deepcopy(self.orig_matrix)))
Пример #5
0
def gen():
    """Функция генерации таблицы судоку."""

    example = grid()
    example.mix()

    flook = [[0 for j in range(example.n * example.n)] for i in range(example.n * example.n)]
    iterator = 0
    difficult = example.n ** 4  # Первоначально все элементы на месте

    if DEBUG:
        example.show()
        print("---------------------------")

    # TODO: Добавить возможность указывать сложность
    iterator = example.n ** 4 - 30

    while iterator < example.n ** 4:
        # Выбираем случайную ячейку
        i, j = random.randrange(0, example.n * example.n, 1), random.randrange(0, example.n * example.n, 1)
        if flook[i][j] == 0:  # Если её не смотрели
            iterator += 1
            flook[i][j] = 1  # Посмотрим

            temp = example.table[i][j]  # Сохраним элемент на случай если без него нет решения или их слишком много
            example.table[i][j] = 0
            difficult -= 1  # Усложняем если убрали элемент

            table_solution = []
            for copy_i in range(0, example.n * example.n):
                table_solution.append(example.table[copy_i][:])  # Скопируем в отдельный список

            i_solution = 0
            for solution in solver.solve_sudoku((example.n, example.n), table_solution):
                i_solution += 1  # Считаем количество решений

            if i_solution != 1:  # Если решение не одинственное вернуть всё обратно
                example.table[i][j] = temp
                difficult += 1  # Облегчаем

    if DEBUG:
        example.show()
        print("difficult = ", difficult)

    return example.table, (example.n, example.n)
Пример #6
0
def generate(n=3) -> list:
    """
    Функция генерации таблицы судоку.
    :param n: int - размер базового поля
    :return: list - готовая таблица
    """

    grid = Grid(n)
    grid.mix()

    field_is_look = [[0 for _ in range(grid.n * grid.n)]
                     for _ in range(grid.n * grid.n)]
    difficult = grid.n**4  # Первоначально все элементы на месте

    iterator = grid.n**4 - 30

    while iterator < grid.n**4:
        # Выбираем случайную ячейку
        i, j = randrange(0, grid.n * grid.n,
                         1), randrange(0, grid.n * grid.n, 1)
        if field_is_look[i][j] == 0:  # Если её не смотрели
            iterator += 1
            field_is_look[i][j] = 1  # Посмотрим

            temp = grid.table[i][
                j]  # Сохраним элемент на случай если без него нет решения или их слишком много
            grid.table[i][j] = 0  # Удаляем элемент
            difficult -= 1  # Усложняем если убрали элемент

            table_solution = deepcopy(
                grid.table)  # Скопируем в отдельный список

            number_of_solution = len(
                list(solve_sudoku(
                    (grid.n, grid.n),
                    table_solution)))  # Считаем количество решений

            if number_of_solution != 1:  # Если решение не одинственное вернуть всё обратно
                grid.table[i][j] = temp
                difficult += 1  # Облегчаем

    return grid.table
Пример #7
0
    def new_sudoku(self):
        self.matrix, self.sudoku_size = sudoku_generator.gen()
        self.orig_matrix = copy.deepcopy(self.matrix)

        # Булевая матрица, описывающая местоположения элементов судоку, которые будут по умолчанию.
        # Их нельзя редактировать и выглядят внешне по другому
        self.def_num_matrix = [[bool(i) for i in row]
                               for row in self.orig_matrix]

        for i in range(len(self.matrix)):
            for j in range(len(self.matrix[i])):
                # TODO: сделать матрицу для ячеек
                cell = self._grid_layout.itemAtPosition(i, j).widget()
                num = self.matrix[i][j]
                if num:
                    cell.setText(str(num))

        # Получим список решения этой судоку
        self.sudoku_solutions = list(
            solver.solve_sudoku(self.sudoku_size,
                                copy.deepcopy(self.orig_matrix)))
Пример #8
0
    def new_sudoku(self):
        self.matrix, self.sudoku_size = sudoku_generator.gen()
        self.orig_matrix = copy.deepcopy(self.matrix)

        # Булевая матрица, описывающая местоположения элементов судоку, которые будут по умолчанию.
        # Их нельзя редактировать и выглядят внешне по другому
        self.def_num_matrix = [
            [bool(i) for i in row]
            for row in self.orig_matrix
        ]

        for i in range(len(self.matrix)):
            for j in range(len(self.matrix[i])):
                # TODO: сделать матрицу для ячеек
                cell = self._grid_layout.itemAtPosition(i, j).widget()
                num = self.matrix[i][j]
                if num:
                    cell.setText(str(num))

        # Получим список решения этой судоку
        self.sudoku_solutions = list(solver.solve_sudoku(self.sudoku_size, copy.deepcopy(self.orig_matrix)))