Волки и камни
Тут у меня как-то в мае выдалось несколько свободных вечеров и я исполнил свою давнюю мечту — сделал свое первое приложение под Андроид. Получилось примерно так: 95 % кода писал ИИ, при этом 95 % идей и алгоритма работы — мои. То есть, классический вайб-кодинг.
Когда несколько лет назад на большие экраны вышла игра PokemonGo, идея мне очень понравилась, так как я люблю всякие приколы с GPS и ориентированием на местности. Школьником я даже один раз участвовал в чемпионате города по спортивному ориентированию. И то участие можно считать очень успешным: нас, троих заблудившихся в лесу оболдуев, организаторы разыскали довольно быстро. Но в Покемонах было много непонятных мне вещей: от самих покемонов до многого из механики игры. Хотелось чего-то проще. Так и появилась идея игры «Волки и камни».
Суть такова
Волки и камни — это минималистичная гео-игра в жанре городского ориентирования, смесь все тех же Покемонов, геокэшинга и спортивного ориентирования.
Раз в сутки «Волк» получает список из 10 «камней», разбросанных в радиусе 3 км от него. Камни — это объекты на карте (используется «народная» Openstreetmap), привязанные к рукотворным объектам: лавочкам, фонарям, кафе, мусоркам и т. п. Задача волка — собрать все камни. В полночь по UTC (в 3 часа ночи по МСК) все камни превращаются в тыкву и можно получить новые.
Выглядит это вот так:

Главное окно программы

Заставочка, любезно сгенерированная все тем же ИИ
Как все это делалось и как это работает
Первый вечер ушел на работу с бэкендом — все хранится на сервере в красивых таблицах. По мере необходимости к серверу подключается приложение.
День второй. Я установил Android Studio, определился, что делаться все будет на языке Kotlin и приступил к делу. С логикой и функциями сложностей не возникло, так как программа очень простая. Но все застопорилось, когда я попытался интегрировать в приложение карту, которая должна показывать текущую позицию волка и актуальные камни. Сколько я ни бился, на экране вместо карты упорно отображался то белый, то черный прямоугольник.
С этим мы подобрались третьему дню — дню, когда я уже рассчитывал получить рабочий прототип и провести первые полевые испытания. Так как карта упорно не хотела появляться, я решил обойтись вообще без нее. И теперь я считаю это одной из главных фишек: чтобы найти камень, не достаточно просто идти, глядя на точки на карте — карту и взаимное расположение точек нужно постоянно держать в голове, что неплохо так тренирует умение ориентироваться. Для удобства я добавил окошко наведения на камень:

Собственно, все было готово. Когда волк оказывался у заветной цели, оставалось только нажать на кнопку — и камень добавлялся в коллекцию.
Технические подробности
Поскольку я никогда до этого не делал приложений, я попытался сделать все максимально просто, чтобы самому понимать, что происходит. Итак, как все это работает.
Для того, чтобы начать, нужно установить приложение и ввести свой индивидуальный токен — он передается при каждом взаимодействии клиента с сервером. Для правильной работы приложению нужен доступ к интернету и GPS. При запросе камней на сервер передается токен и текущая позиция. Сервер на основании этой позиции делает API-запрос к Openstreetmap и получает в радиусе 3 км камни для волка. Камни привязаны к общедоступным антропогенным объектам на карте. Это сделано, чтобы исключить появление камня посреди озера или на закрытом объекте. Отбирается 10 рандомных камней. Список загружается на телефон и добавляется в базу данных на сервере.
Вверху всегда отображаются текущие координаты игрока и точность позиции.
Список загружен и отображается на экране игрока: от самого близкого к самому дальнему. Каждые несколько секунд обновляется (по GPS) позиция игрока и на ее основании пересчитываются расстояние и азимут на камень (азимут — это угол между направлением на север и на выбранный объект, по часовой стрелке, от 0 до 359). Встроенный компас телефону не нужен — все работает за счет спутниковой навигации. Можно выделить понравившийся и начинать двигаться на него. По изменению чисел и поведению стрелки можно судить о правильности выбранного направления. Сначала немного непривычно, но со временем начинаешь представлять свою позицию, цель и область поиска (как с бумажными картами в спортивном ориентировании). Как только оказываешься в 15 м или ближе от цели появляется заветная кнопка, позволяющая взять камень. Он вычеркивается из локального списка на телефоне и отмечается как взятый на сервере. И так далее. Если найдены все камни, цель на сегодня выполнена. Если не все, то в полночь по UTC список удаляется локально и на сервере и можно запросить новую партию.
Еще раз кратко:
Открытой регистрации нет — доступ для своих по приглашению.
Для аутентификации используется любой ник и токен (набор букв и цифр). Ничего дополнительного типа электронной почты или подобного не требуется.
Позиция игрока один раз передается на сервер и не сохраняется. Она используется только для того, чтобы получить камни в подходящем районе.
Приватность by design: никакие данные игроков не сохраняются (так как сохранять особо нечего) и не передаются. Никаких привязок к внешним аккаунтам и прочего. Сохраняется только список найденных камней, но и их при желании можно удалить.
Карты нет, но есть точные координаты каждого камня. Если совсем сложно, их можно открыть в каком-нибудь внешнем приложении.
Сведена к минимуму вероятность того, что камень выпадет в опасной, недоступной или запрещенной зоне, так как все привязано к общественно-доступным объектам на карте. Но все равно стоит помнить о безопасности.
Никакого агрессивного удерживания. 10 камней — это дневной максимум.
Никакой работы в фоне, передачи данных и нагрузки на аккумулятор.
Главной мотивацией при создании было попробовать создать андроид-приложение. До этого я никогда этим не занимался и понятия не имел, как это работает. Идея пришла уже по ходу. Почему именно волки и камни — маленькая тайна, к ауфу не имеет никакого отношения. Чтобы играть, нужно оторвать от дивана пятую точку и выйти на улицу, а в процессе поиска даже знакомый район открывается заново.
Есть несколько идей для будущий апдейтов. Кстати, о новой версии (если она появится) можно будет узнать в окошке личной статистики (кнопка внизу экрана) — там должно появиться специальное сообщение.
Если кто-то вдруг возжелает потестить, вы знаете, куда обращаться