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

Привет. Я разработчик-одиночка и последние месяцы по вечерам делал небольшую браузерную игру NOCTURNE ISLAND. Хочу рассказать, почему она устроена именно так, что далось тяжелее всего, и попросить честного мнения со стороны.

Почему один набор на всех и раз в день

Мне всегда нравился формат Wordle: одна задача в день, одинаковая для всех. Ничего не нужно «фармить», зато есть повод сравнить результат с друзьями или коллегами. Хотелось того же, но чтобы утро не сводилось к одному слову. Поэтому на ночном пиксельном острове каждый день появляются четыре короткие головоломки разных жанров. Набор общий для всех и меняется в полночь по UTC, это 3:00 по Москве. На всё уходит минут 10–15, как раз под утренний кофе.

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

Четыре режима, по строчке на каждый

RANGE — вопросы на оценку, отвечаешь диапазоном «от и до»: чем уже диапазон, тем больше очков, а промах даёт ноль.

TANDEM — одна стрелка двигает сразу две фигурки, нужно привести обе на свои клетки за минимум ходов.

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

BLOOM — выставить шесть насосов так, чтобы каждое растение получило ровно свою норму воды.

Без регистрации и рекламы

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

Что оказалось самым сложным

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

В TANDEM поле 6×5 и 7–9 стен. Состояние игры — это пара позиций двух фигурок, таких пар меньше тысячи, поэтому генератор просто обходит их все поиском в ширину. Цель выбирается только среди состояний, до которых кратчайший путь занимает от 9 до 15 ходов: короче слишком легко, длиннее начинается перебор наугад. Длина этого пути и становится нормой дня на 100 очков.

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

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

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

Всё написано на TypeScript, без игрового движка.

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

Что дальше

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

Буду рад честной обратной связи. Какой из четырёх режимов зашёл, а какой нет? Где было непонятно с первого раза? Не слишком ли легко или, наоборот, жёстко? Если найдёте баг или кривую формулировку, напишите в комментариях, я всё читаю.

Поиграть можно здесь: https://nocturne-island.com/?utm_source=vcru

11