В данной работе я хотела бы продемонстрировать свой проект за 3 курс по теме “Процедурная генерация лабиринтов по алгоритму Эллера в игре на движке Unity”. Фокус был на алгоритме Эллера, он интересен тем, что генерирует лабиринты, храня в памяти всего один массив ячеек, а также на выходе получается идеальный лабиринт без петель, замкнутых цепей и недостижимых областей. Алгоритм имеет элемент случайности, поэтому при каждой генерации лабиринт получается разным.
Хоть фокус и был на алгоритме, также была реализована и игровая логика, соответственно получилась полноценная игра.
Данная игра является аркадной. Она бесконечная, простая в игровом процессе, производится на одном экране, а также у игрока имеется несколько жизней.
-
Панель меню
- На панели есть две кнопки "New game" и "Exit". При нажатии они позволяют соответственно начать новую игру и выйти из игры. Панель игры также можно вызвать во время игры с помощью клавиши "Esc".
-
Управление шариком
- Управление реализовано с помощью AddForce. Для управления используйте клавиши на клавиатуре "Вверх", "Вниз", "Вправо", "Влево".
-
Индикаторы
- Индикатор здоровья. Отображает количество жизней игрока в данный момент времени. Если жизни заканчиваются, игрока перебрасывает в сцену с главным меню. Если игрок контактирует с опасным объектом, то у игрока отнимается одна жизнь.
- Индикатор времени. Отображает количество оставшегося времени на прохождение уровня. Если время заканчивается, отнимается одна жизнь. Если игрок контактирует с опасным объектом, то время начинает свой отсчёт заново.
-
Опасный объект
- Огонь, появляющийся в рандомных ячейках через определённый промежуток времени. Столкновения следует избегать.
-
Объект перехода на новый уровень
- Всегда располагается в правом верхнем углу, при столкновении с данным объектом игрока перебрасывает на новый уровень с большей площадью.
- MazeSpawner
- Отвечает за отображение лабиринта в сцене, связует математическую модель лабиринта и его физическое представление. В соответствии с расчётом алгоритма отображает лабиринт в сцене, а также генерирует и отображает огонь.
- UIManager
- В этом скрипте прописаны функции, которые используются в меню - "New game" и "Exit". В New game также задаются входные значения при начале игры.
- CameraMove
- Описывает передвижение камеры, слежение за целью - шаром.
- Health
- Отображает количество жизней в UI и загружает главное меню, если жизни закончились.
- PlayerControls
- Описывает движение шара и управление им, а также реализует вызов всплывающего меню(паузы) и отслеживает столкновения с опасным объектом и с объектом перехода.
- Timer
- Отображает количество оставшегося времени в UI, реализует течение времени, а также условия, если время закончилось - отнять жизнь, если и время, и жизнь закончились - перебросить в главное меню.
- structSet
- Структура для реализации множеств, так как алгоритм строится на их основе.
- Cell
- Физическая модель ячейки лабиринта.
- EllersAlgorythm
- В этом скрипте описаны функции для генерации лабиринта по алгоритму Эллера.
- MazeCell
- Математическая модель ячейки лабиринта.
- Инициализируем массив так, чтобы у каждого элемента массива было своё уникальное множество. У всех ячеек первой строки должна быть верхняя стена, а у элементов по краям соответственно левая и правая стены. Также отметим это у наших элементов.
- Рандомно объединяем множества ячеек, но только если их множества не совпадают(Пусть у первой ячейки было множество 1, а у второй = 2, при их объединении у каждой ячейки множество теперь будет 12). Это означает, что между ячейками есть путь. Если множества совпадают, их необходимо разделить стеной. Данная информация позволяет вырезать проходы в текущей строке без создания петель или изоляций.
- Теперь создадим нижнюю стену у ячеек. Это будем делать тоже рандомно, но при условии, что в множестве есть хотя бы одна ячейка, у которой не будет нижней стены.
- Далее опускаемся вниз. Для этого ячейкам, у которых есть нижняя стена, изменим множества на новые, которые ещё не участвовали в алгоритме.
- Далее определяем, оставлять ли боковые стены и строить ли новые, как в пункте 2, и повторяем алгоритм до тех пор, пока не создадим m строк.
- Для последней строки соединим множества всех ячеек, которые не имеют общего подмножества и уберём стены. Ячейки, которые имеют такое подмножество наоборот разделим стеной.
Для того, чтобы поиграть следует скачать папку bin на свой компьютер и запустить файл Kursachhhh.exe
Постмотреть видео игры можно здесь