Как сделать игру головоломку
Как создать головоломку в игре — на примере Portal 2
Рассказываем, как создать игру, которая сможет увлечь пользователей, заставляя их хорошенько подумать.
Головоломка (англ. puzzle) — это один из самых сложных жанров — как для игрока, так и для геймдизайнера. Но в то же время он очень интересный и даже полезный — хотя бы потому, что позволяет почувствовать себя умным.
В этой статье мы рассмотрим, из каких этапов состоит хорошая головоломка, на примере Portal 2 и Baba is You.
Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.
4 этапа хорошей головоломки
Решение хорошей головоломки можно разбить на четыре этапа (это только один из вариантов, головоломки — сложная тема). Использование такой структуры поможет вашим игрокам чувствовать себя умными. Для примера я выбрал уровень из Portal 2, который вызвал у меня именно такое ощущение.
Перед тем как вы продолжите чтение, согласно федеральному законодательству, я должен предупредить, что следующая испытательная камера выглядит очень здорово.
Задача
Для начала игрок должен понимать, какая задача перед ним стоит (подробнее в разделе про наглядность).
Загвоздка
Загвоздка состоит в том, что на уровне всего два куба-призмы, которые можно использовать.
Откровение
Вспомнив, что игра называется Portal 2 (англ. Portal — портал), игрок использует портал для одного из лучей.
Но, как вы могли заметить, нужно либо больше порталов, либо больше кубов-призм, потому что понадобится два куба, чтобы направить один луч на приёмник, — и это ловушка. Тот, кто придумал уровень, знал, какое решение вы попробуете применить.
Ловушка
Ловушка становится внезапным ударом под дых игроку, который только что ощутил откровение. И хотя это отличный приём, использовать его в каждом уровне не стоит — это начнёт быстро утомлять игрока.
Советы
Вот несколько советов, которые помогут сделать хорошую головоломку ещё лучше.
Наглядность
Игрок должен понимать, какая перед ним стоит задача. Например, если задача — открыть дверь (как почти во всех испытаниях в Portal), то игрок должен видеть эту дверь и все ключевые элементы.
Вот пример уровня из игры Baba is You:
Мы сразу видим все правила, объекты и условие победы:
Игроку не приходится думать, что нужно сделать, — понятно, что надо добраться до флага. Его задача в том, чтобы догадаться, как это сделать.
Возвращаясь к Portal, можно вспомнить, что все активные объекты с кнопками соединяют пунктирными линиями: синими (не активно) или оранжевыми (активно). Это помогает лучше ориентироваться в текущем состоянии головоломки.
Минимализм
Из предыдущего пункта можно вывести ещё один: головоломка должна быть лаконична. Чем меньше деталей, тем проще их связать между собой и найти решение.
Также не стоит использовать какие-то обманные или скрытые элементы — игроки возненавидят вас, если узнают, что им нужно было три раза присесть возле северной стены в полнолуние, побрив персонажа налысо (если, конечно, предыдущие головоломки не были похожими).
Постепенный ввод механик
Вспомните скриншот из Baba is You в разделе про наглядность. В нём показано достаточно много правил, которые, на первый взгляд, не совсем понятные. Так, например, правило Key is Open можно перевести не как «Ключ открывает», а как «Ключ открыт». И чтобы игрок понял, какой из вариантов правильный, он должен сначала познакомиться с этим правилом.
К счастью, в Baba is You и многих других хороших головоломках механики вводят не сразу. Вот, например, как выглядит первый уровень:
Тут показано всего четыре правила, которые можно быстро проверить, даже если вы понятия не имеете, что это за игра.
Увеличение сложности
Не стоит вводить механики одну за другой. Вместо этого лучше сделать несколько уровней с уже представленными механиками, постепенно повышая сложность. Вот, например, уровень, в котором всего три правила:
Тут нет правила Wall is Stop, поэтому через них можно ходить.
Смотреть
Плей-тесты
Подумайте: не слишком ли решение неочевидно? Подумайте, как бы вы сами попробовали решить эту головоломку, а потом попросите знакомых пройти уровень. Наблюдайте за тем, что они делают и говорят (во время и после прохождения).
Головоломки — этот тот жанр, для которого плей-тестов должно быть очень много.
Создание головоломок. Часть 1: Какие бывают головоломки
Предлагаю вашему вниманию перевод довольно старой статьи Боба Бейтса «Designing the Puzzle» Опубликовано аж в 1997 году… почти 20 лет прошло! Тем не менее, принципы, описанные автором, актуальны и сейчас 🙂 Это первая часть статьи, а еще есть вторая и третья.
Сначала были… головоломки. На заре приключенческих игр сюжеты были довольно схематичными, персонажи — картонными, и игры оценивались в первую очередь по сложности задач, которые ставились перед игроком.
По мере взросления жанра люди стали оценивать игры по качеству сюжета и графики, а не по мастерски придуманным головоломкам. Если же современный покупатель и задумывается о головоломках, то в первую очередь его интересует, насколько они вписываются в сюжет. Не сложны ли они настолько, что игрок не сможет пройти игру? Есть ли в них смысл? Можно ли их решить честно? Интересны ли они?
Как бы то ни было, головоломки все еще лежат в основе приключенческих игр. Хорошие головоломки являются важной частью сценария игры, персонажей и развития сюжета. Хорошие головоломки погружают игрока в выдуманный мир. Наконец, хорошие головоломки делают игру действительно хорошей. Плохие же головоломки не делают ничего из вышеперечисленного. Они только раздражают игрока и мешают ему. Как и плохо написанный текст, они обращают внимание на себя и отвлекают от сюжета, разрушая то впечатление, которое автор пытался создать.
В этой статье мы рассмотрим разные виды головоломок, что отличает хорошие головоломки от плохих, как быть с уровнем сложности и как использовать головоломки для развития сюжета.
Виды головоломок
Искусство создания головоломок заключается в создании оригинального набора задач и их решений, которые подходят к истории, рассказываемой вами. Так или иначе, головоломки можно разделить на несколько категорий, которые важно знать и понимать, когда их можно использовать. Вот некоторые из них.
Использование объекта по его прямому назначению
Это простейшая головоломка. Вы входите в полутемную комнату и видите настенный светильник. Проверяете инвентарь и обнаруживаете лампочку. Затем вкручиваете лампочку в светильник, щелкаете выключателем, и теперь у вас есть свет. Это наиболее простой вид деятельности, которое вы можете предложить игроку.
Необычное использование объекта
Получение пользы от использования вторичных характеристик объектов. Предполагается, что игрок догадается, что предметы могут быть использованы не по прямому назначению. Например, бриллиант обычно вставляют в красивые кольца, но также им можно резать стекло. Свеча может осветить темную комнату, но воск от нее может быть использован, чтобы сделать отпечаток ключа, или же свечой можно сделать пожар, от которого включится сигнализация, или тепло от ее огня поможет проявить тайное послание на кусочке бумаги.
Комбинирование
Иногда вам нужно создать новый предмет из материалов, которые доступны в игре.
Первый вариант такого действия — преобразование одного предмета в другой. Например, если у вас есть расщелина, которую нужно пересечь, и стоящее рядом дерево, вы можете дать игроку топор, чтобы срубить дерево и сделать из него мост.
Второй вариант — комбинируя два или более предмета, игрок может создать что-то абсолютно новое. В примере, который предложил дизайнер Кен Ролстон, вам нужно успокоить ребенка, плачущего в колыбели. Вы берете несколько веточек, связываете их вместе нитью, прикрепляете несколько ярких цветных побрякушек, и вешаете получившуюся карусельку над кроваткой ребенка.
Наиболее частая ошибка с “комбинируемыми” головоломками вот в чем: автор часто предполагает, что игрок придет к именно к тому решению, которое автор запланировал. Возможно, игрок подумает, что ребенок плачет из-за того, что голоден, или замерз, или хочет, чтобы его покачали, или просто взяли на руки? Создание карусельки — это, пожалуй, последний вариант, о котором может подумать игрок. Что нужно сделать автору? Дать игроку нужную информацию, чтобы подтолкнуть к решению. В описываемом примере, мы можем ввести нового персонажа — отца ребенка, который расскажет, что ребенок отдохнул и покушал, но его любимую игрушку — карусельку — забыли дома.
Информация
Головоломки, в которых игрок должен найти недостающий кусочек информации. Это могут быть простые задачи вроде ввода пароля, или сложные вроде подбора либо вычисления правильной последовательности цифр для обезвреживания бомбы.
Криптограммы и другие головоломки со словами. Это подраздел информационных головоломок с конкретным видом информации, которую ищет игрок. Важно, чтобы автор правильно подал подобную головоломку игроку, поскольку они обычно не соотносятся с настроением и сеттингом игры. Один из способов сделать это — представить персонажа, которые требует информацию, как любителя игры в слова. Что касается криптограмм — не стоит делать что-либо сложнее обычной подстановки букв.
Исключенная середина
Один из самых сложных типов головоломок. Сначала создается система причинно-следственных отношений, а затем от игрока требуется догадаться, какое вполне определенное действие вызовет цепочку событий, которая закончится выполнением желаемого действия. В терминах логики: действие A всегда приводит к событию B, а действие C всегда приводит к D. Когда игрок оказывается в ситуации, которая требует D, и находится в месте, где обнаруживает взаимосвязь между B и C, тогда, предположительно, он выполнит действие A.
Подготовка пути
Намек на исключенную середину, который делает ее еще более сложным – требование от игрока создать условие, которое вызовет выполнение события в финальном звене цепочки. Чем длиннее логическая цепочка, и чем больше условий игрок должен создать, тем сложнее головоломка. Будьте осторожны с этим, поскольку это может быстро превратиться в просьбу игрока “прочесть мысли автора” (см. “Признаки плохой головоломки” далее)
Головоломки с людьми
Наиболее интересные головоломки – те, в которых задействованы люди. Это связано с тем, что в процессе их решения игрок неизбежно узнает о персонажах игры, а хорошие персонажи являются основой хороших сюжетов. Такие головоломки обычно представляют собой взаимодействие с человеком, преграждающим вам путь или владеющим нужной вам информацией. Чтобы продвинуться дальше по сюжету, вам нужно найти “ключ” к его желаниям. Если это стражник, то, вероятно, его можно подкупить. Если это шпион, возможно, вы можете поделиться с ним тайной информацией, которую он искал. Если это мегаломаниак, вы можете найти что-то, чтобы потешить его самолюбие. Если это ребенок, вы можете найти для него, например, игрушку.
Головоломки с отложенным эффектом
Это сложный подкласс головоломок, который требует от игрока определить, что он должен сделать действие, которое не произведет немедленного эффекта, но вместо этого вызовет какое-то событие, которое произойдет в определенный момент в будущем. Это еще более сложно, если задействована более чем одна локация.
Последовательности
Это головоломки на определение правильного порядка серии действий. Обычно игроку предоставляется возможность сделать простое действие, чтобы достичь простой цели. Когда он выполняет это действие, внезапно что-то происходит и не дает ему это сделать. Ситуация возвращается на исходную позицию, и игрок должен сделать что-то, чтобы решить возникшую проблему перед тем, как начать последовательность заново. Это может быть довольно сложно.
Логические головоломки
Если мистер Робинсон – зубной врач, а мистер Смит водит коричневый автомобиль, а мистер Джонс открывает дверь только по средам, то вы понимаете, что я имею в виду.
Классические игры
Это не настоящие головоломки в понимании приключенческих игр, но они используются во многих играх. К примеру, “магический квадрат”, “переставь спичку” или “ханойские башни”. Что важно о них помнить – должен быть простой способ “сбросить” их, чтобы игрок мог вернуться к первоначальному состоянию, если он безнадежно запутался. Я также считаю, что они лежат за рамками жанра, и автор должен предоставить либо подсказки, либо альтернативный способ решения головоломки, чтобы не-фанаты вроде меня не застряли.
Загадки
Наименее удовлетворяющий вид головоломок — если игрок не догадался сразу, он не догадается никогда. Если вы собираетесь сделать головоломку-загадку, убедитесь, что оставили множество подсказок в ближайших локациях.
Диалоговые головоломки
Эти головоломки требуют от игрока ведения разговора по верному пути, пока персонаж не скажет или не сделает нужную вещь. Большое преимущество диалоговых головоломок – ничто не раскрывает персонажа полнее, чем разговоры с кем-либо. Большим недостатком является то, что до решения можно добраться, терпеливо перебирая все реплики всех веток диалога. Это как минимум утомительно, и к тому же вызывает чувство паранойи у игрока: “А вдруг я пропустил какой-то важный фрагмент информации из-за того, что не прошел по всем веткам диалога. Наверное мне лучше вернуться и пройти диалог еще раз”. Лучшее решение этой проблемы – не обставлять эту ситуацию как головоломку и построить диалог таким образом, чтобы игрок не мог выйти из него, пока не получит необходимый для дальнейшего прохождения фрагмент информации.
Метод проб и ошибок
Перед игроком есть варианты выбора. Не имея никакой информации о том, что делать дальше, он должен попробовать сделать какое-то действие, обнаружить что это не помогает, и пробовать новые действия, пока одно из них не приведет к результату.
Машинные головоломки
Альтернативные интерфейсы
Это может быть что угодно, от механизмов до географических карт. Вы убираете обычный интерфейс игры и заменяете его экраном, на котором игрок должен выполнять манипуляции, чтобы достичь определенного состояния. Головоломка с охлаждающей жидкостью, описанная выше, предлагает отличную возможность создать для неё альтернативный интерфейс.
Лабиринты
“Вы в лабиринте извивающихся проходов, похожих друг на друга.” Лабиринты были основой приключенческих игр. Они требуют от игрока взять карандаш и бумагу и отмечать локации, обычно сбрасывая предметы из инвентаря. Со временем лабиринты превратились в клише. Сейчас я рекомендую использовать их только в случае, если у вас есть уникальный подход к созданию карты или продвижению через лабиринт.
Понимание происходящего
Иногда головоломка заключается не в выполнении определенного действия, а в узнавании общего состояния. Лучшим примером, который я могу подобрать, является головоломка с солнечными часами в игре Trinity Брайана Мориарти. В начале игры вы стоите перед солнечными часами в Кенсингтон Гарденс. В результате последовательности необыкновенных событий вы оказываетесь в совершенно странном мире. По мере его исследования вы обнаруживаете части мира, погруженные в темноту. Позже эти же части ярко освещены. Спустя какое-то время игрок понимает, что этот новый мир существует на поверхности солнечных часов, и темнота – это тень от гномона, движущаяся вместе с солнцем по мере того, как проходит время.
Процедурная генерация уровней для игр-головоломок
Если вы уже пробовали создать свою игру-головоломку, вы возможно уже поняли, что реализация и кодирование игровых правил довольно просты, однако создание уровней — это сложная и длительная работа. Или даже хуже — вы потратили кучу времени на создание нескольких уровней, пытаясь вставить в них определённые задачи, но когда ваши друзья попробовали поиграть в них, они прошли эти уровни совершенно другим способом или настолько простыми уловками, что вы о них даже не думали.
Здорово было бы найти способ заставить компьютер сэкономить вам время и решить проблемы, о которых я сказал выше… И именно тут на помощь приходит процедурная генерация!
Необходимо сказать, что существует например только один способ для суммирования векторов, и любой программист, которому оно нужно, должен следовать одинаковым правилам; однако в случае процедурной генерации вы абсолютно свободны. Не существует правильных и неправильных способов. Главное — это результат.
Fruit Dating — правила и особенности
Не так давно мы выпустили игру Fruit Dating для устройств iOS (также она доступна для Android и даже для невыпущенного (на момент релиза игры) Tizen). Это игра-головоломка с простыми правилами. Её цель — соединять пары фруктов одного цвета, проводя пальцем по экрану. Перемещение пальца соответствует наклону игрового поля в нужном направлении. Когда игрок пытается выполнить свою задачу, на его пути встают различные препятствия, такие как камни, машины и другие фрукты. Все подвижные объекты перемещаются в одном направлении. На картинках ниже показан первый уровень, в котором для соединения фруктов требуется 3 хода.
Со временем добавляются новые особенности:
Односторонние проходы размещаются на границе плитки и ограничивают направления, в которых можно перемещать объекты. | |
Муравьеды могут смотреть в разных направлениях, но это направление постоянно и не меняется в течение уровня. Когда фрукт находится в направлении взгляда муравьеда, он «стреляет» своим языком и притягивает фрукт к себе. | |
По лужам могут перемещаться камни, машины и бочки, но не фрукты. Когда фрукт попадает в лужу, он становится грязным, и свидание для него отменяется! | |
Спящий ёжик стоит на плитке и просыпается, когда его что-то ударит. Если его ударяет бочка, камень или машина, он снова засыпает, потому что они несъедобны. Но когда об него стукается фрукт, ёжик его съедает. |
Вы наверно уже заметили, что уровень состоит из плиток; это упрощает работу, потому что каждый уровень может быть представлен как маленькая сетка. Её максимальный размер 8×8 плиток, но всегда есть неподвижная граница, так что «полезная» область не больше 6×6 плиток. Этого может показаться мало, но доказано, что для такого поля можно создать достаточно сложные задачи.
На основании базовых правил (так как дополнительные возможности были добавлены позднее) я начал создавать свой генератор. Сначала я конечно подумал, что кто-то в мире уже решил похожую проблему, так что я начал искать в интернете процедурную генерацию уровней головоломок. Оказалось, что этот вопрос рассматривался не очень широко. Я нашёл всего лишь несколько полезных для меня статей. В основном они были посвящены генерированию/решению уровней для Сокобана. Например:
Также было интересно, что большинство из них написаны учёными (профессорами Сокобана :-)). Из этих статей я узнал два принципа: во-первых, при случайной генерации чего-либо хорошо вносить немного симметрии, чтобы люди воспринимали результаты позитивнее. Во-вторых, выбор алгоритма зависит от вас, но ни один из них не идеален.
Инструмент для решения головоломок
Очевидно, что каждый сгенерированный уровень должен проходить тестирование (чтобы понять, можно ли его решить, и насколько сложно это сделать), поэтому сначала я решил создать инструмент для решения уровней. Поскольку на тот момент я учитывал только базовые правила без дополнительных возможностей, у меня возникли следующие идеи для «решателя»:
а) из исходного положения вы можете начать двигаться в любом направлении (влево, вправо, вверх, вниз);
б) из следующего положения можно снова продолжить в любом направлении;
в) в любом положении проверяется соединения фруктов, с поля удаляются совпавшие фрукты и продолжается пункт б), пока на поле не останется несколько фруктов.
Поэтому правила изменились:
а) из текущего положения попробовать двигаться в любом направлении;
б) если состояние на поле изменилось, проверить, новое ли такое состояние, или оно уже было;
в) если состояние новое, сохранить его вместе с глубиной решения (количеством ходов, нужным для попадания в такое состояние);
г) если ранее было такое состояние, и глубина решения была равна или меньше текущей, удалить текущую ветвь. В противном случае заменить старое состояние (потому что мы попали в него через меньшее количество ходов) и продолжить.
Также есть и другие правила, например, проверка совпадения фруктов и прекращение всего процесса при нахождении решения; кроме того, позже возникли другие правила, связанные с дополнительными возможностями, но базовый инструмент для решения я описал. Он быстро обрывает целые ветви без решения. Кроме глубины решения, он также проверяет родительские положения, сохранённые для каждого состояния на поле, так что в конце можно легко напечатать решение. Давайте рассмотрим это на примере первого уровня игры:
Из исходного положения ходы разветвляются на четыре возможных направления. Пометим их как 1-1, 1-2, 1-3, 1-4. Алгоритм всегда стремится переместиться в следующем порядке: вправо, вверх, влево, вниз. Поскольку для дальнейшего изучения сохраняемых состояний нужно применить стек, первое продолжающее состояние передаётся в стек последним (в нашем случае 1-4). Снова первым ходом является сдвиг вправо (2-1) и поскольку это новое состояние, оно записывается в стек. Следующим становится сдвиг вверх, который приводит к состоянию 2-2. Мы уже были в этом состоянии в первой итерации. Поэтому мы применяем правило г) и обрываем эту ветвь — в стек ничего не записывается. Далее идёт попытка хода влево. Он приводит к новому состоянию (2-3) и оно помещается в стек. Последний ход — сдвиг вниз, но в нём нет различия между 1-4 и 2-4, поэтому мы ничего не помещаем в стек (правило б)… нет нового состояния = ничего не делаем). Теперь верхнее состояние стека — это 2-3. Из него мы перемещаемся вправо и попадаем в состояние 3-1, которое равно состоянию 2-1. Но в 2-1 мы были на второй итерации, так что обрываем эту ветвь. Затем мы двигаемся вверх, фрукты оказываются на соседних плитках, и поскольку это была единственная пара, игра завершается.
Алгоритм работает, хотя он может и не найти кратчайший путь. Он просто берёт первое найденное решение. Чтобы исправить это, я сначала ограничил максимальное количество ходов равным 30. Если решение не находится, я считаю уровень непроходимым. Если решение находится, допустим на 15 ходу, я снова запускаю «решатель» с максимальной глубиной решения 14 (15 — 1). Если решение не находится, то 15 — это кратчайший путь. Если решение найдено например на 13 ходу, я запускаю инструмент с максимальной глубиной 12 (13 — 1). Я продолжаю процесс, пока возвращается какое-нибудь решение. Последнее возвращённое решение является кратчайшим решением.
Генератор
Мы создали «решатель», теперь можно переходить к генератору и проверять с его помощью каждую сгенерированную головоломку.
Фаза генерирования состоит из двух частей:
Генерируются случайные параметры, сообщающие, будет ли стена закрашиваться по одной плитке за раз, или по две плитки. В случае двух плиток обеспечивается генерирование случайной симметрии. Она сообщает, где должна располагаться вторая плитка — будет ли она отражена вертикально, горизонтально, повёрнута на 90 градусов или будет комбинация преобразований. В первой сетке на рисунке ниже одновременно закрашивается только одна плитка. Во всех остальных сетках представлены различные примеры случайной симметрии двух плиток:
Количество стен, их длина и направление случайны. Каждая стена начинается со случайной точки на границе. Каждая стена рисуется за одну или несколько итераций. После первой итерации случайно выбирается число между 0 и (длина стены) — 1. Если оно равно нулю, цикл итерации прекращается. Если оно больше нуля, то это число становится длиной следующей части стены. Выбирается случайная точка текущей части стены, направление выбирается случайно, ортогонально к текущей части стены, затем рисуется следующая часть стены. Результат может выглядеть следующим образом (цифрами обозначены итерации):
По картинке видно, что каждая следующая часть стены короче, так что можно быть уверенным, что в какой-то точке стена закончится.
Поскольку все стены начинаются от границы поля, то каждая отдельная плитка была соединена с границей. Для меня это выглядело скучно, поэтому я добавил ещё один этап, на котором генерируются внутренние стены. Внутренние стены не соединены ни с одной имеющейся плиткой. Этап начинается с выбора случайной плитки и проверки того, свободна ли она и плитки в пределах 3×3 от неё. Если это так, то стена БУДЕТ помещена в сетку, и следующая плитка выбирается согласно случайному направлению (это направление случайно выбирается перед тестированием первой плитки). Цикл прерывается, когда условие свободных на 3×3 плиток не выполняется. Обратите внимание на выделенное выше слово «будет». Если вы поместите стену в сетку сразу же и перейдёте к обработке следующей плитки, область в пределах 3×3 никогда не будет свободной, потому что вы только что поместили туда стену. Поэтому я сохраняю все плитки стен во временный массив и одновременно помещаю их в сетку после прекращения цикла.
При генерировании стен некоторые из них могут накладываться друг на друга, и очень вероятно, что создадутся маленькие пространства, или даже исходная область будет разделена на несколько несоединённых областей. Конечно же, мы этого не хотим. Поэтому на следующем этапе я проверяю, какая непрерывная область самая большая, и заполняю остальные стенами.
При этой проверке я прохожу по всей сетке поля и если плитка свободна, я рекурсивно заполняю всю её непрерывную область идентификатором этой области (свободные плитки — это плитки без стены и пока не отмеченные идентификатором области). После этого я снова прохожу по всему полю и считаю плитки с каждым идентификатором области. И наконец, я ещё раз прохожу по всему полю и заполняю все плитки с идентификатором области стенами, за исключением области с самым большим количеством плиток.
Весь процесс генерирования стен можно посмотреть в этой анимации. Здесь показаны генерирование стен и генерирование внутренних стен, а на последнем кадре пустота в правом нижнем углу заполняется на этапе слияния областей:
После завершения генерирования стен можно начать генерировать объекты. Нам нужна хотя бы одна пара фруктов и ноль или более препятствий (представленных в игре камнями, машинами и бочками).
Будет хорошо, если фрукты располагаются в большинстве случае в углах, в концах коридоров и других подобных местах. Иногда может быть интересным поместить их посередине открытой области, но первое более предпочтительно. Чтобы достичь этого, мы добавить вес каждой свободной плитке с точки зрения притягательности расположения на ней фрукта.
Для концов коридоров, окружённых плитками с трёх сторон, я выбрал вес 6 + Random (3). Для плиток в горизонтальных или вертикальных коридорах я выбрал вес 2. Для углов я выбрал вес 3 + Random (3), а для свободных областей — 1.
Исходя из весов очевидно, что наиболее вероятно расположение фруктов в концах коридоров, затем идёт расположение в углах, коридорах и свободных областях. Для каждого сгенерированного уровня веса генерируются только один раз.
Препятствия (камни, машины, бочки) создаются похожим способом, но отличие в том, что их веса отделены от весов фруктов; также существует определённая случайная плотность препятствий, которая указывает количество препятствий в уровне, если они выбраны.
Кстати, с помощью весов можно делать и другие хитрости. Позже я добавил спящего ёжика и муравьеда (их описания приведены в начале статьи). Не имеет смысла помещать их в середине коридора, поэтому для коридоров их вес = 0.
В этой анимации показано расположение на уровне фруктов и препятствий:
Окончательный сгенерированный уровень показан на статичной картинке ниже. Для решения требуется 6 ходов (вправо, вверх, влево, вниз, вправо, вверх). Отлично, через 1-2 минуту после нажатия на кнопку Generate у нас получился интересно выглядящий уровень, прохождение которого возможно через 6 ходов (никто не будет играть в уровни, для прохождения которых нужно 30 ходов!); к тому же, для его поиска нам не пришлось ни капли мучиться. Но… всегда можно сделать чуть-чуть лучше. И с этой точки в нашей статье мы будем пытаться сделать уровни красивее.
Редактор
Генерирование уровней завершилось в предыдущей части. Наш редактор поддерживает drag&drop, так что можно легко перетаскивать объекты, чтобы получить более высокий уровень симметрии. Например, вот так:
После внесения изменений важно повторно протестировать уровень с помощью «решателя». Иногда небольшие изменения могут привести к нерешаемости уровня. В нашем примере изменения повысили количество ходов до решения с шести до семи.
На этом этапе ручной правки подход к процедурной генерации уровней разветвляется. Если вам нужно или хочется применять изменения вручную, генератор уровней послужит вам просто для огромной экономии времени. Если этот этап не требуется и вы думаете, что генерируемые уровни достаточно хороши, то генератор может стать частью вашей окончательной игры. Игроки будут иметь возможность генерировать новые уровни самостоятельно.
Окончательный результат
Процедурная генерация уровней сэкономила нам гигантское количество времени. Несмотря на то, что генератор может создавать и мусор — уровни, которые слишком просто или слишком сложно пройти, уровни, полные препятствий или уродливые уровни — он всё равно сэкономил нам кучу времени. Он также позволил нам выбирать и отбрасывать часть непонравившихся уровней. Если бы мы делали их вручную, это заняло бы месяцы работы. Вот как уровни, сгенерированные в этой статье, выглядят в окончательной игре:
Об авторе: Томас Рыхновски (Tomas Rychnovsky) — инди-разработчик небольших мобильных игр для Android, iOS и Tizen.