Если вы ещё не попробовали результат моих трудов, то милости прошу: https://t.me/ZenMatch3bot/game
Игры для расслабона
Мне нравятся игры-залипалки. Такие, в которых не надо думать, переживать, ждать чего-то специально. Вот буквально “Plug&Play”, как обещали в Windows 98. В качестве хорошей залипалки я всегда привожу [1] в пример Slow Roads: настраиваемый симулятор езды по бесконечным дорогам в ёбаное никуда.
Вообще говоря, у меня есть несколько собственных мини-игр, в основном выполненных в виде Telegram-ботов, но мне всегда хотелось что-то более интересное и красивое.
Два события привели меня туда, где я нахожусь сейчас:
-
Появление платформы мини-приложений в Telegram.
-
Друзья мне посоветовали скачать игру Township от Playrix.
Одной из core-механик Тауншипа является мини-игра “три-в-ряд” (это не глагол). Конечно, семь тысяч разных уровней на квадратном поле сделать нереально, поэтому в итоге получается что-то типа такого:
Некоторые уровни сложные (а бывают и специально сложные), “жизней” даётся всего пять штук, после чего жди 15 минут или плати специальные внутриигровые бабки, которых всегда мало, зато их можно купить за реальное бабло! Делать этого я, конечно, не буду.
Как жадному игроку, мне не нравится монетизация в Township, но сам концепт match-3 довольно прикольный. “Вот бы сделать что-то подобное…” — подумал я и полез искать всё готовое. Но прежде, возник другой вопрос: “А где в это играть?”. Ну разумеется, веб! Эти все “3-в-ряд” отлично подходят под сенсорные экраны смартфонов. И с телегой можно потом как-нибудь состыковать, получив тот самый вебапп (mini app).
Первой остановкой моей неуёмной мысли стал движок Godot. Почему-то показалось, что нужно брать полноценный игровой движок, “чтоб как у взрослых”. И вроде можно даже в JavaScript экспортировать. Далее я нашёл туториал по Годоту на официальном сайте, потыкал до середины первого проекта и пошёл дальше искать сразу нужное. И оно нашлось в виде целого плейлиста:
Спойлер: я досмотрел до четвёртого видео и устал 😅
Так дело не пойдёт, надо что-то придумать другое.
Когда-то давно, на четвёртом курсе института, я делал в качестве “длинной лабы” игру Морской Бой для одного игрока под Android. Выглядело это убожество так:
И это вы ещё мой тогдашний код не видели! Но прикол в том, что игровое “поле” представляло из себя один-единственный canvas, на котором были нарисованы белые линии, формирующие клетки, а положение точек вычислялось как середина этих клеток. Короче, просто рисование по полотну квадратов и кругов заданных цветов и размеров.
Может быть, сделать что-то подобное? Тем более, что на дворе 2025-й год, у нас тут вовсю AI, LLM и вайб-кодинг. Так родилась вторая идея: “хочу игру, но не хочу код писать, пусть всё сделает ИИ”.
Работаю с Агентом Джуни
Поскольку почти весь код я пишу в PyCharm от JetBrains, первым делом создал новый проект, положил туда пустой index.html
и написал JetBrains Junie: “Хочу три-в-ряд, програмировывай!”
Знаете, оглядываясь назад, я понимаю, что первая версия была очень даже ничего!
Но в таком виде даже самому играть неприятно. Поэтому я попросил Джуни сделать анимации. Предсказуемо, что-то пошло не так:
Мои дальнейшие попытки вразумить тупую железяку сделали только хуже. На очередной итерации получилось примерно так:
Чтобы немного уменьшить размер контекста, я попросил AI разбить код по разным файлам, надеясь, что следующие правки будут точечными. Тем более, что Junie работает в агентском режиме, т.е. может сама находить нужные файлы и собирать контекст только из того, что надо.
А потом случилось страшное:
На середине рефакторинга Джуни сказала “ой, квота превышена, иди-ка ты нахер”. При дальнейшем изучении оказалось, что “нахер” значит “до 9 июля”:
Но мы только ведь начали…
Прошу помощи у “Большой тройки”
И имя им ChatGPT, Claude и Deepseek. С ними моё сотрудничество было коротким и безрезультативным: поскольку они работают в браузере, надо заранее давать весь контекст. Дашь меньше файлов — начнут творить дичь, подразумевая то, чего нет, или наоборот, не видя того, что уже написано. Дашь больше файлов — упрёшься в лимиты.
Спустя где-то полчаса я начал получать ошибки уже в начале диалогов:
Платить $20 или даже больше чисто за то, чтобы Claude сгенерировал не одно сообщение, а три? Извольте. Может быть, попробовать локальные модели? Тоже плохо, в мой Мак залезет максимум на 15-20 миллиардов параметров, а это ничто по сравнению с облачными кластерами.
И тут я вспомнил про существование ещё одной LLM.
Тёмная лошадка
Почему-то я мало слышу новостей про AI от Google, в основном только, что их Gemini предлагает добавлять клей в пиццу, портит поисковую выдачу и интегрируется со смартфонами Pixel лучше, чем Siri. А ещё у Гугла есть своя AI Studio, открыв которую можно увидеть очень интересные числа:
Миллион токенов в контексте! Pro-модель! Да ещё и бесплатно! Да, на бесплатных юзерах Google планирует обучать новые модели, но мне это ведь и надо.
Дополнительно где-то в интернете я прочитал пример system instruction, чтобы нейронка не бросалась сразу генерировать чушь, а сначала задавала уточняющие вопросы, чтобы генерировать чушь ещё лучше:
You are smart AI Assistant named <тут вставьте любое имя>. You can answer in Russian, English and Serbian (follow user’s input). Before you answer, assess the uncertainty of your response. If it’s greater than 0.1, ask me clarifying questions until the uncertainty is 0.1 or lower.
В моём случае, я выбрал имя Ева и начал мучать бедную AI-женщину. Ева от меня получила старые исходники, собранные совместными усилиями Junie, ChatGPT и Claude (моего участия там почти не было) и сразу предложила некоторые исправления.
Следующие пять с лишним часов я выступал в роли прокладки между окном с LLM и веб-хостингом, заливая новые версии и тестируя их, находя баги и докладывая о них нейронке.
И знаете, что я вам скажу — у Евы такой большой контекст, что я был в полнейшем восторге 🌚. Эта думающая нейротварь периодически ссылалась на замечания, сделанные в самом начале и вскользь, и даже если давала небольшие исправления по коду, то держала в “голове” весь проект.
Первые несколько попыток оказались так себе, но я сменил тактику и начал давать буквально атомарные задачи, маленькими шажками. Четвёртый заход стал самым удачным, настолько, что вкладка в браузере выжрала 2 гигабайта оперативки от количества сообщений:
Нейронка действительно отличается от джуна-программиста. Если бы человеку я поставил первую задачу “сделай генерацию поля и логику “свапа”, т.е. обмена фишек местами”, то в случае с Gemini итерации были следующими:
-
Нарисуй поле 7х7
-
Теперь заполни его фишками пяти разных цветов
-
Теперь при нажатии на фишку добавь её визуальное выделение
-
Далее сделай обмен фишек местами. Дополнительная логика не нужна.
-
Теперь добавь анимацию обмена. Активная фишка должна пролетать над верхней.
-
Теперь добавь логику вычисления мэтча
И так далее. Такой подход позволяет ИИ не метаться между подзадачами и фокусироваться на одной проблеме за раз, что и нужно.
Из смешного: в один момент Ева начала упоминать, что “вот теперь моё решение сработает на 100%”, а когда я утверждал обратное, просто извинялась, но предлагала дальнейшие действия.
Пришлось даже “притормозить” AI, чтобы не делать рандомные правки. Кажется, что “держать весь контекст в голове” — это не всегда здорово, потому что в случае с Gemini у ИИ в контексте все предыдущие версии кода, включая нерабочие, которые могут влиять на решение. По итогу просто скинул ещё раз весь код, после чего ВНЕЗАПНО нейромозг предложил рабочий вариант.
Приятно удивило и то, что Gemini “знает” про Telegram Mini Apps, мне даже не пришлось скидывать документацию, просто по ключевым словам Ева объяснила, как адаптировать стиль игры под тему в телеграме, как добавить кнопку настроек (прямо сейчас она выключена, это на будущее).
Инфраструктурная часть
Я думал, что достаточно сделать саму игру, положить её на какой-то домен и сделать ссылку в каком-нибудь боте. Какой же я был наивный… На “обвязку” вокруг игры у меня ушло чуть ли не больше времени.
В качестве хостинга я решил использовать 2038.host. В своё время мне рассказали про этот маленький нишевый проект чувака из Латвии. За $5 единоразово вы получаете хостинг с 1 гигабайтом на диске, поддомен по выбору и доступ по SFTP. И всё это будет работать до 2038 года.
Также ещё нужна аналитика, чтобы понимать, насколько вообще этим пользуются и есть ли смысл развивать дальше. У меня есть поднятый инстанс SigNoz, где я мониторю некоторые другие приложения, но отправка данных туда сделана (мной) просто отвратительно, а откладывать запуск ещё на несколько дней только лишь по этой причине не хотелось. Посему принял решение просто класть данные в DynamoDB от AWS через lambda-функцию. Сами лямбды я делать умею, а вот интегрировать с другими сервисами AWS — не очень. Но и тут Ева пришла на помощь: объяснила детально, как создать роль, как создать таблицу в DynamoDB, проверила схему данных и дала пример интеграции. В общем, этот момент мы проскочили на высокой скорости и это круто. Просто пишешь “не понимаю, объясни ещё раз более простыми словами” и это работает! [2]
Дошло до того, что я просто дал Еве исходники телеграмного сайта и их CSS-файлов (65 тысяч токенов улетело за раз!) и сказал: сделай мне страничку в том же стиле. Она сделала. Дал следующую команду: сгенерируй мне политику приватности и учётом таких-то параметров. Сделала. А теперь то же самое, но на русском языке и кросс-ссылки. Готово! Буквально 10 минут и всё готово, я в шоке.
И немного про саму игру
Странно, что этот пункт я пишу в самом конце, но лучше хоть где-то. Самый простой способ — это пойти в бота https://t.me/ZenMatch3bot и там либо отправить любое сообщение, либо открыть через профиль (а после запуска в списке чатов рядом с ботом будет кнопка Open). Можете даже добавить иконку игры на рабочий стол смартфона, если настолько упоретесь.
Само веб-приложение доступно и отдельно: https://duckparty.2038.io/match3/, подойдёт, если на конкретном девайсе нет телеграма.
Управление сделано через нажатия, мой вайб-кодинг свайпов ни к чему хорошему не привёл, оставлю это на будущее.
Специально нет никаких таймеров, счётчиков очков или ходов [3]. Есть внутренний счётчик оставшихся ходов, который просто предложит начать новую игру, если нет больше никаких потенциальных мэтчей на поле. Кстати, я решил проверить, какой шанс получить такой game over, написал (конечно, через ChatGPT) скрипт, который 10 миллионов раз генерирует поле и проверяет наличие потенциальных мэтчей. В среднем, шанс выходит 8%, но у меня пока не получилось столкнуться с таким исходом во время обычной игры. Может быть, вам повезёт больше.
У меня в голове сейчас два пути развития. Первый — добавить больше “дзен-фич”, типа таймера, чтобы игра сама останавливалась после определённого числа ходов или минут, чтобы никуда не опоздать. Второй — сделать отдельную новую версию на основе этой, добавить всякие бонусы, типа бомбочек, выбор фишек и какую-нибудь очень лайтовую монетизацию, чтобы иметь небольшую копеечку фоном.
Или всегда можно забить и делать что-то ещё. Время покажет.
P.S.
Gemini ещё и видео генерировать умеет (тоже бесплатно в AI Studio, но с лимитами). Правда, пока получается не очень, про то, как выглядят игры жанра “три-в-ряд” ИИ не очень знает. Ну, ничего, ещё научится.
Промт для видео ниже:
A teenager playing a match-3 game on an iPhone. The camera is positioned slightly behind and to the side, showing part of the teen’s head and right shoulder. The iPhone is clearly visible in both hands, with the game screen fully in view.
Примечания
[1] Правда, меня никто и не спрашивал 😄
[2] Небольшой оффтоп: частенько в айтишных чатиках я вижу (ну, чего греха таить, и там так делаю), как более опытные разработчики кекают с того, как менее опытные падаваны пишут код с ChatGPT. Но со временем я начал смотреть на это с другой стороны: нейронка настроена на помощь, она, может, и ошибается иногда, но всё равно будет пытаться дать решение. А кожаные мешки в чатиках только кекают и издеваются (и иногда помогают). Конечно, разработчик пойдет к LLM, который не подшучивает.
[3] Зато есть “пасхалка” с отсылкой к песне Тейлор Свифт!