СПОСОБЫ ГЕНЕРАЦИИ ЛАБИРИНТОВ В ИНДУСТРИИ КОМПЬЮТЕРНЫХ ИГР
12 3
Володченко В.С. , Ланцова Д.С. , Миронова Т.А.
1Володченко Виктория Сергеевна - студент;
Ланцова Дарья Сергеевна - студент; Миронова Татьяна Алексеевна - студент, кафедра сервиса, факультет технологии,
предпринимательства и сервиса, Орловский государственный университет им. И.С. Тургенева, г. Орёл
Аннотация: за последние несколько лет для игроков компьютерных игр стало более актуально понятие случайных событий игрового процесса. В данной статье рассматриваются различные алгоритмы создания лабиринтов в сфере компьютерных игр. Ключевые слова: компьютерные игры, лабиринт, алгоритмы, генерация лабиринтов, алгоритм Эллера, рекурсивный метод.
Разработка программного обеспечения в индустрии компьютерных игр, является на сегодняшний день одним из перспективных и высокооплачиваемых направлений в сфере ИТ.
За последние несколько лет для игроков компьютерных игр стало более актуально понятие случайных событий игрового процесса. Непредсказуемость сюжетной линии, случайно сгенерированная местность дает игроку возможность ощутить все разнообразие, которое в игру заложили разработчики, тем самым создавая интерес и побуждая игрока пройти игру более одного раза.
Довольно ярким примером данного рода игр является программа «Лабиринт».
Существуют различные способы генерации лабиринтов.
- Рекурсивный метод (алгоритм случайного прохода)
Для генерации лабиринта можно использовать простейшее построение случайного прохода, с использованием дополнительных построений таких же случайных ходов, продолжающееся до тех пор, пока не будет заполнено все пространство, выделяемое под лабиринт.
Если размерность генерируемого лабиринта небольшая, то можно использовать метод рекурсий. Устанавливаем точку входа. Сначала необходимо сгенерировать основной ход. Движемся по клеткам, "пробивая" "ходы", случайно изменяя вектор движения (по или против часовой стрелки). При движении необходимо делать проверку касания края лабиринта (если найдено касание, то ставим выход). На каждом шаге алгоритма необходимо запоминать координаты «пробитой точки» и увеличивать глубину рекурсии до достижения края лабиринта.
Когда край лабиринта достигнут, начинаем понижение глубины рекурсии (возвращаемся к начальной точки) с восстановлением координат предыдущей «пробитой точки», и в зависимости от случайности по тому же алгоритму генерируем боковой ход. При генерации боковых ходов завершением процесса можно сделать ограничение глубины рекурсии.
По окончании генерации бокового хода, понижаем глубину рекурсии основного хода, восстанавливаем предыдущие координаты, и рассчитываем вероятность создания нового бокового хода.
Недостатком любого рекурсивного метода считается объем памяти, который потребуется для выполнения необходимой глубины. Поэтому использовать данный метод генерации не рекомендуются для больших пространств лабиринта.
- Генерация лабиринта основанного на таблице
Идея заключается в том, что поле изначально разбивается на прямоугольные «большие» клетки (т.е. не элементарные клетки игрового поля, а прямоугольники, состоящие из нескольких клеток), образуя таким образом таблицу. Далее в каждой такой ячейке случайным образом появляется комната случайного размера, не превосходящая размеров ячейки —
тем самым возможность появления пересекающихся помещений пропадает. Затем комнаты объединяются коридорами, например, тем же способом.
- Генерация лабиринта с использованием клеточного автомата
Суть предложенного алгоритма состоит в реализации всего двух шагов: сначала все поле заполняется случайным образом стенами — т.е. для каждой клетки случайным образом определяется, будет ли она свободной или непроходимой — а затем несколько раз происходит обновление состояния карты в соответствии с условиями, похожими на условия рождения/смерти в «Жизни».
- Использование алгоритма Эллера для генерации лабиринтов
Алгоритм Эллера позволяет создавать лабиринты, имеющие только один путь между двумя точками. Сам по себе алгоритм достаточно быстр и использует память эффективнее, чем другие популярные алгоритмы, требуя памяти пропорционально числу строк. Это позволяет создавать лабиринты большого размера при ограниченных размерах памяти.
Алгоритм генерации лабиринта заключается в выполнении следующих инструкций:
- создается новая строка из пустых ячеек. Каждая ячейка не принадлежит не одному множеству;
- присваивается ячейкам, не входящим во множество, свое уникальное множество.
- случайно создаются правые границы для ячеек строки (движение происходит слева направо);
- если границы не создаются, то текущая ячейка и ячейка справа объединяются в одно множество;
- случайно создаются нижние границы для ячеек строки (движение происходит слева направо). Необходимо убедиться, что каждое множество имеет хотя бы одну ячейку без нижней границы (для предотвращения изолирования областей). Если ячейка в своем множестве одна, то граница снизу не создается.
- если было принято решение, что будет добавляться еще одна строка, то необходимо скопировать текущую строку в новую, удалить все правые границы, удалить ячейки с нижней границей из их множеств, удалить все нижние границы и начать выполнение алгоритма сначала;
- если же было принято закончить лабиринт, то необходимо добавить нижнюю границу к каждой ячейке. Двигаясь слева направо: Если текущая ячейка и ячейка справа разных множеств, то необходимо удалить правую границу и объединить множества текущей ячейки и ячейки справа. Вывести завершающую строку.
Список литературы
1. Вирт Н. Алгоритмы и структуры данных. [Текст] / Н. Вирт. М.: Невский Диалект, 2010.
2. Голицына О.Л. Основы алгоритмизации и программирования: учеб. пособие. [Текст] / О.Л. Голицына, И.И. Попов. 3-е изд., перераб. и доп. М.: ФОРУМ, 2015.