Работать над игрой в полную силу мы с Николаем начали после моего переезда в Североморск.
В целом процесс шел хорошо. Некоторые особо запомнившиеся эпизоды расписал ниже.
Усложнение правил
По мере разработки мы постоянно обновляли и усложняли правила игры.
Довольно быстро мы отказались от идеи полной закраски всех кубиков грани при завершении комбо, так как из-за такого подхода выгодно играть было только на одной грани, то есть в обычные крестики-нолики.
Другая проблема состояла в том, что механика поворота граней была не очень полезной.
Действительно, зачем поворачивать грань ради дополнительного хода, если в этот дополнительный ход ты все равно закрасишь только один кубик?
Тогда решили сделать первое вращение в ходу бесплатным, а также поставили лимит в максимум 3 дополнительных хода.
Была еще проблема с тем, что можно было войти в бесконечный цикл, постоянно разрывая и собирая одни и те же комбо с помощью поворотов граней.
Решили мы ее через глобальный счетчик комбо. Если в результате действий игрока количество комбо не изменилось, значит дополнительный ход он не получит.
Бот
В игре есть режим одиночной игры против самого телефона.
Сначала мы хотели обучить полноценную нейросеть, но быстро от этой идеи отказались, так как ни я, ни он не имели достаточных знаний по этой теме.
В итоге остановились на том, что легкий бот просчитывал все возможные ходы без учета вращения граней и с некоторой вероятностью выбирал оптимальный вариант.
Средний бот делал то же самое, но уже с учетом вращения граней.
Наконец, сильный бот практически никогда не ошибался и выбирал самые выгодные варианты в рамках одного хода.
Мы очень много времени потратили на то, чтобы проверить, действительно ли он играет по правилам.
Правила были сложными, а некоторые его ходы были совсем странными.
Дошло до того, я выводил целый список всех возможных ходов с расставленными приоритетами.
Бот получился добротным. Сложную его версию даже Коля обыгрывал с трудом.
Неуловимая ошибка
Уже на финишной прямой мы заметили странные ходы нашего бота.
Иногда он пытался закрашивать уже занятые кубы.
Кроме того, после поворота граней, игра заканчивалась с неверным счетом или вообще преждевременно со свободными пустыми клетками.
Сначала я пытался найти ошибку в одиночку. Но у меня ничего не вышло.
В итоге мы уже вдвоем потратили целый день на проверку каждого класса и каждой функции, которая отвечает за игровой процесс.
И нашли ошибку!
Проблема была в том, что в нашем игровом кубе отсутствует ячека в центре, поэтому формула для расчета координат ячеек, на которую мы опирались, работала нормально только для одной половины куба.
Как только требовалось получить координаты «за центром» кубика, они оказывались «смещенными» на единицу «назад».
Простое добавление +1 к координатам для компенсации отсутствующей центральной ячейки решили проблему.
Мнимый процентный рейтинг
Нам очень понравилась идея выводить не только числовой рейтинг игрока, но еще и писать что-то в духе «Вы лучше, чем X% игроков».
Проблема заключалась в том, что составить такой процентный рейтинг можно было только имея на руках глобальную статистику рейтинга игроков.
В итоге решили схитрить. Мы прикинули, какой средний рейтинг будут иметь большинство игроков и построили нормальное распределение, по которому и рассчитывался процентный рейтинг.
Игрокам приятно видеть, что они крутые, а мы не потратили силы на создание глобального рейтинга.
Сетевая игра
Пожалуй, самый геморный этап из-за того, что я никогда раньше ничем подобным не занимался.
После вводного изучения темы, решил воспользоваться готовым решением от Photon.
Но даже имея на руках библиотеку по внедрению сетевой игры у меня возник просто миллиард самых разных проблем.
Самая большая из них была связана с тем, что ядро игры не было рассчитано на мультиплеер.
Пришлось переписывать ключевые механики игры, разделяя их на графические и логические подсистемы.
Например, логический куб хранит только состояние ячеек и эти данные передаются между игроками, чтобы убедиться, что никто не нарушает правила. А вот графический куб лишь принимает данные от логического и красиво отображает их на телефоне игрока.
Короче, в процессе работы над сетевой игрой от большей части идей пришлось отказаться.
Кое-как удалось реализовать только самый базовый функционал, да и он работал через раз и имел кучу багов.
Но как же было приятно лежа на диване в квартире победить Колю, который ехал в школу на такси.
Просто триумф!