Генератор Судоку (v. 2.x.x).
Описание
Генератор судоку — библиотека (модуль) из нескольких алгоритмов, позволяющих создавать задачи судоку различной степени сложности и формы. Комбинируя различные алгоритмы тем или иным образом, Вы можете собрать собственную задачу судоку для игры. Любой алгоритм легко корректируется в соответствии с вашими нуждами.
Можно пользоваться генератором, как самостоятельной игрой с разными уровнями сложности.
Версии
- 2.4.1 — к имени каждой переменной добавлен суффикс sudoku.
- 2.4.2 - добавлена подпрограмма переадресовки по имеющемуся адресу для блоков ('ffa'). Так же умеет вычислять координату блока.
- 2.5.0 — Подкорректированы два алгоритма, дублирующие некоторые другие алгоритмы. Исключены подпрограммы del_element7 и del_countnum. Добавлена подпрограмма kill_all, предназначенная для избавления от всех переменных, задействованных в игре, что позволяет собирать судоку в виде модуля и добавлять к любой игре.
- 2.5.1 – Исправлена ошибка в работе алгоритма prove_dcount (проверялось условие, выполнение которого заведомо невозможно). Почищен код. Исключена подпрограмма prove_element, дублирующая подпрограмму prove_anum.
- 2.5.2 – Добавлена функция очистки ячейки.
Локации
Основные
sudoku – локация самой игры. При сборке модуля эта локация может быть исключена. Здесь она является примерной локацией для Вашей игры.
На этой локации обязательно должна быть выставлена переменная usehtml=1
step1 – шаг первый. Генерация трёх случайных блоков, заполненных случайным образом. Эта подпрограмма всегда вызывается первой. Она заполняет три блока матрицы из восьмидесяти одного элемента числами по правилам судоку:
step2 – шаг второй (условно). Находит элемент с наименьшим возможным количеством вариантов заполнения. Выбирает среди имеющихся вариантов случайным образом один и прописывает этот вариант элементу.
step3 – шаг третий. Заполняет все элементы матрицы через шаг второй. Заполнение ведётся до тех пор, пока numbercount_sudoku не окажется равной нулю.
step4 – шаг четвёртый. Условный. Проверяет правильность заполнения судоку по правилам судоку. т. е. проверяет наличие пустых элементов, или повторяющихся элементов в блоках, строках, столбцах.
step5 – шаг пятый. Формирует задачу со скрытием заданного количества случайных элементов.
step6 – шаг пятый. Формирует задачу с единственно возможным вариантом решения (около 40 скрываемых элементов).
step7 – шаг пятый. Формирует задачу, похожую на задачу, составленную человеком (порядка пятидесяти скрываемых элементов).
Вспомогательные
full_block – заполняет блок с координатами первого элемента args[0] – args[1] (x_sudoku – y_sudoku) случайным образом.
full_anum – заполняет массив с именем $args[0] текстовыми значениями от '0' до '8'
full_countnum – заполняет массивы $countnum_sudoku_N значениями от '0' до '8', где N – порядковый номер элемента в матрице (0...80), вычисляемый по координатам x – y.
full_countnum_adr – заполняет массив $sountnum_sudoku[N] строковыми значениями вида 'x_sudoku=<<x_sudoku>> & y_sudoku=<<y_sudoku>>', где N – порядковый номер элемента в матрице (0...80), вычисляемый по координатам x_sudoku – y_sudoku.
full_count – заполняет массивы $count_raw_J $count_col_J $count_block_J значениями от '0' до '8', где J – порядковый номер строки, столбца или блока (соответственно) в матрице.
full_menu – заполняет массив $menu_sudoku – конструкциями меню вида 'действие:локация действия'.
print_sudoku – выводит в окно дополнительного описания результирующий вид матрицы судоку. т. е. вид судоку после шага третьего. Может использоваться, как для проверки решения, так и для подсказки игроку. Предназначалась для отслеживания правильности заполнения матрицы после шага третьего. Необязательная локация.
print_link – выводит в окно основного описания все возможные значения элемента, т. е. массив $countnum_sudoku_N. Необязательная локация.
print_exit – выводит в окно основного описания получившуюся задачу судоку.
print_count – выводит в окно дополнительного описания размеры массивов $countnum_sudoku_N. Необязательная локация.
del_countnum_b – подпрограмма удаления из массивов $countnum_sudoku_N значений элементов, которые в них больше не могут использоваться.
del_element_raw, del_element_col, del_element_block – удаляет из массивов $count_raw_J $count_col_J $count_block_J значение удаленного из матрицы элемента.
del_element – удаляет из массива $dublnum_sudoku элемент с координатами args[1] args[2] (x_sudoku – y_sudoku) и со значением $args[0]. Добавляет в массив $countnum_sudoku_N элемент со значением $args[0], из массива $countnum_sudoku удаляет элемент со значением 'x_sudoku=<<args[1]>> & y_sudoku=<<args[2]>>'. При обращении с локаций del_element_raw, del_element_col, del_element_block непосредственно удаляет из массивов $count_raw_J $count_col_J $count_block_J значение удаленного элемента.
kill_countnum – удаляет все массивы $countnum_sudoku_N.
kill_all – удаляет все массивы переменных, использовавшихся в игре. Весьма полезная локация, если вы встраиваете генератор судоку в собственную игру.
s0 ... s8 – локации, отвечающие за работу контекстного меню в игре.
prove_anum – проверка на то, какие значения может принимать элемент. Если больше одного, выдается ошибка.
prove_anum7 – практически то же самое, что prove_anum, только алгоритм попроще и в результате выдается маркер перехода.
prove_count – проверяет каждый элемент в строке, столбце или блоке, сопутствующих удаляемому элементу, на количество возможных вариантов.
prove_fast – простая проверка на то, есть ли в строке, столбце или блоке ещё удалённые элементы.
prove_place и prove_dcount – сложно вспомнить, что это за проверки, однако в результате этих проверок заполняется массив $dcount_N значениями, которые у этого элемента не могут быть.
ffa – подпрограмма, вычисляющая координаты правого верхнего угла блока (или координаты блока среди остальных блоков) по координатам элемента, который в этом блоке находится.
Переменные:
Sudoku
USEHTML – выставляется равной единице для корректного отображения судоку на экране.
action_sudoku – в зависимости от состояния этой переменной при обращении к локации выводится тот или иной набор действий.
Step1
i_sudoku – используется как счётчик циклов
n_sudoku – используется, как счётчик цикла, отсчитывающий количество (3) незаполненных случайных блоков.
$block_sudoku – массив, содержащий все номера блоков, которые можно заполнить.
z_sudoku – этой переменной возвращается номер случайного элемента массива $block_sudoku.
b_sudoku и a_sudoku – координаты блока среди остальных блоков. Вертикальный и горизонтальный координат соответственно.
x_sudoku и y_sudoku – матричные координаты первого (верхний левый) элемента блока.
Step2
z_sudoku – наименьшее найденное значение (под значением подразумевается количество возможных вариантов решений для элемента). Изначально выставляется 9, т. е. 9 возможных вариантов решения.
s_sudoku и t_sudoku – матричные координаты элемента по горизонтали и вертикали соответственно.
zx_sudoku и zy_sudoku – матричные координаты элемента значение которого меньше z_sudoku.
l_sudoku – защита от дурака. Переменная подсчитывает количество ошибок при проверках, присутствует ли выбранное значение в массиве возможных значений для элемента.
gump_sudoku – если равна единице, значит, выброшенное значение элемента не является одним из возможных значений этого элемента. Маркер
zz_sudoku – случайный элемент массива $countnum_sudoku_N (иными словами одно из значений элемента матрицы).
$countnum_sudoku_<<zx_sudoku+zy_sudoku*9>> - массив возможных значений элемента матрицы с координатами zx_sudoku — zy_sudoku.
$znumber_sudoku – временно хранит выброшенное значение элемента матрицы.
$num_sudoku[zx_sudoku+zy_sudoku*9] – элемент массива $num_sudoku, хранящий текущее значение элемента матрицы с координатами zx_sudoku — zy_sudoku.
Step3
numbercount_sudoku – подсчитывает количество заполненных элементов
step4
j_sudoku и i_sudoku – матричные координаты элемента $num_sudoku[], счётчики циклов.
$anum_sudoku – массив, заполняемый значениями из строк, столбцов, блоков поочередно. По содержимому этого массива проверяется правильность заполнения судоку.
$num_sudoku — массив, содержащий значения всех элементов получившейся матрицы судоку.
$marker_sudoku_p — если элемент оказывается незаполненным, в ячейку этого массива (номер ячейки соответствует номеру ячейки в массиве $num_sudoku) записывается слово «error».
$marker_sudoku_raw – если значения двух (или более) элементов в строке оказываются одинаковыми, в ячейку (индексируются по номеру строк) данного массива вписывается слово «error».
$marker_sudoku_col и $marker_sudoku_block – то же, что и$marker_sudoku_raw только для столбцов и блоков.
z_sudoku – временно хранит позицию проверяемого на совпадения в $anum_sudoku элемента.
a_sudoku – счётчик цикла, номер проверяемого блока.
q_sudoku и w_sudoku – границы координат, в пределах которых нужно производить проверку при переборе элементов блока.
Step5
numbercount_sudoku – количество скрываемых элементов. Можно задавать от 25 до 50. Чем больше скрыто элементов, тем меньше вероятность, что у судоку будет только одно решение.
z_sudoku – случайное число от 0 до 80. Этой переменной возвращается номер скрываемого элемента.
$num_sudoku — массив, который содержит конечные значения всех элементов. Фактически его правильное заполнение и является решением задачи.
$restore_num – хранит получившуюся задачу судоку для возможности сброса.
$zanum_sudoku – хранит все значения элементов матрицы, присвоенные до получения задачи.
Step6
numbercount_sudoku – количество обрабатываемых элементов. Счётчик цикла.
$restore_num – хранит получившуюся задачу судоку для возможности сброса.
$zanum_sudoku – хранит все значения элементов матрицы, присвоенные до получения задачи.
$dublnum_sudoku – хранит временное состояние задачи. Если полученная задача проходит проверку, она копируется в $num_sudoku, если не проходит, $dublnum_sudoku возвращается вид из предыдущего шага.
$countnum_sudoku[] - массив, в котором хранятся строки вида 'x_sudoku=<<x_sudoku>> & y_sudoku=<<y_sudoku>>', из которых производится восстановление адреса элемента.
$inum_sudoku – временно хранит значение выбранного в массиве $dublnum_sudoku элемента матрицы.
x_sudoku и y_sudoku – соответственно горизонтальные и вертикальные матричные координаты элемента. Вычисляются из значения ячейки $countnum_sudoku[].
hiden_sudoku – счётчик корректно скрытых элементов матрицы.
Step7
$erroring_sudoku – служит для отслеживания ошибок и маркировки, в некоторых случаях используется в качестве метки при возобновлении исполнения алгоритма и возврате к началу цикла.
numbercount_sudoku – количество обрабатываемых элементов. Счётчик цикла.
$restore_num – хранит получившуюся задачу судоку для возможности сброса.
$zanum_sudoku – хранит все значения элементов матрицы, присвоенные до получения задачи.
$dublnum_sudoku – хранит временное состояние задачи. Если полученная задача проходит проверку, она копируется в $num_sudoku, если не проходит, $dublnum_sudoku возвращается вид из предыдущего шага.
$countnum_sudoku[] - массив, в котором хранятся строки вида 'x_sudoku=<<x_sudoku>> & y_sudoku=<<y_sudoku>>', из которых производится восстановление адреса элемента.
x_sudoku и y_sudoku – соответственно горизонтальные и вертикальные матричные координаты элемента. Вычисляются из значения ячейки $countnum_sudoku[].
$count_raw_N - хранит оставшиеся значения элементов для строк, то же, но без N для временного хранения данных
$count_col_N - хранит оставшиеся значения элементов для столбцов, то же, но без N для временного хранения данных
$count_block_N - хранит оставшиеся значения элементов для блоков, то же, но без N для временного хранения данных
j_sudoku и i_sudoku – координаты блока относительно прочих блоков соотв. горизонтальный и вертикальный.