Skip to content

Repository files navigation

Crazy-Maze

В данной работе я хотела бы продемонстрировать свой проект за 3 курс по теме “Процедурная генерация лабиринтов по алгоритму Эллера в игре на движке Unity”. Фокус был на алгоритме Эллера, он интересен тем, что генерирует лабиринты, храня в памяти всего один массив ячеек, а также на выходе получается идеальный лабиринт без петель, замкнутых цепей и недостижимых областей. Алгоритм имеет элемент случайности, поэтому при каждой генерации лабиринт получается разным.

Хоть фокус и был на алгоритме, также была реализована и игровая логика, соответственно получилась полноценная игра.

Требования

Unity 2020.3.3f1 (LTS)

Логика игры и её функционал

Данная игра является аркадной. Она бесконечная, простая в игровом процессе, производится на одном экране, а также у игрока имеется несколько жизней.

  • Панель меню

    • На панели есть две кнопки "New game" и "Exit". При нажатии они позволяют соответственно начать новую игру и выйти из игры. Панель игры также можно вызвать во время игры с помощью клавиши "Esc".
  • Управление шариком

    • Управление реализовано с помощью AddForce. Для управления используйте клавиши на клавиатуре "Вверх", "Вниз", "Вправо", "Влево".
  • Индикаторы

    • Индикатор здоровья. Отображает количество жизней игрока в данный момент времени. Если жизни заканчиваются, игрока перебрасывает в сцену с главным меню. Если игрок контактирует с опасным объектом, то у игрока отнимается одна жизнь.
    • Индикатор времени. Отображает количество оставшегося времени на прохождение уровня. Если время заканчивается, отнимается одна жизнь. Если игрок контактирует с опасным объектом, то время начинает свой отсчёт заново.
  • Опасный объект

    • Огонь, появляющийся в рандомных ячейках через определённый промежуток времени. Столкновения следует избегать.
  • Объект перехода на новый уровень

    • Всегда располагается в правом верхнем углу, при столкновении с данным объектом игрока перебрасывает на новый уровень с большей площадью.

Скрипты

  • MazeSpawner
    • Отвечает за отображение лабиринта в сцене, связует математическую модель лабиринта и его физическое представление. В соответствии с расчётом алгоритма отображает лабиринт в сцене, а также генерирует и отображает огонь.
  • UIManager
    • В этом скрипте прописаны функции, которые используются в меню - "New game" и "Exit". В New game также задаются входные значения при начале игры.
  • CameraMove
    • Описывает передвижение камеры, слежение за целью - шаром.
  • Health
    • Отображает количество жизней в UI и загружает главное меню, если жизни закончились.
  • PlayerControls
    • Описывает движение шара и управление им, а также реализует вызов всплывающего меню(паузы) и отслеживает столкновения с опасным объектом и с объектом перехода.
  • Timer
    • Отображает количество оставшегося времени в UI, реализует течение времени, а также условия, если время закончилось - отнять жизнь, если и время, и жизнь закончились - перебросить в главное меню.
  • structSet
    • Структура для реализации множеств, так как алгоритм строится на их основе.
  • Cell
    • Физическая модель ячейки лабиринта.
  • EllersAlgorythm
    • В этом скрипте описаны функции для генерации лабиринта по алгоритму Эллера.
  • MazeCell
    • Математическая модель ячейки лабиринта.

Логика алгоритма Эллера

  1. Инициализируем массив так, чтобы у каждого элемента массива было своё уникальное множество. У всех ячеек первой строки должна быть верхняя стена, а у элементов по краям соответственно левая и правая стены. Также отметим это у наших элементов.
  2. Рандомно объединяем множества ячеек, но только если их множества не совпадают(Пусть у первой ячейки было множество 1, а у второй = 2, при их объединении у каждой ячейки множество теперь будет 12). Это означает, что между ячейками есть путь. Если множества совпадают, их необходимо разделить стеной. Данная информация позволяет вырезать проходы в текущей строке без создания петель или изоляций.
  3. Теперь создадим нижнюю стену у ячеек. Это будем делать тоже рандомно, но при условии, что в множестве есть хотя бы одна ячейка, у которой не будет нижней стены.
  4. Далее опускаемся вниз. Для этого ячейкам, у которых есть нижняя стена, изменим множества на новые, которые ещё не участвовали в алгоритме.
  5. Далее определяем, оставлять ли боковые стены и строить ли новые, как в пункте 2, и повторяем алгоритм до тех пор, пока не создадим m строк.
  6. Для последней строки соединим множества всех ячеек, которые не имеют общего подмножества и уберём стены. Ячейки, которые имеют такое подмножество наоборот разделим стеной.

Как поиграть?

Для того, чтобы поиграть следует скачать папку bin на свой компьютер и запустить файл Kursachhhh.exe

Видео

Постмотреть видео игры можно здесь

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages