Как появилась идея
Однажды ко мне пришел знакомый с идеей сделать приложение под Android - игру пятнашки. На тот момент я уже был немного знаком с Android - в институте делал два аудио-плеера, собирая их из кусков со StackOverflow. Согласился и на пятнашки.
После нескольких недель гугления набросал, как сейчас говорят, прототип. В нем был реализован классический режим пятнашек (4x4) и некоторые настройки (в основном анимации, настройка цвета). Прикрутил запись рекордов, управление жестами.
Какие возникли трудности
Сам того не осознавая, с самого начала я принял очень удачное решение - генерировать поле полностью случайно. Имея некоторый опыт решения пятнашек, я знал, что некоторые комбинации нельзя собрать (а если точнее - 50% комбинаций, например задача 14-15). Чтобы не расстраивать пользователя и не заставлять его решать пазл, который решить нельзя, мне пришлось познакомиться с понятием четности перестановки.
Чем же случайная генерация мне помогла? Она решала сразу несколько задач.
Первая - неплохие позиции. Не было проблем с тем, что приложение создавало слишком легкие ситуации - случайный генератор чисел прекрасно справлялся со своей задачей, и делал это за постоянное время. Если вдруг в результате генерации получалась нерешаемая позиция, достаточно было лишь поменять две последние цифры местами (для 4x4 это 14 и 15) - после этого пазл можно было собрать.
Так как генерация поля происходила алгоритмически, это дало дополнительный бонус при расширении размера поля головоломки. Было также легко сделать произвольные размеры поля, например 3x5, 7x4 и т.д. Потребовались, правда, некоторые доработки, чтобы обработать все случаи.
Ну и последнее - понимание (хоть и смутное) четности помогло мне реализовать режим змейки:
А потом и спираль сделал:
Для этих двух позиций я вообще не нашел алгоритмов проверки четности, поэтому пришлось делать всё самому. Можно было, конечно, не заморачиваться и просто из конечных позиций путем совершения легальных ходов генерировать "случайную", но качество таких позиций страдает. Да и неспортивно это.
Итог моих страданий - полностью случайная генерация пазла (классика, змейка, спираль) любого размера, которая точно будет иметь решение.
Внезапная "популярность"
Примерно в марте 2017 года мой проект засветился на каком-то немецком ресурсе (даже не знаю каком, никаких ссылок найти не удалось). Результатом стало увеличение активных пользователей с ~30 до ~700 за несколько дней:
С тех пор медленно, но верно растем. Сейчас активных установок около 3000 - по нынешним меркам смешно, но для достаточно нишевого проекта это я считаю неплохим результатом.
Что получилось не очень
Код. Писать это приложение я начал почти сразу после института, когда не имел почти никакого понятия о программировании и архитектуре.
Результат налицо: везде public static
, все знают про всех. Ячейка с цифрой Tile
напрямую опрашивает объект Game
(который singleton) и решает, нужно ли ей рисовать цифру или нет. Впрочем, можете убедиться сами.
Также не хватает какого-то обучения внутри приложения. До недавнего времени понять как собирать "змейку" можно было только из скриншотов Google Play.
Еще из минусов я бы назвал дизайн. Всё-таки сейчас выглядит старомодно.
Что получилось круто
Бесплатность. В какой-то момент связь со знакомым разорвалась, а проект остался у меня. И я решил: хочу, чтобы было безвозмездно без смс и рекламы. С тех пор даже нет платной версии и кнопки "задонатить".
Кастомизация. Найти приложение пятнашек, в которых можно менять размер поля практически как хочется, да еще и в трех разных режимах, сложно. Плюс дополнительные плюшки в виде разных цветов фишек (есть даже подсветка по слоям), статистики и сложного режима.
Размер приложения: APK весит ~78 КБ. И это приложение, которое что-то делает. Без Unity, фреймворков, котлина и кучи библиотек.
Что дальше
Пока никаких планов нет. Потихоньку читаю фидбэк пользователей, добавляю мелкие фичи и правлю баги.
Хочу переписать код нормально, но руки всё никак не доходят.
Чем можно помочь
Можно посмотреть на страницу how to play и указать на ошибки перевода и/или дать советы по его улучшению.
Если есть другие идеи - смело кидайте. Обсудим (а может даже и сделаем).
Ссылочки
Скачать можно из Google Play, либо с GitHub. Также есть сайтик: 15puzzle.app.
Годно, убить пару минут времени никогда не бывает лишним