Letter-Setter. Записки одной разработки. Часть 2

af17ca4d1551a5c8ba0963544554f3bc.png

…ничего не слышу…

9423fcd48cfcd8fc623b4a1e0d4cd156.png

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

  • генерацию буквенного поля. Задача с вероятностью выпадения решилась проверенным годами балансом — игра Скрэббл сделала все за нас своим распределением количества букв.

  • отслеживание готовых слов по вертикали сверху вниз и по горизонтали слева направо. Причем сразу же всплыло несколько проблем:

    • во-первых, на случайно сгенерированном поле образовывались слова, и игра начинала играть сама в себя;

    • во-вторых, в линиях с буквами могло появиться несколько пересекающихся слов (какое игра должна выбрать?).

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

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

  • уничтожение составленных слов.

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

  • систему начисления очков за уничтоженные буквы. Опять же, спасибо Скрэббл за проверенную временем систему подсчета очков.

  • локальные лидерборды.

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

b8c9116c48d5471c703f1b031de5f24d.jpg

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

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

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

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

7e12e52957fefbcf1a375e369e948d8b.png

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

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

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

Время идет, а дела надо делать… Процесс продвигается очень медленно и начинает сильно надоедать. Что делать? Правильно — заставим машины работать на нас! Да, пусть ChatGPT еще загорает где-то на этапе прототипа в Сан-Франциско, но наша достаточно рутинная задача имеет определенную последовательность, а значит ее можно автоматизировать! Разбор словаря проходит по простому циклу:

  • взять строчку текста,

  • разбить ее на слова,

  • убрать уже добавленные в словарь слова,

  • убрать слова которые мы ранее уже посчитали неподходящими,

  • оставшиеся слова либо добавить в словарь, либо отметить как неподходящие,

  • взять следующую строчку текста.

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

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

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

И вот теперь работа пошла! Все еще не мгновенно, но теперь она не кажется такой уж и невыполнимой — пару-тройку недель работы (всего-то) и готово — у нас есть словарик! А точнее даже два — для двух разных языков (про большее количество языков я пока больше не хочу ничего слышать)!

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

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

Далее пришло время нарастить немного мяса на проекте!

f44937a815f67649d0acbee2db297e2c.png

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

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

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

bd9f5f327472ca5fbd341e0638096032.png

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

01327e8bd54ab2c71c651a632eee7d86.png

И вот теперь, когда игра обрела вес, пришло время определиться с тем, чтобы игра обрела лицо.

Letter-Setter в Steam

© Habrahabr.ru