Процедурная генерация в играх: что это такое и зачем она нужна

Развитие как путь к спасению. интервью с разработчиками стратегии will&reason. часть 1

Истоки концепции

— Артём, ты упомянул, что тебе нравится «Цивилизация», но при задумке 4Х-стратегии ты явно не стремился создать очередной клон. Что новое ты хотел привнести в жанр?

Артём Копыл: Я большой любитель фильмов и книг, посвящённых фэнтези-тематике. Какое-то время даже увлекался исторической реконструкцией и ролевыми играми. Поэтому меня интересовала разработка проекта с уникальной вселенной. При этом, несмотря на наличие классических фэнтези-элементов, хотелось каких-то новых изобретений и технологий в рамках фэнтезийного мира, которые часто встречаются в литературе и кинематографе. Таким образом, систематизировав контент из книг и разных фэнтези-вселенных, мы собрали некий конструктор. С ним пользователь мог отыграть различные ситуации, которые ещё не встречал в играх, но о которых наверняка задумывался.


Фильм «Хроники хищных городов» вдохновил разработчиков на создание похожих технологий в Will&Reason. Кадр: фильм «Хроники хищных городов»

— Почему ты начал не с проработки мира и сеттинга Will&Reason, а с редактора карт? Техническая основа в данном случае важнее?

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

— Уникальность каждого жителя мира была уже на раннем этапе разработки?

Первая попытка. Печальная.

Но, забегая вперед, скажу, что это привело лишь к убогой фрактализации всего. И это было отвратительно.

Я взял за основу один из многочисленных алгоритмов данжен-генератора. Смысла его описывать здесь не вижу, их много, и я взял тот, который уже был написан на С#, и мне оставалось лишь незначительно переписать его под Юнити-варимый вариант.

Я планировал так.  Первый проход алгоритма — глобальный генератор — создает макро-уровень, где каждый элемент массива — зона 100х100 юнитов (префаб). 1 — зона, заполненная «зданием», 0 — пустая зона улицы. Далее, каждая зона «здания» внутри себя запускает свой генератор, который расставляет зоны поменьше (допустим 20х20), но с другими префабами, которые представляли собой либо комнаты (1), либо проходы без стен (0). Помимо всего прочего, каждый префаб комнат и проходов тоже мог содержать в себе генератор пропсов, но уже без особых алгоритмов.

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

Я отчаялся. Отчаялся и начал думать…

2 Valheim

Вальхейм— это игра на выживание и исследование, вдохновленная скандинавской мифологией, в которой прекрасно используется процедурная генерация. Прежде всего, несмотря на огромный мир и потрясающий внешний вид с уникальным художественным стилем, игра занимает всего около 1 ГБ дискового пространства, что идеально подходит для геймеров с ограниченным пространством.

Во-вторых, каждый раз, когда начинается новая игра, генерируется совершенно случайная карта с разбросанными по ней все более сложными биомами Вальхейма. Это означает, что игроки должны исследовать мир естественным образом, а радость от нахождения идеального места для базы или открытия нового ресурса, который изменит правила игры, впоследствии приносит все большее удовлетворение. Именно по этим причинам игрокам рекомендуется играть вслепую и избегать спойлеров к игре.

Алгоритм 1: случайность

Наш первый генератор уровней очень прост — он полностью случаен. У каждой карты есть тайл начала с левого края и тайл выхода с правого края. Все другие тайлы карты имеют вероятность 33% быть пустыми, 33% — быть занятыми, и 33% — быть бонусным блоком.

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

Подсказка: можете ли вы придумать уровень, находящийся в пространстве возможностей, но не в пространстве генерации? Можете ли вы придумать уровень, который этот генератор не может создать?

Правильный ответ заключается в том, что пространство генерации этого генератора одинаково с пространством возможностей. Любой тайл на карте может принимать любое значение, поэтому любой уровень, который мы можем представить, находится в пространстве генерации. Самые увлекательные, самые интересные уровни находятся в этом пространстве генерации, даже карта, на которой бонусными блоками написано SUPER MARIO IS AWESOME. К сожалению, пространство генерации настолько велико, что нахождение хорошего уровня чрезвычайно маловероятно. Как можно убедиться, понажимав на генератор, большинство уровней — это просто мусор.

Базовая генерация в JS

Наиболее простой способ получить random-число — это хорошо известный метод Math.random(), который встроен в JavaScript.

Пример вывода:

На практике метод Math.random() всегда осуществляет возврат числа с плавающей точкой в диапазоне между 0 и 1. Технически, это число может быть и нулем, однако оно точно никогда не будет равно 1.

Так как метод очень популярен в использовании, его нередко помещают внутрь функции:

Основной недостаток вышесказанного — функция будет создавать рандомное значение лишь в пределах весьма ограниченного диапазона. Но это не значит, что других путей генерации не существует.

Генерация между числами: максимальные и минимальные значения (max, min)

Для добавления данной функциональности без математики не обойтись.

Также никто не мешает сгенерировать рандомное целое число в диапазоне, включая максимальное и минимальное.

Как учатся нейросети

В обычном программировании всё стабильно: мы пишем программе инструкции, а она по ним выдаёт какой-то результат. Например, можно прописать, как считать время поездки в метро, и она будет делать это всегда одинаково — по заранее заданному алгоритму.

Нейросеть работает по-другому: она не программируется в классическом смысле, а обучается. Выглядит это так: мы даём ей задачу на входе, а на выходе — готовое решение. А алгоритмы и инструкции она учится писать сама, постоянно сверяясь с ответом. Идея в том, чтобы дать нейросети достаточное количество попыток, и рано или поздно она выдаст нужный результат.

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

Вот как выглядит мини-датасет на примере Ракеты из «Стражей Галактики»:

Текстовое описание

Енот Ракета из фильма «Стражи Галактики»

Картинка

Файл: rocket.jpg

Цвет: коричневый

Разрешение: 1920 × 1080

Животное: енот

А вот как нейронка учится в этом случае:

  • Получает пару «текст + картинка» из датасета. К этому шагу нейросеть подходит со случайными весами — то есть незаданными связями между нейронами.
  • Делает предсказание. Так как веса случайные, сначала оценка будет неточной. Например, она назовёт енота Ракету фарфоровой вазой.
  • Вычисляет ошибку. Смотрит на готовую картинку и подпись, а потом определяет, насколько точно она установила связь.
  • Корректирует ошибку и обновляет веса. Усиливает связи между теми нейронами, которые помогут ей распознавать енота. За это отвечает метод обратного распространения ошибки.
  • Повторяет эти шаги до тех пор, пока не научится угадывать правильно. Такие попытки называются эпохами обучения.

В результате мы получаем идеальный алгоритм, который способен увидеть связь между картинкой и текстом. Если развернуть его в обратную сторону, как раз и получится генератор изображений по запросу.

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

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

Процедурная генерация как игровая философия

Как правило, мы ассоциируем процедурную генерацию с конкретными жанрами. Например, с «рогаликами» (англ. roguelike), где геймплей строится на том, что вы будете пробовать, умирать и начинать заново. Следовательно, уровни всякий раз тоже генерируются заново — чтобы не надоесть игроку и не дать ему пройти игру на мышечной памяти.

Жанр развился из данжен-кроулеров (англ. dungeon crawler) — игр про блуждания в подземельях. У них уже были все приметы roguelike — скажем, пошаговый геймплей (то есть одна команда соответствует одному действию и ходу) и «перманентная смерть». Классические «рогалики» вроде Rogue 1980-го (её именем жанр и назвали) или NetHack 1987-го только добавили к нему процедурную генерацию подземелий, чтобы повысить реиграбельность.

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

Сегодня roguelike запросто комбинируют с другими жанрами: с платформерами — в Spelunky и Rogue Legacy, с RPG — в Diablo, со стратегиями — в FTL: Faster Than Light. Или просто создают привычные, казалось бы, «рогалики» про условные подземелья, но с динамичным геймплеем — как в The Binding of Isaac и Hades. И во всех этих играх в том или ином виде применяется процедурная генерация — уровней, экипировки, оружия, врагов и так далее.


Hades

Или вот «песочницы», где процедурная генерация служит всему подряд, вплоть до нарратива.

Так, Dwarf Fortress перед началом каждой новой игры генерирует не только мир, но и сотни лет его истории. А RimWorld поручает игроку жизни трёх процедурно созданных астронавтов, чей корабль разбился на планете, также появившейся в ходе процедурной генерации.


RimWorld

Вдобавок игра предлагает на выбор трёх «рассказчиков» — это своего рода «генераторы» истории, каждый со своим стилем повествования. Кассандра строит рассказ по канонам приключенческих повестей, Фиби время от времени даёт время на передышку, а Рэнди кидает игрока в пучины хаоса. Всё для того, чтобы превратить каждое прохождение в уникальный опыт.

Здесь ваши герои могут погибнуть от холода в тундре. Ядерная зима уничтожит весь ваш урожай. Один из колонистов сойдёт с ума и перебьёт остальных. Или это сделают агрессивные аборигены. В RimWorld такие моменты — сплошь и рядом, но воспринимаются не как наказание за ошибки, а как истории, которые вы будете рассказывать друзьям.

No Man’s Sky и вовсе использует процедурное звуковое сопровождение. У игры, конечно, есть альбом с саундтреком, записанный группой 65daysofstatic, и треки из него играют в ключевые моменты сюжетной кампании: например, первая стыковка с космической станцией происходит под крещендо песни «Asimov».

Впрочем, большую часть времени игрок слышит не композиции целиком, а лишь их фрагменты, пересобранные звуковым движком No Man’s Sky. Алгоритм берёт звуки из библиотеки сэмплов, созданных на основе треков 65daysofstatic, и комбинирует их так, чтобы они подходили к моменту. Скажем, прогулки по планете сопровождаются мелодичными клавишными, но как только начинается буря, их сменяет резкий электронный шум.

Похожий приём использовала студия id Software при разработке Doom 2016 года. Саундтрек для игры написал австралийский композитор Мик Гордон — официальный OST в этом случае тоже разделён на множество заранее записанных и грамотно сведённых композиций.

В самой Doom, впрочем, различные треки часто комбинируются между собой: если вне боя на фоне звучит ненавязчивый эмбиент, подкреплённый звуками игры, то во время сражений с чертями играет что-нибудь заметно крайне «тяжёлое». А что именно — зависит и от локации, и от демонов на ней.

Требования к уровням

  • содержать один основной маршрут
  • содержать 1–3 тупиковых пути для целей и собирания добычи
  • содержать 1–3 коротких пути, используемых как альтернативные маршруты
  • генерировать случайные объекты оформления в каждом фрагменте уровня
  • генерировать врагов на основании «графика темпа»
  • генерировать разные типы и уровни врагов на основании сложности миссии
  • работать с системой NavMesh Unity
  • быть детерминированным и генерировать абсолютно одинаковые уровни для совместной игры по сети

Самым сложным было соблюсти все условия, создав при этом целостные и интересные уровни. Как нам удалось этого достичь? Если представить готовый уровень с его структурой, тайниками, темпом и целями миссий, то сложно понять, как создать всё это процедурно. Я решил, что проще будет разбить уровень на слои. Надо воспринимать процедурный уровень как создаваемый в несколько проходов, каждый из которых добавляет уровню новый слой сложности. Логично, что можно начать процесс с базового уровня. В нашем случае это структура (маршрут) уровня.

Начнём

Большинство алгоритмов, которые вы можете найти (например, тут и там), предусматривают создание «идеальных», плотных лабиринтов; то есть тех, которые имеют только один правильный путь и не имеют петель. Они очень похожи на те, которые вы найдете в разделе головоломки из газеты.

Тем не менее, большинство игр интереснее проходить с лабиринтами, которые являются несовершенными, с петлевыми дорожками, и разреженными, сделанными из открытых пространств вместо узких извилистых коридоров.

Это особенно верно для жанра, похожего на ролевые игры, где процедурные уровни не столько «лабиринты», сколько подземелья. Например Terraria или Don’t Starve

В этом уроке вы собираетесь реализовать один из самых простых алгоритмов лабиринта, описанных здесь. Причиной такого выбора является простое добавление лабиринтов в игру с наименьшими усилиями. Этот простой и проверенный подход , который отлично подойдёт для классических игр по вышеуказанной ссылке, поэтому вы будете использовать тот же алгоритм для создания лабиринтов в игре под названием Speedy Treasure Thief.

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

Для начала создайте новый пустой проект в Unity.

Теперь загрузите стартовый пакет, разархивируйте его и импортируйте ** proc-mazes-starter.unitypackage ** в ваш новый проект.

Стартовый пакет включает в себя следующее:

  1. Папка Graphics, которая содержит все изображения, необходимые для игры.
  2. Сама сцена, которая является начальной сценой для этого урока и содержит плеер и пользовательский интерфейс.
  3. Папка с именем Scripts, которая содержит два вспомогательных сценария. Остальное вы напишете в этом уроке.

Этого достаточно, чтобы начать. Вы подробно остановитесь на каждой из этих областей чуть позже.

Скука болотная

Напомним, процедурная генерация – это автоматическое создание уровней, предметов, квестов и персонажей случайным путем при помощи заранее прописанного алгоритма.

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

В противовес ему высказался один из разработчиков Lost Planet 3 и Far Cry 4 Марк Маретеа. Он утверждает, что отсутствие генерации делает игру менее «живой». Он, как и многие игроки не любит, когда игра заскриптована на все 100%. Часто возникает неприязнь к подобному проекту, когда, например, оказывается, что открытый мир на самом деле линейный, а побочные квесты и «исследование» встроены в нее искусственно.

Точнее высказался художник Эндрю Бишоп, и мы поддерживаем его мнение. Он говорит, что она просто должна быть применена к месту. Например, генератор случайных карт в стратегии Age of Empires – вполне уместна вещь. Хуже, когда процедурную генерацию в играх вставляют туда, куда не следует. Пример таких неудачных практик –Spore и No Man’s Sky. В них все выглядит по-разному, но геймплейные особенности остаются одинаковыми и предсказуемыми.

Остановимся на Spore. Геймплей основывается на выживании, а и эволюция – это базовая механика. Когда вы находитесь на стадии первобытного существа то, например, можете встретить разных хищников. Одни могут быть с большим туловищем, огромным хвостом и пастью с вашу голову, вторые могут быть меньше вас, но при своих кардинальных различиях во внешнем, случайно сгенерированном виде – они будут атаковать вас одинаково, с одной и той же силой, в зависимости от типа их клыков или лап.

Борьба с рутиной

Трэвис Аддер, в прошлом разработчик игр для Storm 8 и Super Evil MegeCorp считает, что процедурная генерация как таковая не несет в себе ничего плохого. Создатели уровней просто должны меньше полагаться на нее во время проработки игры, не перекладывать основную работу на алгоритм. А так, она позволяет убрать из работы большой пласт рутины.

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

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

Есть в разработке вещи, которые можно доверить алгоритму, а некоторые просто нельзя генерировать. В пример этой гипотезы инди-разработчится Кэтрис Макклауд вспоминает «клоны Mega Man», в которых были искусственно сгенерированы улучшения для персонажа, выпадающие из врагов. Подобное обесценивает всю битву, так как вы тратите много сил, а можете получить незначительную награду. Нечто похожее было недавно с Anthem.

Некоторые элементы просто не работают, если они сгенерированы случайно, могут мешать целым жанрам. Но в особых случаях – расширяют их. По мнению разработчика Эдварда Хьюза, в какой-нибудь бы SteamWorld Dig генерация помогала бы сохранить интерес к перепрохождению игры во второй раз. А вот Hollow Knight – она бы испортила, ведь там окружение рассказывает историю, и случайная генерация в построении подземелья просто невозможна.

Конкретно проблема есть в Bloodborne – игра прекрасная, но процедурно генерируемые подземелья сводят все на нет. Ты начинаешь предсказывать, откуда появятся монстры. Атмосфера неизвестности так и таит на глазах.

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

Создание карт

— Поговорим о процедурной генерации ландшафта в Will&Reason. Как она влияет на геймплей, респаун, карту и так далее?

Артём Копыл: Это не инновация для игр такого плана. Если посмотреть на «Цивилизацию» или другую подобную стратегию — там обязательно есть процедурная генерация в том или ином виде. В таких играх важна реиграбельность, чтобы во время каждой партии у игрока было ощущение нового мира. В противном случае ему наскучит геймплей после первых двух игр на одинаковой карте. Поэтому процедурная генерация важна. Более того, у нас есть и бесконечный мир, который мы не используем на данный момент, но технически он реализован.

Эта девятиминутная демонстрация с генерацией ландшафта заинтересовала народ, потому что выглядит достаточно амбициозно. Когда-нибудь мы добавим эту бесконечность в игру. Если говорить конкретно о процедурной генерации, то в начале кампании у нас создаётся уникальная карта с процедурно расставленными горами, холмами, реками. Также в разных местах генерируются деревни — базовые племенные поселения для завоевания. Осматривая эти места, игрок ориентируется на ресурсы, расположенные рядом с ней, и на поселенцев: у каждого народа есть определённые особенности и характер. Эти опции тоже процедурно генерируются. Есть характер, профессия, дающая определённые бонусы, различные способы поклонения богам. Проанализировав все эти факторы, игрок поселяется в той деревне, где ему выгоднее. После того как он выполнит квест, деревня присоединяется к нему и становится основой первой фракции.


Разработка новой системы рек. Скриншот: игра Will&Reason

— У процедурной генерации есть обратная сторона, когда в результате возникают нелепые баги. Вы часто сталкиваетесь с такими проблемами?

Артём Копыл: Да, у нас есть огромная папка со скринами подобных багов, накопившихся за годы разработки. Естественно, мы всё это исправляем. Мне кажется, что в стратегиях такие изъяны влияют на игру меньше. Вот чего по-настоящему сложно добиться — правдоподобной карты. Если мы успеем всё исправить, вряд ли на релизе будут баги, когда берег резко превращается в какую-нибудь сушу. Но могут остаться проблемы в плане ограничения игрока в передвижении, как, например, это случается с круговыми грядами гор. Кстати, я часто сталкивался с этим в Civilization. Как вариант, игра на старте может закинуть фракцию на земли без ресурсов. Такое тоже бывает. Но всё зависит именно от количества времени, которое мы потратим на эти исправления. Нет ничего такого, что нам не по силам починить.

Рассуждения идеолога Camelot Unchained

Гордость за сервер — одна из важнейших и самых сложных целей, на мой взгляд. Почему вообще игроки должны испытывать гордость за свой сервер, если это, фактически, кусок железа, на котором разворачиваются события? Но для тех, кто играл в Dark Age of Camelot, споры о том, на каком сервере самое лучшее сообщество — знакомая ситуация. И эти споры продолжаются до сих пор.

Для меня лично, гордость за сервер — воплощение всего, чего мы хотим достичь при создании Camelot Unchained, потому что это сумма гордости на индивидуальных уровнях обо всем, что есть в игре, плюс гордость за сообщество. 

Игроков не нужно убеждать в необходимости всех видов гордости. Потому что они жили в Dark Age of Camelot и других подобных играх. Это то, что многие MMORPG потеряли со временем, и то, что мы пытаемся возродить в Camelot Unchained.

Starfield и будущее TES

Старфилд также будет использовать процедурную генерацию, которая, вероятно, поможет создать некоторые миры, которые игроки смогут посетить в космической научно-фантастической игре. Это хорошая новость для The Elder Scrolls 6. Это дает Bethesda возможность поэкспериментировать, вдохнуть жизнь в процедурно сгенерированные ландшафты и работать над тем, чтобы взять то, что было создано компьютерами, и придать ему необходимое человеческое прикосновение.

Успехи и неудачи Старфилд, который должен быть выпущен до Старшие свитки 6, — это отличная возможность изучить проблемы нового движка и системы игрового дизайна с более низкой ставкой IP. Старфилд — это первая новая разработка Bethesda за более чем 25 лет, и эксперименты, которые могут позволить, могут стать отличной новостью для Старшие свитки 6 если его успехи будут перенесены.

Размер — это еще не все, и во многих отношениях создание гораздо большей карты представляет собой не только прекрасную возможность, но и вызов. Однако объявление об использовании процедурной генерации означает, что фанаты, вероятно, могут ожидать совсем другого игрового мира, чем тот, который они исследовали в Скайрим еще в 2011 году. Будет ли достаточно изменений, чтобы помочь Старшие свитки 6 подделать свое собственное наследие еще предстоит увидеть.

Алгоритм 2: рисование случайных форм

Наш следующий алгоритм чуть сложнее, и он создаёт уровни, которые больше похоже на то, что можно применить в игре. Начиная с пустого уровня, он выбирает где-нибудь случайную точку, а затем отрисовывает линию или квадрат блоков бонусов или земли. Он выполняет эту операцию 20 раз, создавая несколько фигур, случайным образом отрисовываемых на уровне. Как и раньше, можно нажимать на пример в оригинале статьи, чтобы запускать алгоритм заново и генерировать новый уровень.

Это уже начинает напоминать уровень для платформера, правда? При генерации уровней мысленно представляйте, как играете в них (будьте щедры при необходимости — добавьте способность двойного прыжка, если она необходима, или возможность выпрыгивать за пределы потолка карты).

Сколько уровней нужно сгенерировать, прежде чем вы найдёте хотя бы один, который можно пройти?

Не стремитесь к абсолютной точности в своих мысленных прохождениях, просто сделайте примерную оценку.

Когда я провожу это упражнение с аудиторией, то для нахождения уровня в среднем обычно нужно около 10 попыток. А сколько потребовалось вам? Запомните это число, а теперь посмотрите на вариацию того же генератора, показанную ниже. Генератор тот же, который мы только что видели, но теперь он рисует на уровне не 20, а 10 фигур. Теперь подсчитайте снова: сколько уровней вам нужно сгенерировать, прежде чем вы найдёте тот, который можно пройти?

Вероятно, на поиск играбельного уровня вам понадобилось меньше времени. Давайте приостановимся на минуту и подумаем о различиях между этими двумя генераторами, которые почти идентичны, за исключением небольшой разницы параметров. У какого генератора пространство генерации больше — у генератора с 20 фигурами, или с 10?

Подсказка: подумайте об уровне, созданном генератором с 10 фигурами — сможет ли его создать генератор с 20 фигурами? А потом подумайте про обратный пример.

Правильный ответ заключается в том, что генератор с 20 фигурами имеет большее пространство генерации; на самом деле, он содержит в себе всё пространство генерации генератора с 10 фигурами. Чтобы показать это, представим любой уровень из генератора с 10 фигурами. Наш генератор с 20 фигурами может создать его, случайно отрисовав те же десять фигур, а затем случайно отрисовав их вторично поверх друг друга. Однако никакой уровень с двадцатью отдельными фигурами не может быть отрисован с помощью генератора с 10 фигурами.

Это означает, что генератор с 20 фигурами имеет больше уровней, в том числе и интересных уровней. Но стоит помнить, что найти играбельный уровень было намного легче при генераторе с 10 фигурами

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

Понравилась статья? Поделиться с друзьями:
Curious-eyes
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: