Как я придумал и завайбкодил игру, которая никому не нужна. Часть 1
После того как я пообещал в комментариях рассказать про свой опыт разработки игры на андроид с нуля и исключительно с помощью нейросетей я получил трех подписчиков впервые за свое семилетнее пребывание на Пикабу) Что ж.. не могу их подвести.
Собственно сабж – https://play.google.com/store/apps/details?id=com.pavelmerz....
Если кратко – командная игра в шашки на четверых (2x2). Правила – Шашки + Уголки + немного Шахмат + элементы пошаговых стратегий. Можно играть вчетвером за одним устройством, одному с ботами и онлайн. Последнее в теории только, конечно, потому что игроков нет. Но работает, проверено)
Спустя 2 месяца после релиза у игры менее сотни загрузок. Постил несколько раз на Реддит - внимания не привлекло, и сейчас я уже ни на что не надеюсь. Цель этого поста – не очередная попытка популяризации, а рассказ об опыте разработки полноценной игры с нуля человеком, максимально далеким от программирования с использованием современных возможностей.
На самом деле, глядя на свой продукт перед релизом, я ожидал, что так будет. Я понимаю, что он выглядит, как сделанный на коленке, ну не дизайнер я и это лучшее, что я смог придумать. А нейросети для дизайна я приспособить не смог. Также я понимаю, что получилась очень нишевая игра со сложными правилами. Хотя не сложнее шахмат, на мой взгляд, но как мотивировать людей изучать придуманную кем-то игру со сложностью правил хотя бы на уровне шахмат совершенно непонятно. В общем, провал был ожидаемым. Но, оглядываясь назад, я совершенно не жалею о потраченном времени. Работа над игрой стала интереснейшим хобби для меня за это время и то, что я довел ее до конца, реализовав практически все свои идеи (кроме разве что ботов на машинном обучении, но это отдельная история) и опубликовал в google play, что само по себе тот еще квест, все это дало уже нехилый прилив дофамина. Как и то, что я реально придумал совершенно уникальную игру, не имеющую прямых аналогов. И игра работает, что было проверено на партиях с друзьями, и по отзывам тех, кто все же заставил себя изучить правила – втянуться очень сложно, но если втянешься, то становится интересно, даже с теми несовершенными ботами, что есть сейчас.
В наши дни вайб-кодингом уже мало кого удивишь. Но рискну предположить, что мой случай все же особенный по ряду причин. Во-первых, как уже говорил я – вообще не программист, никогда не занимался кодингом и ничего в нем не понимаю. Не понимал точнее, когда начинал. Но по итогу смеха ради попросил Gemini и ChatGPT устроить мне экзамен по разработке на kotlin. И они оба оценили мой уровень как начальный мидл. Я сам, конечно, скептически к этому отношусь, нейросети любят говорить приятное юзеру, но по крайней мере то, что задача, которую мне удалось решить на практике – это уровень мидла мне кажется правдоподобным. Но это ладно, примеров, когда что-то вайбкодили блогеры, далекие от IT хватает, но все, что я видел из того, что они делали было чем-то стандартным. Какой-нибудь говномагазин, органайзер, крестики-нолики, динозаврик, перепрыгивающий камни… Сделать все это сейчас действительно может любой, просто закинув промт в одно предложение. И нейроджинн исполнит. Потому что все это делалось уже тысячи раз, и он просто достанет готовое решение.
Но что, если готового решения нет? Что если вы придумали совершенно новую игру, правила которой уникальные и достаточно сложные? Когда я начинал, я не думал, честно говоря, что даже режим за одним устройством доведу до конца, не говоря уж о ботах и онлайне.
На работу, с перерывами у меня ушел почти год, с февраля 25 по февраль 26го. Да, многовато, но в-первых я все делал на чистом энтузиазме в свободное от работы время, а во-вторых, на разных этапах я заходил в тупик и делал перерывы, которые затягивались на месяцы, а потом выходили новые версии моделей, и я возвращался к своему проекту. Так что по моей истории можно оценить скорость развития нейросетей. Потому что с теми технологиями что были еще год назад, когда я начинал мне бы совершенно точно не удалось осуществить задуманное.
1. Рождение идеи. О том, почему правила вышли такими, какие они есть. Если интересен только вайб-кодинг – переходите сразу ко второй главе.
Концепция игры возникла у меня во время партии в карточную игру «Пики», где играют 2 команды по 2 человека, и напарники сидят напротив друг друга. Я представил, как бы могла выглядеть шашечная игра на четверых, где также игроки одной команды сидят напротив и в каждой команде один играет обычными шашками, а другой перевернутыми. Делать шашки на четверых с обычными правилами мне было не интересно, да и было очевидно, что я не могу быть первым, кто до этого додумался. Первое отличие, которое я задумал – чтобы были задействованы все клетки доски, а не половина из них. А значит шашки должны делать не только диагональные, но и прямые ходы. И я сразу представил, что такая игра должна вестись на ромбовидной доске. Это мне показалось оригинальным и прикольным, да и более удобным для такой игры. Вначале я планировал по 6 шашек у каждого игрока, чтобы можно было играть стандартным набором, но потом понял, что это слишком мало, а вот 9 вышло оптимально. Также я с самого начала не видел дамок в такой игре, но раз играют двое на двое, то хотелось, чтобы игроки одной команды имели возможность комбинировать свои шашки, если доберутся друг до друга. Идею многоуровневых шашек я подсмотрел в столбовых шашках, только там строятся башни с вражескими шашками, а в своей игре я решил сделать башни с союзными, и максимум двойные. Осталось придумать, что они будут делать в игре.
Я разложил шашки и стал экспериментировать. Сложнее всего было придумать правила ходов, чтобы игра оставалась динамичной. Я принципиально хотел сделать так, чтобы ходы были возможны как по диагонали, так и прямые. Долго думал, как ограничить ходы назад как в шашках, но что считать ходом назад, если противники находятся справа и слева, а напротив – союзник? В итоге я понял, что никаких ограничений по направлению ходов не должно быть, но это вызывало другую проблему – игра легко превращалась в бесконечный цикл, если дать игрокам возможность ходить туда-обратно. Так родилась идея, что если у тебя нет захваченных шашек, то каждый четвертый ход нужно жертвовать одну из своих. Отзывы на эту концепцию были неоднозначные, но я считаю ее правильной. Именно эта механика, удерживающая игроков от пассивной игры, и стала в итоге ключевой и делающей игру ни на что не похожей. Из Уголков я утянул возможность цепных прыжков через свои шашки, но пришлось ввести ограничение на смешивание прыжков через свои и вражеские шашки, иначе просто невозможно было оценивать каждый раз ситуацию на доске. Это добавляло стратегических возможностей. А чтобы их еще усилить я сделал взятия необязательными. Ведение правила жертвы это позволяло. Осталось придумать что должны делать башни. Двойная шашка выглядит как что-то тяжелое и монументальное, поэтому делать ее летающей дамкой было бы неуместно. И мне пришла в голову мысль – лишить такую фигуру возможности совершать прыжки, пусть ходит и бьет как шахматный король, занимая соседнюю клетку непосредственно, но и чтоб ее при этом побить было нельзя, кроме как такой же башней. И сразу возникла идея о назначении такого юнита вместе с альтернативной целью игры – занять крайнюю угловую клетку (столицу) каждого из противников. Ведь если противник не будет убирать свою шашку с угла, его иначе как такой башней будет не занять. И тут же родилось и ее название по характеру действий – «Таран». Только способ его нейтрализации пришлось переработать, так как уязвимость только перед другим тараном выходила слишком имбовой и неостановимой. После долгих размышлений я решил сделать возможность сбить с него верхнюю шашку после цепного прыжка, в том числе через свои. Это вносило некоторую путаницу, но ничего лучше придумать не удалось.
Параллельно я гуглил что уже есть интересного в плане шашек на четверых. И ничего интересного для себя не нашел. Наиболее близкая идея к моей – «Невские шашки».
Но там все ходят только по диагонали, в одном направлении и строго по очереди, по часовой стрелке. Это мне показалось очень скучным. Первые два ограничения побороть уже удалось, а вот над очередностью ходов я задумался. Идея сделать возможной передачу хода мне показалась спорной, но интересной. Я сразу понял, что если это вводить, то только при определенных условиях, иначе это убьет смысл командной игры. Но как реализовать мне тогда в голову не пришло.
На этом моменте я решил обратиться к нейросетям. Это был февраль 2025. Тогда была доступна бесплатная модель GPT 3.5 и Deepseek. Лимиты в Gemini и Claude были совсем низкими. Моя цель была оценить работоспособность концепции, попросив нейронки провести несколько симуляций партий. Это было очень наивно) Я скормил GPT изобретенные мной правила и попросил ее прогнать несколько партий. И она тут же расписала мне несколько захватывающих игр с интригой до самого конца. Круто – подумал я, мои правила работают! Но очень быстро я понял, что сильно переоценил возможности нейросетей – никаких симуляций она, конечно, не проводила, а выдавала просто поток ни на чем не основанных галлюцинаций. Я понял это, когда попросил показать, как она видит начальную расстановку шашек и она выдало нечто вообще не имевшее отношения к моему замыслу.
Deepseek лучше понял расстановку, но в качестве симуляции выдавал похожую галиматью. В общем, я понял, что дело это бессмысленное и реально оценить концепцию можно только с живыми людьми. Но приходить к знакомым с доской и шашками, типа я придумал игру – давайте сыграем было бы нелепо, надо было их чем-то заинтересовать. И поначалу смеха ради я спросил у GPT (или Deepseek, уже не помню) – а с помощью чего вообще разрабатывают приложения на Android? И был приятно удивлен, что есть совершенно бесплатная официальная программа – Android Studio. Установил и понеслось…
2. Первые шаги и Cursor AI.
С чего начинать разработку я не знал, поэтому просто запросил GPT – "А можешь ли ты написать код для игры на android по этим правилам?" Нейросети адекватность задачи не оспаривают, а всегда берут под козырек. А вот что из этого получается…
В общем, выдает она мне простыню на Java на 80 строк. И вот следующий диалог я сохранил как памятник своей наивности)))
80 строк – вся игра, ну конечно! Хоть я и задумывал поначалу только локальный режим, но все равно аж прям стыдно за себя. Для понимания – итоговая версия игры – более 20 000 строк кода и это после портирования на kotlin, где синтаксис гораздо короче.
В общем, я был как ребенок, не умеющий плавать, решивший прыгнуть сразу в океан. Спрашиваю – и че мне с этим кодом делать? Она объясняет – создай проект на Java, убедись, что Minimum SDK – API 21, в такой-то папке создай класс MainActivity.java… Че? Что за SDK? Что такое класс? Кое-как разобравшись, я сделал это. Кстати, единственное что так и не понял, на кой хрен она 25м году предложила делать на Java, когда нативным языком разработки на android уже давно был kotlin, по сути, та же java, только упрощенная. Никаких преимуществ, кроме раздутого синтаксиса это не давало. Но тогда я еще ничего об этом не знал и ринулся делать все по наставлениям. Вставил код в MainActivity… и он не заработал конечно же. Причину GPT найти не смог, и я обратился к встроенной в Android Studio Gemini. Возможности ее были сильно ограничены, но причину того, что приложение не запускалось она определила довольно быстро. Нужно было привести в соответствующий вид конфигурационный файл AndroidManifest, существование которого GPT вообще не учел. Поколдовав немного, снова запустил – и заработало! Вот она, ромбовидная доска, шашки в нужном количестве, только стояли опять не так. Несколько попыток исправить через GPT оказались безуспешными, пока не вышел доступный лимит. Пришлось вникнуть самому, благо в плане расстановки шашек это было несложно. И вот, после очередного запуска я увидел это:
Результат вдохновил меня тогда неимоверно. Просто не верилось, что удалось без навыков программирования вывести на экран то, что я себе представлял. Пусть пока просто вывести на экран. Чуть позже я также сам увеличил количество шашек до 9, когда, параллельно играя сам с собой окончательно понял, что 6 – это мало.
Я поговорил со знакомыми кодерами (проживаю в Астане и большинство знакомых соотечественников-релокантов здесь именно этой профессии по понятным причинам), мне посоветовали начать разработку с Cursor AI, среды которая давала бесплатные 200 запросов к топовым на тот момент моделям GPT 4.0 и Claude Sonnet 3.5.
Я подгрузил свой проект, выбрал GPT 4, предвкушая, что умная платная модель сделает все как волшебная палочка. Но вышел облом. Четверка, в отличие от своей урезанной версии выдала довольно грубый для нейросети ответ, что-то вроде: «Человек, ты что совсем поехавший? Такая сложная игра за один промт не делается, это долгая и кропотливая работа, которую нужно разбить на множество мелких задач. Для начала могу только доработать расстановку, она сейчас не совсем корректна».
В общем, манера общения GPT 4 мне как-то не зашла. Ее доработки ничего не изменили, да правки и не требовались. То, что нужна была декомпозиция задачи я понял, но с чего начать? Запустил Claude, и вот его подход мне понравился больше. Он не стал возмущаться глобальностью задачи, а сам разбил ее на подзадачи и начал с того, что научил шашки делать базовые ходы. После этого я впервые поверил, что смогу довести игру до полноценного результата и разработка понеслась.
Не буду сильно вдаваться в подробности на этой стадии, скажу лишь, что основных сложности было 3:
- Сделать так, чтобы нельзя было смешивать прыжки через свои и вражеские шашки за один ход. Во многом из-за того, что поначалу при выборе шашки сразу подсвечивались все доступные ходы с учетом всех прыжков. Проблему мне тогда решить удалось, но позднее я понял, что такая концепция – это в принципе тупиковый путь, а прыжки надо совершать по шагам, как это реализовано во всех шашечных играх.
- Корректная очередность ходов после выбывания одного из игроков. Игра постоянно стопорилась, пришлось сделать временную кнопку, оставляющую по одной шашке у каждого игрока для удобной отладки. Решить проблему оказалось сложнее, чем я ожидал, нейросети никак не понимали, что от них требуется
- Реализация поворота экрана. К моему удивлению, программировать поворот доски при повороте экрана было не нужно, все получалось само, вот только положение шашек стиралось до стартового состояния, как стирались и цифры счета. Оказывается, android, при повороте экрана стирает и отрисовывает заново всю графику, и состояние нужно кэшировать и доставать из кэша каждый раз, что тот еще геморрой. Эта проблема преследовала меня до самого конца, особенно после добавления меню, всплывающих окон и онлайн режима.
В общем, я закончил первый прототип, пока без таранов, без передачи ходов, но рабочий и играбельный аккурат к тому моменту как у меня закончились 200 триальных промтов. Выглядел он так:
Игра состояла из одного раздутого класса MainActivity, я еще не знал тогда, что их надо делить по функционалу. Но показать результат людям уже было не стыдно…
На этом пока прервусь. Продолжение следует…
P.S. Вышло затянуто, ну не умею я кратко писать, а использовать нейронку для личной истории как-то западло. Пишите в комментариях, интересно или нет, стоит-ли сократить продолжение.
































