Конструктор три в ряд

Обновлено: 28.04.2024

Введение

Игра "Три в ряд" - это головоломка с блоками, в которой нужно передвигать их в игровом поле так, чтобы получились группы по 3 и более блоков, имеющих одинаковые признаки (например, цвет или форму). В большинстве таких игр игроку также предоставляется бонус за группы, составленные из более, чем трех блоков.

Большая часть таких игр является соревновательной по природе и цель игрока в основном сводится к набору наивысшего возможного количества очков перед тем, как его время закончится или выполнится другое условие проигрыша. Примерами игр "Три в ряд" могут служить Pokemon Puzzle League, Bejeweled, и недавний хит Candy Crush Saga.

Игра, которую мы будем делать

Я решил базировать нашу игру "Три в ряд", которую мы будем делать, на игре Pokemon Puzzle League:


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

Здесь дается демонстрация игры, над созданием которой мы будем работать в этих частях самоучителя:

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

Перед тем, как начать

Перед тем, как начать работать с этой частью самоучителя, вам нужно убедиться, что у вас установлена новейшая версия программы Construct 2 (C2). Когда я создавал оригинальную версию этой игры, я использовал версию 122, и если у вас установлена более новая версия программы, то все должно работать, как нужно. Также, если вы никогда еще не работали с программой C2, то вам нужно сначала обратиться к этому руководству в котором дается детальное описание основ пользования программой C2 и создания большинства различных типов объектов.

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

Итак, после того, как вы все подготовили для работы и имеете хорошее понимание программы C2, будем двигаться дальше!

Подготовка проекта

Перед тем, как начать работу над механизмом игры, нам нужно подготовить сам проект. Запустите C2 и следуйте следующим шагам:

И в конце нам нужно создать фон для поля, где будут появляться блоки.

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

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

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

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

Создание квадратного поля из блоков

В финальной версии игры блоки будут постоянно двигаться вверх, а снизу экрана будут выдвигаться новые блоки. Но пока нам нужно настроить базовую механику игры, поэтому мы просто создадим поле из блоков размером 8х8 и остановимся на этом.

Construct 2 Match-3 game tutorial

Также нам нужно сделать еще одну вещь перед созданием первого события: нам нужно создать переменную для объекта Блок (Block), которая указывает, какого он цвета

Создайте новую переменную для объекта Блок (Block), назовите ее Цвет (Color) и оставьте остальные настройки без изменений.

Construct 2 Match-3 game tutorial

Теперь мы создадим наше первое событие. Целью этого события является создание статичного поля из блоков в качестве теста:

Обе эти формулы в основном обозначают одно и то же. Сначала мы добавляем 2 к ширине блока (Block.Width), что создает буфер в 2 пикселя между соседними блоками для избежания ошибок во время определения столкновения. Затем мы умножаем это число на текущее значения индекса цикла "For" (loopIndex) и добавляем это значение к начальной позиции X (SPAWNX) или Y (SPAWNY). Также, мы отнимаем из значения Y, так как в C2 точка 0 на оси Y находится вверху игрового экрана, поэтому, уменьшая значение позиции Y, мы помещаем объект ближе к верху экрана.

Итак, что же выполняет это событие? Оно означает, что когда выполняется цикл по X и Y и значения их возрастают, изменяется позиция появления каждого из блоков, что в результате приводит к созданию квадратного поля из блоков:

Construct 2 Match-3 game tutorial
Construct 2 Match-3 game tutorial
Construct 2 Match-3 game tutorial

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

Вначале каждому блоку нужно придать значение цвета, используя переменную объекта "цвет" ("color"), созданную нами ранее. Для этого добавьте следующее Действие (Action):

Это присвоит блоку случайное (Random) значение цвета (Color) в диапазоне от 1 до 6. (Почему не с 1 до 7 объясненов описании функции Random .)

Ваша функция должна выглядеть так:

Construct 2 Match-3 game tutorial
Construct 2 Match-3 game tutorial
Construct 2 Match-3 game tutorial

Нам также нужно добавить систему, меняющую изображение блока, базируясь на его значении. Для этого мы добавим новую переменную объекта Блок:

Construct 2 Match-3 game tutorial

Теперь добавим новое событие:

В этой формуле сначала мы отнимаем 1 от значения цвета блока, так как это значение начинается с 0, а не с 1. Затем умножаем эту цифру на 3, так как каждый блок имеет 3 кадра анимации. И, наконец, добавляем 1 к этому значению, так как стандартное изображение блока является первым изображением в группе.

Давайте рассмотрим небольшой пример, где блок будет иметь значение цвета равное 4, с целью определить, какой кадр анимации он будет использовать. Сначала отнимем 1 от значения его цвета и получим число 3. Затем умножим его на 3, получив 9. И, наконец, добавим к нему 1, получив число 10. Это значит, что блок со значением цвета, равным 4 будет использовать 10-й кадр в качестве кадра по умолчанию и будет блоком фиолетового цвета с квадратом на нем.

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

Вот небольшая демонстрация того, как наша игра должна выглядеть на текущий момент: (возьми исходник программы здесь):

Щелкните мышкой для запуска демонстрации игры.

Если вы захотите самостоятельно продолжить работу над этой игрой, попробуйте поискать способ смены анимации блока, основываясь на событии "Мышь > Курсор мыши над объектом" ("Mouse > Cursor is over object"). Также вы можете попробовать использовать Поведение "Перетаскивание" ("Drag & Drop" behavior), чтобы манипулировать блоком, и попробуйте решить вопрос о том, что игрок пробует сделать с блоком, когда он начинает его перетаскивать или отпускает его.

Заключение

Спасибо за прочтение этой части самоучителя, где мы подготовили фундамент для нашей игры "Три в ряд". До встречи в следующей его части! Чтобы оставаться в курсе новостей используйте Facebook, Twitter, Google+, RSS или email.

На ресурсе Tonia's blog появилось несколько материалов о том, как создать успешную игру в жанре match-3 — что может понравиться или не понравиться пользователю, как организовать внутриигровые покупки и другие нюансы игровой разработки.

ЦП публикует перевод трёх заметок.

Сегодня я поделюсь с вами своим опытом в разработке пазл-игр жанра «три в ряд», а также различными стратегиями привлечения внимания пользователей.

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


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

Когда я думаю о студиях мобильных игр, первая компания, которая приходит мне на ум это — King. Они по праву могут называться королями match-3, и с этим утверждением трудно не согласиться после ошеломительного успеха Candy Crush Saga.

У меня выработалась привычка ложиться в постель и перед сном играть в Candy Crush пока все жизни не кончатся. А потом были Candy Crush Soda Saga, Diamond Digger Saga, и, наконец, Best Fiends. И да, последняя игрушка была разработана студией Seriously, а не King, но она затягивает не меньше.

Поговорим о деталях

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


Скриншоты представленные выше демонстрируют стартовый экран игры Diamond Digger Saga. Здесь вы видите список уровней, которые сгруппированы в миры. Это очень распространенная практика, и на то есть свои причины.

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

Но если уровни разделить, а разделение будет значить новые и впечатляющие функции, то всё будет совсем по-другому.

Здесь ещё стоит упомянуть о секции «Скоро в игре». Она вызывает у игрока любопытство и раскрывает некоторые детали, но никогда не показывает всего. А как это все выглядит! Яркие и мерцающие облака. Вокруг анимация из светлячков и мерцает текст. Это очень интерактивный способ сказать игроку: «Эй, мы тут приготовили для тебя отличные новые уровни!»

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

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

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

Ходы и бонусы

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

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


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

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

Так как я упомянул игровые ходы, мне следует рассказать о них больше. Прежде всего, никогда не следует недооценивать такие простые вещи как система ходов. Создателям Diamond Digger Saga это очень хорошо известно, и они этим пользуются.

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

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


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

Например, в Diamond Digger Saga сразу после вашего поражения всплывает окно с кнопкой «играть». Как видите, вы можете продолжить игру с пятью дополнительными ходами и бустером «ракета». Если вы решите заплатить 12 золотых слитков, вы точно не проиграете!

А чтобы предложение стало еще более привлекательным, кнопка «Pay & Play» расположена в самом удобном месте, как раз там, где обычно расположены кнопки «Играть» и «Попробовать снова», на которые вы нажимаете, ничего не оплачивая. Это первое место, куда игрок подумал бы нажать, чтобы продолжить игру.

Кнопка расположена прямо в центре (или чуть ниже), и до неё легко дотянуться большим пальцем. Кроме того, чтобы закрыть это всплывающее окно, вам надо нажать гораздо меньший по размеру «X» в правом углу, а этот жест менее привычен и требует некоторых усилий. Дизайн этой кнопки настолько гениален, что я испытываю почти физическую боль, когда удерживаю себя от нажатия этой кнопки.


И последнее, что я хотел сказать об игровых ходах. Есть кое-что хуже, чем ситуация, когда у вас больше нет ходов. Что может быть хуже, скажете вы? Ну, например, проиграть, когда у вас всё ещё есть ходы.

Лично я ненавижу застревать в игре. Посмотрите на скриншоты выше. Они ввергают меня в пучину отчаяния. На первом я уничтожил клубничку внизу экрана, но больше не смог ничего сделать, потому что оставшиеся на вершине экрана элементы являлись либо объектами экрана, либо покрыты слизью.

На втором мне не удалось получить тотем, потому что все на вершине оказалось заблокировано. Я ничего не мог сделать.

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

Постарайтесь избегать в своих играх таких моментов отчаяния, потому что они расстраивают пользователей и внушают им чувство беспомощности, а это не то, что им надо.

Тактильные ощущения, анимации и мягкие внутриигровые покупки

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

Итак, что же еще осталось обсудить?

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

Мы все помним этот слишком низкий голос из игры Candy Crash Saga, который произносит Delicious, Sweet или Divine. Голос очень отличается от остальных, и в этом-то всё и дело. Нужно отличаться, чтобы игроки признали вашу игру. На рынке мобильных игр уже тысячи match-3, поэтому постарайтесь отличиться хоть в чем-нибудь.

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


Людям нравятся распродажи и специальные предложения, пользуйтесь этим. Это может быть День Святого Валентина, Пасха, Хэллоуин или Рождество — не забывайте о своих преданных пользователях. Не только они оценят ваши усилия, вы также можете рассчитывать на появление новых игроков, а это здорово.

Обе игры — Best Fiends и Diamond Digger Saga — преуспели во внутриигровых продажах. Их распродажи стали особенными благодаря собственной ценности и ограниченному временному отрезку.

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

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


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

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

И хотя игра Jetpack Joyride — не пазл (это аркада), в ней есть прекрасный симулятор слотов. Каждый раз, опуская рычаг, я чувствую невероятное волнение. А если мне не везёт, то я всегда могу вложить немного денег. Всё же у вас всегда есть шанс выиграть. А с таким выбором уровень разочарования сводится к минимуму.

Разработчик размещает кнопку «Купить» в правильном месте, а игрок получает свою награду. И все счастливы.

Обратите внимание, на первом скриншоте есть кнопка «Подписаться на Twitter» с ключом. Ну разве не здорово получить что-то реальное за то, что вы читаете кого-то, а не банальное «cпасибо»? Мне кажется, это замечательно.


Помните, я рассказывал про то, как можно застрять? В игре Best Fiends применяется стратегия, которую я называю «разстрять» (unstuck — прим. переводчика). Она заключается в том, что вы всегда можете что-то сделать, чтобы продвинуться дальше по уровням (пригласить в игру друзей или получить дополнительные бонусы открыв коробки), здесь просто не бывает безвыходных ситуаций.

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

Боже, я просто ненавижу это! Почему? Потому что, мне кажется, что все знают, что алмазы используются либо для покупок, либо для улучшения чего-то, не заставляйте меня тратить их в самом начале игры!

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

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

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

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

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

Ну вот и всё. Это не обучающее пособие и не список пунктов, которые на 100% сделают вашу игру успешной. Это просто несколько советов о том как сделать вашу игру в жанре «три в ряд» более привлекательной, и как заставить меня и многих других игроков возвращаться в игру снова и снова.

image

Несколько лет назад на SeishunCon я заново открыл для себя игры match-3. Я играл в Dr. Mario детстве, но такие более соревновательные игры, как Magical Drop, Bust-A-Move и Tokimeki Memorial Taisen Puzzle-Dama, сильно отличаются от неё.

В результате я осознал, как много нейтральных решений связано с созданием игры match-3.

На следующем джеме Ludum Dare я решил поэкспериментировать, но сначала за неделю до этого для разогрева попробовал разработать алгоритм «Тетриса», обнаруживающий и удаляющий линии. Мне очень помог этот туториал Unity Plus. [Прим. пер.: у меня ссылка не открывается. Если вы знаете, как решить проблему, напишите мне, я дополню статью.] Разумеется, алгоритм «Тетриса» для поиска заполненных рядов гораздо проще, чем алгоритм, выискивающий разнообразные сочетания совпадающих тайлов.

Если вы хотите изучить эти примеры кода в контексте, то зайдите в мой репозиторий Ludum Dare 30. (Для бесстыдной саморекламы я снова использовал эту логику для игры Shifty Shapes.)

Два мира



Magical Drop 3 (источник: Kazuya_UK)

Самая мудрёная часть создания игры-головоломки в Unity заключается в том, что игра не живёт в пространстве мира. Во всяком случае, живёт не полностью.

В этом её отличие от других жанров. Платформеры, например, почти полностью живут в игровом мире Unity. Transform игрока сообщает о его положении. Коллайдеры (или, в некоторых случаях, raycast) говорят, находится ли игрок на земле, ударяется ли об потолок или столкнулся с врагом. Даже если вы не используете внутриигровую физику, то всё равно, скорее всего, добавляете силу или указываете скорость Rigidbody, чтобы обеспечить распознавание столкновений без затрат.

Игры-головоломки совсем другие. Если в вашей игре нужно щёлкать мышью, то она наверно получает какие-то координаты в пространстве мира, но их обычно преобразовывают в ячейку сетки, которая полностью живёт в коде. Для этого есть понятная причина: гораздо проще создать логику для такой игры как Tetris или Dr. Mario, когда работаешь не с отдельными пикселями, а с блоками или тайлами.



Блоки «Тетриса» определённо не должны прилипать к стенкам стакана

На самом деле, в своих экспериментах я стремился как можно больше придерживаться пространства мира. Я использовал физику для определения «приземления» тайлов и передавал данные в двухмерный массив только для определения заполнения строки. Это казалось более безопасным: в конце концов, то, что происходит в игровом мире реально. Именно это видит игрок, поэтому если хранить данные тут, то нет риска рассинхронизации, правда?

Я ошибался. Как бы я ни пытался настроить систему, она просто не работала правильно.

Туториал Unity Plus, ссылку на который я дал выше, оказал мне огромную помощь. Как минимум, он показал, что правильным подходом был полный перенос логики из игрового мира в абстрактную структуру данных. Если вы ещё этого не сделали, то хотя бы вкратце просмотрите его, потому что в этой статье я расширю логику «Тетриса» до логики match-3.

Преобразование из поля в пространство мира

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




Тайлы в сетке

Заметьте, что в этом случае TileSize является константой, определяющей размер тайла в единицах Unity. Я использую тайлы размером 64×64 пикселя, а спрайт в Unity имеет разрешение 100 пикселей на единицу, поэтому TileSize оказывается равным 0.64. Также я использую постоянное смещение, чтобы середина поля 7×7 находилась в координатах 0,0 пространства мира, а левый нижний угол являлся тайлом 0, 0 в игровом пространстве.

Также я создал массив, определяющий игровое поле как статичное поле (static field) в классе Board. (Board сначала был статичным классом, а потом превратился в синглтон (singleton), потому что мне нужно было изменять значения в редакторе, поэтому он неуклюже сочетает в себе черты игрового объекта и статичного класса.)


В туториале Unity Plus двухмерный массив использовался для хранения целых чисел, я же решил хранить в этом массиве ссылки на мои объекты GameTile. Это позволило мне передавать данные от тайлов и к ним напрямую (как вы увидите позже), что упростило удаление тайлов и создание анимации.

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


Заметьте, что в каждом случае мы выполняем преобразование из абстрактного игрового пространства в пространство мира. Игровые объекты Unity не хранят сами важную информацию о состоянии игры, они всегда являются только отображением этого состояния.

… и обратно

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


Вот, собственно, и всё. Заметьте, что в сущности в нём выполняется действие, обратное UpdatePosition(), где игровое пространство преобразуется в пространство мира.

Распознавание и удаление совпавших тайлов



Удаление совпавших тайлов

Это самая хитрая часть. Наверно, именно ради этого вы читаете статью.

Горизонтальное совпадение (как в «Тетрисе») реализовать довольно просто: нужно всего лишь искать смежные тайлы в одной строке. Даже добавление горизонтальных или вертикальных совпадений (как в Dr. Mario) является просто вариацией этой темы. Однако отслеживание набора смежных тайлов в одновременно горизонтальном и вертикальном направлении потребует рекурсии.

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


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

Мы начинаем процесс с «грубого» перебора. Пройдём от ячейки к ячейке (сначала строки, потом столбцы), проверяя каждую ячейку. Для каждой проверки мы сбрасываем некоторые переменные, используемые для отслеживания проверки, а затем вызываем отдельную функцию (которую позже применим для рекурсии):


Давайте рассмотрим эту функцию TestTile:


Если функция обнаруживает, что ячейка имеет значение null, то пропускает её. Ячейка с null означает, что она или пуста, или мы уже тестировали её. (Именно поэтому мы скопировали её в отдельный массив — так проще произвольно манипулировать новым массивом.)

Если ячейка имеет значение, то мы делаем следующие действия. Во-первых, мы запоминаем её как «текущую» ячейку, ту, которая находится на вершине рекурсивной цепочки. Затем мы удаляем её из копии игрового поля, чтобы не проверять дважды. Также добавляем её в список (List), чтобы запомнить, сколько смежных тайлов одного цвета мы нашли.

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

«Текущая» ячейка уже установлена, и это значит, что мы не на первом уровне рекурсии. В этих вызовах функций у нас есть три варианта для каждой ячейки.

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

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


В-третьих, ячейка может быть того же цвета, что и «текущая» ячейка. В таком случае, она «проверена», поэтому мы устанавливаем ей значение null в копии игрового поля. Также мы добавляем её в List, который используем как накопитель. Это одно из состояний, которое мы пропустили в примере выше:


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

Если в накопителе есть больше трёх тайлов, то мы нашли совпадение. Если нет, то мы проверили один или два тайла, но нам не нужно выполнять никаких действий:


Здесь, как мы рассмотрим позже, я просто включаю анимацию. Простейший подход, однако, заключается в том, чтобы пройти циклом по нашему накопителю и вызвать DestroyObject для игрового объекта каждого совпадающего тайла. Так мы убьём двух зайцев одним выстрелом: избавимся от внутриигровых объектов и присвоим ячейкам в состоянии игрового поля значение null.

Падение тайлов



Падающий тайл

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

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

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


После завершения нужно не забыть снова вызвать функцию проверки совпадений. Очень вероятно, что падающие тайлы создали пустые строки.

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

Анимации

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

Это тоже сложный момент. Игровые объекты всегда являются отражением состояния игры, поэтому тайлы постоянно расположены в сетке. Тайлы всегда занимают то или иное место: тайл может быть в строке 1 или 2, но никогда — в строке 1,5.

В чём заключается сложность? Нам нельзя одновременно манипулировать игровым полем и анимацией. Вспомните, как работает «Тетрис» или Dr. Mario — следующий тайл не падает, пока все тайлы на поле не «улягутся». Это даёт игроку короткую передышку, а также гарантирует отсутствие непредвиденных состояний и взаимодействий.

Кстати, при начале нового проекта я рекомендую создавать перечисление (enumeration) «игровых состояний». Мне никогда не приходилось писать игру, в которой не нужно было знать состояние игры: сам процесс игры, пауза, отображение меню, диалоговое окно, и так далее. Лучше всего спланировать состояния на ранних этапах разработки, таким образом можно сделать так, чтобы каждая написанная вами строка кода проверяла, должна ли она выполняться в текущем состоянии.

Признаюсь, что моя реализация неуклюжа, но в целом идея такова: при удалении или падении тайла мы задействуем изменение состояния. Каждый объект GameTile знает, как обрабатывать это изменение состояния, и, что более важно, знает, когда нужно сообщать игровому полю, что он завершил свою анимацию:


После завершения анимации удаления игра должна проверить наличие падающих тайлов:


После завершения анимации падения нужно проверить наличие совпадений:


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


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

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


Есть ряд универсальных принципов, которые необходимо знать, перед началом проектирования редактора под ваш проект:

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

Горячие клавиши помогают ускорить процесс. Для большинства элементов есть свой инструмент для его удаления. Достаточно привязать функции создания и удаления к разным кнопкам мыши и экономия времени будет налицо. Этот пункт не актуален, если ваш редактор работает только на мобильных устройствах;

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

Редактор должно быть легко поддерживать и добавлять новый функционал. Модульность элементов и меню обязательна, если предполагаются мало-мальские обновления контента. Шаблонность вкладок настроек и меню сэкономит много времени разработчикам, при добавлении очередного элемента в игру;

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

Мобильная версия. Если проект разработан под мобильные устройства, ваш отдел контроля качества не раз скажет спасибо, если на них можно будет запустить и полноценный редактор. На деле, это очень поможет при работе со всеми смежными отделами. Для дизайнеров это поможет вести работу в более комфортном для них окружении. Иногда очень полезно сделать наброски идей пока едешь в метро или пьешь кофе на кухне. Дизайнеры люди творческие и любая возможность выйти за пределы насиженного рабочего пространства, не прекращая выполнять свои обязанности, пойдет им на пользу;

Выключите звуки и музыку по-умолчанию! Я серьезно, об этом всегда забывают.

Рассмотрим принципиальную схему устройства редактора.


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

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

При старте разработки дизайна редактора, необходимо начать с двух простых моментов:

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

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

Базовый редактор включает в себя несколько основных разделов:

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

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

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

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

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


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

Список уровней. Это структура вашего проекта, поэтому этот раздел должен позволять легко ее менять или вносить коррективы. Например, если в игре уже 500 с лишним уровней, держать их все одним списком будет неудобно. Необходимо сразу предусматривать возможность структурирования уровней по группам с удобной нумерацией. В играх, где существует несколько возможных миров со своими наборами уровней, так же необходимо создавать свой раздел. Рекомендация здесь будет только одна — переносить уровни из одного в раздела в другой необходимо за минимальное количество телодвижений. Drag`n`Drop будет одним из неплохих решений, но влечет за собой опасность случайного переноса контента между разделами. Делать сложный менеджмент с помощью многоуровневых меню более безопасный вариант, но однозначно не самый удобный;

Контроль версий. Возможность откатить изменения спасла не одну шкуру программиста, но в деле дизайна уровней это очень мощный инструмент для создания вариантов уровней, которые впоследствии можно использовать в игре. Как правило, очень помогает для уровней, которые являются критичными для проекта — обучение механикам, стартовые уровни игры и т.д. Возможность посмотреть на предыдущие варианты и, в случае чего, откатить изменения, бесценна. Основной проблемой будет создание удобного формата переноса версий между уровнями и корректное их именование. Вспомнить, что означает название версии “Copy of level New +” явно введет вас в ступор через месяц после отправки его на релиз, а называть каждый уровень вручную тоже не самое лучшее решение. Поэтому сразу утвердите наглядный способ идентификации версий. Например, номер по порядку, дата релиза, игровой режим и количество игровых ходов;

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

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

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


Элементы управления контентом, которые необходимы конкретно дизайнеру:

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

Контроль версий. Возможность откатить изменения до предыдущей версии, если возникли проблемы, должна быть доступна без необходимости проверять каждый уровень отдельно. Сформированные наборы уровней и настроек, которые можно восстановить целиком или частями очень сильно поможет при поддержке сложных проектов;

Аннотации. Подключить аналитику к старым версиям уровней может быть не самой простой задачей, поэтому на помощь может прийти функционал аннотаций. Даже простой статичный текст, куда была скопирована актуальная на тот момент информация, поможет восстановить данные или использовать их при детальном анализе контента игры;

Безопасность. Проектируя систему менеджмента игры, необходимо озаботиться созданием уровней доступа для участников проекта. Если поиграть в любой уровень может каждый, то доступ к функциям редактирования, сортировки и контроля версий должен быть ограничен. Для начала подойдет возможность доступа по логину/паролю, позже можно развивать до более сложных систем взаимодействия участников проекта.

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

Обзора какого функционала вам не хватило в статье и в реальных проектах? Если у вас есть опыт разработки подобных систем, на какие вещи стоит обратить внимание и чего однозначно не стоит делать?


Три в ряд — один из самых популярных игровых жанров. Игр существует десятки тысяч, при этом в интернете довольно мало статей по дизайну уровней, а они — основная составляющая игры. Правим этот недостаток, размещая на Хабре свои мысли и опыт в виде тезисов, заметок по сути и по делу, с рассуждениями и картинками.

Общие положения

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

О головоломках: в каждой игре есть стандартный набор целей и препятствий и ими необходимо правильно распоряжаться. Уровни должны быть понятными, интересными и нести в себе ценность для игрока — вызов или фан.

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

Об игровых режимах: чем больше целей и препятствий есть в игре тем больше интересных уровней можно сделать. А если в вашей игре есть уникальные решения, то вам повезло. В жанре наблюдался застой, но появились хиты с новыми интересными решениями старых проблем. Экспериментируйте! Ищите новые игровые режимы и препятствия, вам это будет только на руку. Обилие уровней на сбор очков — это беда и деградация. Удивляйте игрока с самого начала игры.

О разнообразии: уровней в популярных играх зачастую 300+, поэтому необходимо понимать, что делать десять уровней подряд про разбивание клеточек или спуск каких-нибудь предметов — это глупо. Ваши игроки устанут после пары локаций. Чередуйте стандартные игровые режимы как можно чаще, уровни с новыми и уникальными фишками можно ставить несколько раз подряд в момент их появления в игре, но даже они должны чередоваться со знакомыми режимами.

О длительности: тут надо понимать кто и на каких устройствах и социальных сетях играет в вашу игру и подбирать наиболее удачную продолжительность уровней. Я предпочитаю основную массу уровней делать на 25-35 ходов, иногда включая очень короткие — меньше 20 ходов, и очень длинные — больше 45.

О качестве: уровни бывают сложными и легкими, но как оценить их качество? Очень просто! Смотрите на цифры проигрышей — насколько завершена цель уровня на момент провала. Например, если в уровне необходимо разбить 80 клеток, а среднее число выполнения условия при проигрыше около 10, то вы сделали плохой уровень. Скорее всего, игроки просто не понимают как его пройти. У каждого проекта свои цифры, но вы хотите, чтобы проигрыши всегда были при 90% выполнения условия уровня. Даже на самых сложных и мозговыносящих уровнях.

Начало работ

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

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

image

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

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

Основные критерии при создании уровней


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

Цель уровня


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

Используемые препятствия


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

Продолжительность


Как говорили мудрые: «Любой интерфейс можно упростить вдвое». Я им верю. Если уровень можно очистить от половины всего и пройти быстрее, сохранив интерес и сложность — делайте. Нет ни одной уважительной причины для затягивания уровней. Продолжительность уровней должна иметь смысл как в определенной точке игры, так и для проекта в целом. “Давно не делал длинных уровней”. — так себе обоснование при выборе количества ходов.

Ценность уровня


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

Контроль удачи


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


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

Играйте в хорошие игры, вдохновляйтесь и превращайте эмоции в интересный контент. У меня все.

Читайте также: