Sudoku на Unity. Часть 2.
В этой части я начну создавать генератор судоку, а именно буду выставлять рандомные значения в ячейки и исключать повторения в горизонтальных линиях, вертикальных линиях и больших ячейках. А также добавлю визуализацию этого процесса. Это будет самая простая часть генератора.
Немного теории как это будет работать. Для примера буду использовать сетку 9x9:
Начну реализацию
Для начала добавлю в скрипт Form метод GetBigCellId, для того чтобы узнавать id большой ячейки
Следующим этапом создам структуру CellId, для удобства хранения позиции ячейки на поле и к какой большой ячейке относится ячейка.
Далее создам скрипт Cell, для управления процессами внутри ячейки
_textValue - для отображения значения внутри ячейки.
_textVariantPrefab - это как раз те маленькие числа-варианты внутри ячейки
_textVariantParent - родитель для объекта-варианта
_textesVariant - коллекция вариантов, служит для визуализации количества вариантов
_variants - коллекция вариантов, она List<> для удобства удаления вариантов
_id - напомню что внутри структуры позиция ячейки и id большой ячейки
GenerateVariants() - создает варианты на основе размера игрового поля
SetValue() - устанавливает значение для ячейки, а также удаляет оставшиеся варианты в ячейке. Цикл проходится с конца массива, для того, что бы не было ошибок, ведь _variants.Count становится на 1 меньше после удаления варианта.
RemoveVariant() - удаляет вариант из текущей ячейки. Так же проверяет наличие это варианта в ячейке. Ведь если вы посмотрите на скриншот выше, где я генерировал 4 для ячейки, то например большая ячейка и горизонтальная линия содержит 3 общие ячейки. И это условие поможет избежать дальнейших проблем.
Скрипт CellGroup (это как раз и есть горизонтальная линия, вертикальная линия и большая ячейка) управляет процессами внутри группы ячеек.
AddCell() - выполняется внутри инициализации другого класса, добавляет ячейку в группу.
RemoveCell() - Удаляет ячейку из группы. Это происходит когда значение для ячейки уже задано. Когда генератор добавил 4 (второй скрин), эта ячейка должна удалиться из группы.
RemoveVariantFromAllCell() - Удаляет из всех ячеек в группе вариант. Так же после установки 4 (второй скрин), удаляет 4 из всех оставшихся ячеек.
Позже вы все поймете
Последний скрипт CellsController, который управляет всем этим делом.
_cellPrefab - префаб ячейки
_button - временная кнопка, при клике будет генерироваться одно число в ячеке. В общем она нужна для проверки работоспособности генератора и для демонстрации его работы.
_horizontalCells, _verticalCells, _bigCells - массивы групп ячеек, описывал выше
_allCells - все ячейки на игровом поле
GenerateCellGroups() - создает группы ячеек на основе размера поля.
GenerateCells() - создает ячейки, задает им id и позицию на игровом поле, а также созданные ячейки присваиваются в 3 группы (CellsGroup)
SetRandom() - тут берется рандомная ячейка из _allCells, а также рандомное значения из доступных вариантов внутри рандомной ячейки.
SetValueToCell() - присваивает значение (value) ячейке, а также удаляет ячейку из трех групп и удаляет value для всех остальных ячеек, принадлежащих данным группам.
Последним этапом в GameGenerator нужно добавить _cellsContoller и инициализировать его.
Видео как все настроить
Демонстрация генератора
На данном этапе генератор еще не готов, и весь кроссворд он сгенерировать не сможет. Это была самая простая часть создания, дальше будет сложнее.