Генерация Уровней

Какая потайная мечта любого игрового разработчика — что бы вы думали? Сделать супер хит и заработать много-много денег!?... А вот и не угадали!

На самом деле, в глубине души, каждый игровой разработчик мечтает сделать «генератор игр» — инструмент, позволяющий задать ключевые параметры для будущей игры и золотую кнопку для активации магии: «Сгенерировать игру»! Если вы игровой разработчик и у вас еще не возникало подобной мысли, не отчаивайтесь — у вас все еще впереди!

А мне уже давно приходят похожие мысли. Ведь это так здорово, когда игра хотя бы частично может генерировать какой-то интересный контент внутри себя. Каждый раз новый уровень, неожиданные повороты в расстановке игровых объектов, враги на новых позициях… ну ведь круто же! И главное не нужно рисовать бесконечное количество уровней своими мозолистыми ручками. Эх… Только когда дело доходит до реализации даже маленькой автоматически генерируемой части — оказывается, что все не так просто. И те места, которые я пытался построить на автоматическом генерировании, либо работали плохо, либо их приходилось максимально дорабатывать в ручном режиме.

В общем, я все это к тому, что я уже давно мечтаю поковыряться с полноценной генерацией. А в самом начале разработки нового Зомботрона я даже думал, что буду использовать генерацию уровней для создания черновиков уровней, которые можно было бы уже дорабатывать руками. Но, до реализации такого инструмента у меня так и не дошло. Тогда, может быть, генерацию уровней применить в своих будущих играх?

 

Одна из первых реализаций на основе информации которую я нашел: на карте выбирается случайный пиксель и для него выбирается случайный тип из нескольких: `горы`, `лужайка`, `песок`, `вода` — вероятность появления каждого типа пикселя (тайла), зависит от того, какие у него соседи. Горы могут появится, если вокруг нет воды, песок появляется только рядом с водой и землей, вода появляется рядом с водой и песком. Достаточно простой и бестолковый алгоритм. Чем дольше выполняется генерация, тем больше вероятности получить сплошную воду. Постройки установлены в ручную для примера и не участвуют в генерации.

Вызов принят! Я решил абстрагироваться от конкретных идей и просто поковыряться с генерацией. Так, в начале лета я начал изучать этот вопрос и пытаться разработать генератор ландшафтов, который бы из заданных тайлов мог собирать что-то осмысленное.

Изобретать велосипед с нуля я не решился и приступил к поиску необходимой информации. Я познакомился с алгоритмом Wave Collapse Function и нашел еще кучу других интересных материалов, например для генерации подземелий или катакомб. Это небольшой списочек самого интересного:

 

 

Вторая реализация: на входе есть заданный набор тайлов 3x3 пикселя, появление каждого из которых задано таблицами вероятности сгенерированными автоматически, исходя из совместимости тайлов (проверяется каждая грань тайла на совместимость с гранями всех других тайлов). То есть, в теории должны подбираться исключительно подходящие друг-другу тайлы. Но если набор тайлов сложный, то могут устанавливаться неподходящие друг-другу тайлы (отмечаются красным при генерации) — обусловлено это тем, что для конкретного места нет подходящего тайла вообще. После завершения генерации проводится поиск ошибок. Ошибочные области удаляются с запасом и регенерируются снова до тех пор, пока ошибок не будет совсем. Для простых тайлсетов, где большинство тайлов друг с другом стыкуются — очень высокая вероятность безошибочной генерации.

Все выглядит здорово! Но есть одна проблема: когда игрок бегает по уровням сделанным вручную — он всегда что-то ищет, думает о том, что где-то обязательно может быть какая-то нычка, которая была оставлена разработчиком. Но когда ты изучаешь уровни, сделанные генератором уровней — ты быстро понимаешь, что все они строятся по какому-то базовому алгоритму, и вероятность найти что-то уникальное и забавное скорее стремится к нулю. В конце концов ты начинаешь видеть повторяющиеся паттерны из уровня в уровень и такая игра начинает казаться однообразной. Например, такая проблема преследует Minecraft — можно бесконечно исследовать его бесконечный мир, но вы никогда не найдете там что-то уникальное. Да, возможно в определенных местах генератор выдаст интересный ландшафт, но не более того. Как глубоко вы бы не углублялись в его мир, он будет повторяться в той или иной степени как под землей, так и наверху, потому что мир строится, следуя строго заданным правилам и все! Вам никогда не найти деревню с уникальными домами, не найти город с жителями или морской порт и т.п.

 

Переработанная реализация предыдущего алгоритма. Идея заключается в том, что при возникновении конфликтов, алгоритм приостанавливает свою работу и занимается исправлением ошибок до тех пор, пока их не устранит, после чего продолжает генерацию мира. Мне показалось, что так работает быстрее. Хотя порой он умудряется уходить в «самокопание».

Конечно, генерация уровней имеет право на жизнь в играх. Ведь тут все очень сильно зависит непосредственно от самих игр. Если генератор уровней создает просто некоторый фундамент, на котором будет потом разворачиваться игра и эту игру будет по большей части генерировать игрок или события, которые с ним будут происходить — это будет интересно!

 

Бесконечно можно смотреть на три вещи: как горит огонь, как течет вода и как генерируются подземелья! ^__^

То есть, если вы приходите в Minecraft не ради исследований его игрового мира, а ради выживания или ради создания какой-то своей истории в мире Minecraft — то сгенерированный и доработанный руками ландшафт быстрее позволяет вам получить то, чего вы хотите.

Ковыряясь со своей реализацией ландшафтов, я ожидал получить что-нибудь непредсказуемое. Но чего ждать от глупой машины, которая генерирует ландшафт, следуя лишь моим инструкциям и правилам!? Правильно! Случайный набор узоров, но не более того...

 

Еще чуть более доработанная версия предыдущего алгоритма с параметрами карты большего размера и иным набором тайлов. Да, бывает и так, что случается безошибочная генерация!

Каждый раз, читая новости об очередных достижениях какой-нибудь нейронной сети, я задумываюсь о том, что вот, еще чуть-чуть и у нас будет достаточно ресурсов, чтобы создать ту самую золотую кнопку «Сделать офигенную игру!». И тогда мы будем покупать уже не игры по подписке, а доступ к таким генераторам и исходя из своих фантазий и запросов делать заказ на игру своей мечты… А профессия «разработчик игр» станет пережитком прошлого.

 

Тот случай, когда алгоритму что-то не понравилось и «он» ударился в «творчество». Ошибочные тайлы отображаются оранжевыми клеточками, так как в данном наборе слишком много цветов для тайлов и сложно инверсировать их цвета на лету.

Ну, а пока у меня получилось что-то такое вот непонятное, как на гифках к этой записи, и я пока не знаю, что с этим делать. Может быть сделать «выживалку», где вы будете создавать свою «игру», пытаясь выжить!?


Индикаторы: Разработка
Постоянная ссылка