В ноябре (2025) проходило соревнование по вайбкодингу от Яндекса. У меня было 2 свободных дня на праздниках, поэтому решила поучаствовать и выбрала тему из списка: «AI тамагочи».

У меня некоторая потребность к созданию чего-то красивого, каких-то игр, персонажей, так как в обычной разработческой жизни из красивого приходится только «красить кнопочки».

Сразу покажу финальный результат, что вышло за примерно 10 часов. Суть была в том, что все реплики и общение с котиком генерируется в реальном времени через GPT (типа такой ИИ функционал). А в дальнейшем уже планировалось ввести какой-то чат с котиком, с сохранением истории и персонализацией.

ChatGPT
ChatGPT

Теперь по порядку, что и как делала:

  1. Для начала в ChatGPT написала, что я хочу и попросила задать мне миллион уточняющих вопросов прежде чем выдавать ответ.Это мой личный лайфхак, так как если просто самой писать промпт, то получится какашка. А так я пишу что-то типа: "Хочу сделать приложение тамагочи с котиком, iOS, Xcode, SUI. Задай мне все необходимые вопросы прежде чем давать ответ". После этого он реально пишет тонну шикарных вопросов, отвечая на которые я уже точно и чётко формулирую ТЗ.

  2. Дальше я попросила сам GPT сформулировать окончательное ТЗ и написать мне его. После этого я решила это ТЗ опробовать на нескольких разных ИИ.

Вот шаблон промпта:

Скрытый текст

AI Тамагочи Котик на SwiftUI: Полное Руководство по Разработке

Да, я определённо могу помочь вам создать AI Тамагочи котика на SwiftUI с пиксельной графикой в жёлто-оранжевых цветах! Основываясь на ваших подробных требованиях, я разработал комплексное решение, которое полностью соответствует условиям соревнования и включает все необходимые компоненты: анимации дыхания и хвоста, пиксельную графику, интеграцию с GPT API, SwiftData для персистентности и систему ухода за котом в реальном времени.

Архитектура Проекта

Приложение построено на архитектуре MVVM (Model-View-ViewModel) с использованием паттерна State Machine для управления состояниями кота. Это обеспечивает чёткое разделение ответственности: модели данных отделены от бизнес-логики, а UI-компоненты остаются лёгкими и переиспользуемыми. SwiftUI прекрасно сочетается с MVVM благодаря встроенной системе привязки данных через @State@Observable и @Binding.​

Структура State Machine

Состояния кота управляются через enum CatState, который включает четыре основных состояния: нейтральное, радостное, сонное и голодное. Каждое состояние имеет свой спрайт (96×96 пикселей в масштабе 2x для экранов Retina) и цветовую схему. Такой подход гарантирует предсказуемые переходы между состояниями и упрощает отладку.​

Система Анимаций

Анимация Дыхания

Ключевая фича — реалистичная анимация дыхания, создающая ощущение живого персонажа. В SwiftUI это реализуется через .offset() модификатор с циклической анимацией easeInOut длительностью 1.2 секунды и амплитудой 2-3 пикселя. Анимация автоматически повторяется с repeatForever(autoreverses: true), создавая плавное движение вверх-вниз, имитирующее вдох и выдох.​​

swiftwithAnimation(
    .easeInOut(duration: 1.2)
    .repeatForever(autoreverses: true)
) {
    breathingOffset = -3
}

withAnimation( .easeInOut(duration: 1.2) .repeatForever(autoreverses: true) ) { breathingOffset = -3 }

Анимация Хвоста

Хвост кота реализован как отдельный слой с rotationEffect, создающий покачивание с амплитудой 15 градусов и периодом 0.8-1.0 секунды. Это добавляет дополнительную живость персонажу, даже когда он находится в статичном состоянии idle.​​

Моргание

Моргание реализовано через таймер с случайными интервалами 3-7 секунд. При срабатывании таймера выполняется быстрая анимация изменения opacity (0.1 секунды на закрытие глаз и 0.1 на открытие), создавая естественный эффект моргания.​​

Анимация Ходьбы

Для перехода между комнатами используется простая анимация ходьбы: при смене фона спрайт кота переключается между двумя кадрами движения лапок с частотой 0.5 секунды на кадр, одновременно применяется .offset() для создания иллюзии движения. Все фоны (дом, кухня, спальня, двор) выполнены в пиксельном стиле 8-бит с тёплой жёлто-оранжевой палитрой.​

Пиксельная Графика

Спрайты и Рендеринг

Все спрайты имеют базовый размер 96×96 пикселей и отображаются с интерполяцией .none для сохранения чёткости пиксельной графики. Цветовая палитра включает:#F2C94C (основной жёлтый), #F2994A (оранжевый), #E67E22 (насыщенный оранжевый), #8C4A1E (тёмно-коричневый), плюс белый и чёрный для контуров и акцентов.​

Спрайт-листы

Для каждого состояния кота создаётся отдельный спрайт с вариациями для анимации дыхания. При работе с малыми спрайтами критически важно соблюдать принцип "один пиксель имеет значение" — движение даже на 1 пиксель в спрайте 96×96 составляет примерно 1% от ширины, что создаёт заметное визуальное изменение.​

Геймплей и Механики Ухода

Система Потребностей

Четыре основных параметра (еда, сон, игра, прогулки) деградируют со скоростью ~1% каждые 10 минут в реальном времени. Это реализовано через таймер, который каждую минуту вызывает метод updateNeeds() в модели данных. Расчёт деградации учитывает время, прошедшее с последнего обновления, что позволяет корректно обрабатывать ситуации, когда приложение было закрыто.​​

Действия Пользователя

  • Кормление: +30% к уровню еды, +1 монета, счастливое состояние, звук "мяу"​

  • Сон: +40% к уровню сна, звук мурчания​

  • Игра: +25% к уровню игры, счастливое состояние​

  • Прогулка: +35% к уровню прогулки, +2 монеты​

Система Монет и Магазин

За выполнение действий игрок получает монеты, которые можно потратить в фейковом магазине на аксессуары для кота. Это создаёт дополнительную мотивацию для регулярного взаимодействия с приложением.​

Жестовые Взаимодействия

Тап-жесты

Простой тап переводит кота в радостное состояние, воспроизводит звук "мяу" и генерирует AI-фразу от кота. Реализация через .onTapGesture модификатор обеспечивает мгновенный отклик.​

Долгое Нажатие

Долгое нажатие (long press) длительностью более 0.5 секунды активирует режим мурчания с тактильной обратной связью через haptic feedback. Это создаёт ощущение физического контакта с котом и усиливает эмоциональную связь пользователя с питомцем.​​

swift.onLongPressGesture(minimumDuration: 0.5) {
    soundManager.play(.purr)
    UIImpactFeedbackGenerator(style: .medium).impactOccurred()
}

.onLongPressGesture(minimumDuration: 0.5) { soundManager.play(.purr) UIImpactFeedbackGenerator(style: .medium).impactOccurred() }

Mobile app interface design concept for AI Tamagotchi cat game 

Интеграция с OpenAI GPT API

Архитектура AI-сервиса

AI-сервис построен на асинхронных запросах к OpenAI API с использованием модели GPT-3.5-turbo. Каждый запрос ограничен 30 токенами и температурой 0.8 для баланса между креативностью и релевантностью ответов.​

Кэширование Фраз

Для минимизации API-вызовов и работы в офлайн-режиме реализована система кэширования. Фразы сохраняются в словаре [String: String], где ключ — контекст состояния кота, а значение — сгенерированная фраза. При повторных запросах с идентичным контекстом используется кэшированный ответ.​

Контекстная Генерация

AI получает контекст о текущем состоянии кота (уровни потребностей, эмоциональное состояние), что позволяет генерировать релевантные короткие фразы на русском языке (3-10 слов) с лёгким юмором. Например: "Мяу! Давай поиграем! ?" или "Ммм, так вкусно! ?".​​

Фильтр Контента

Встроен фильтр для исключения неуместного контента через системный промпт, который подчёркивает, что кот должен быть "милым и позитивным".​

Персистентность Данных с SwiftData

Модель Данных

SwiftData — новый фреймворк Apple для персистентности, представленный на WWDC 2023. В отличие от Core Data, он использует нативный Swift синтаксис с макросом @Model, что делает код чище и понятнее.​​

swift@Model
class CatData {
    var foodLevel: Double
    var sleepLevel: Double
    var playLevel: Double
    var walkLevel: Double
    var coins: Int
    var lastUpdateTime: Date
    var accessories: [String]
}

@Model class CatData { var foodLevel: Double var sleepLevel: Double var playLevel: Double var walkLevel: Double var coins: Int var lastUpdateTime: Date var accessories: [String] }

Автоматическая Синхронизация

SwiftData автоматически отслеживает изменения в моделях и синхронизирует их с хранилищем. Это достигается через ModelContext, который внедряется в SwiftUI view через .modelContainer() модификатор. При изменении любого свойства модели SwiftData автоматически сохраняет обновления.​​

Обработка Фонового Времени

При открытии приложения после длительного отсутствия метод updateNeeds() вычисляет прошедшее время и пропорционально уменьшает уровни потребностей. Это обеспечивает реалистичную симуляцию, где кот "живёт" даже когда приложение закрыто.​

Обработка Нажатий

При тапе на уведомление приложение открывается и сразу фокусируется на соответствующем действии (например, открывает экран кормления).​

Звуковые Эффекты

Менеджер Звуков

SoundManager использует AVAudioPlayer для воспроизведения звуков. Все звуки предзагружаются при инициализации менеджера через prepareToPlay() для мгновенного воспроизведения без задержек.​​

Типы Звуков

  • Мяу (meow.wav) — короткий звук длительностью ~0.3 секунды, воспроизводится при тапе и кормлении​​

  • Мурчание (purr.wav) — мягкий звук ~0.5 секунды для долгого нажатия​​

Громкость установлена на 0.3 для ненавязчивого звучания.​

Экраны Приложения

Главный Экран (Дом)

Отображает анимированного кота на фоне тёплого градиента, четыре индикатора потребностей в виде цветных полосок, счётчик монет и кнопки действий. Фраза кота отображается в речевом облачке над головой.​​

Магазин

Простой grid из доступных аксессуаров (шляпки, бантики, игрушки) с ценами в монетах. При покупке аксессуар добавляется в массив accessories и отображается на коте.​​

Настройки

Включает переключатели для звука, уведомлений, информацию о приложении и кнопку сброса прогресса. Использует стандартные SwiftUI компоненты Toggle и Button.​​

Адаптация под iPhone

Масштабирование UI

Все элементы используют относительные размеры через GeometryReader для корректного отображения на разных размерах iPhone. Спрайты масштабируются пропорционально ширине экрана, сохраняя соотношение сторон.​

Safe Area

Все интерактивные элементы размещены с учётом безопасных зон через .safeAreaInset модификатор, обеспечивая совместимость с iPhone с вырезами.​

Dynamic Type

Для доступности текст поддерживает Dynamic Type, позволяя пользователям с нарушениями зрения увеличивать размер шрифта.​

Оптимизация Производительности

Таймеры

Вместо SwiftUI Timer.publish(), который может быть неточным под нагрузкой, критические обновления (деградация потребностей) используют Timer.scheduledTimer с явным указанием run loop. Это гарантирует точность обновлений ±2 секунды.​

Рендеринг

Пиксельная графика рендерится с интерполяцией .none для максимальной чёткости и производительности. SwiftUI автоматически оптимизирует перерисовку только изменённых view благодаря своей декларативной природе.​

Анимации

Все анимации используют GPU-ускорение через модификаторы типа .offset().rotationEffect() и .scaleEffect(), которые не вызывают перекомпиляцию view.​

Соответствие Требованиям Соревнования

Технические Требования

✅ iOS 17+: Все API совместимы с iOS 17, SwiftData требует минимум iOS 17​
✅ iPhone Only: Layout адаптирован для iPhone с использованием GeometryReader​
✅ Без Бэкенда: GPT API вызывается напрямую, все данные хранятся локально через SwiftData​
✅ Офлайн-режим: Кэширование фраз + минимальное использование API обеспечивает базовую работу без сети​

Визуальные Требования

✅ 8-бит стиль: Спрайты 96×96 с палитрой 6-8 цветов, чёткие пиксели​
✅ Жёлто-оранжевая палитра: #F2C94C, #F2994A, #E67E22, #8C4A1E
✅ Дыхание: 2-3px амплитуда, 1.2с цикл​
✅ Хвост: 15° покачивание, 0.9с цикл
✅ Пиксельные фоны: Кухня, спальня, двор в стиле 8-бит

Геймплейные Требования

✅ Потребности: Еда, сон, игра, прогулки с деградацией 1%/10мин
✅ Монетизация: Фейковый магазин с аксессуарами​
✅ Уведомления: 2-3 пуша в день при низких показателях​​
✅ Звуки: Тихие мяу и мур при взаимодействии​​

AI и Персонализация

✅ Короткие фразы: 3-10 слов на русском с эмодзи​​
✅ Контекстные реплики: На основе состояния кота​
✅ Фильтр контента: Только позитивные милые фразы​
✅ Кэширование: Минимум сетевых запросов​

Заключение

Этот проект полностью реализуем на SwiftUI и соответствует всем вашим требованиям. Комбинация пиксельной эстетики, плавных анимаций, AI-интеграции и реалистичной системы ухода создаёт увлекательный опыт цифрового питомца. SwiftUI предоставляет все необходимые инструменты для анимаций (offset, rotation, opacity), SwiftData упрощает персистентность, а интеграция с GPT API добавляет уникальный AI-компонент, выделяющий приложение среди конкурентов. Архитектура MVVM с State Machine обеспечивает чистый, масштабируемый и тестируемый код, готовый к дальнейшему развитию.

Код примеры, структура проекта, цветовая палитра, механики игры и таймлайн анимаций полностью документированы и готовы к имплементации. Успехов в разработке вашего AI Тамагочи котика! ?✨

Небольшой спойлер: дальше будет довольно странный набор ИИ для сравнения. Почему я взяла именно их? Кто знает... Возможно потому что тремя из них пользуюсь в обычной жизни для разных задач. А Cursor мне нужен был пару раз для тестов.

Что получилось в ChatGPT с этим промтом:

ChatGPT
ChatGPT

Далее я пошла в Cursor (он у меня, правда, бесплатный, так как я им не пользуюсь, но решила всё же попробовать скормить ему тот же промпт). Вот что вышло (картинки кота и фона я сама добавила для наглядности):

Раз уж мы идём во все тяжкие, то дальше я воспользовалась Perplexity. Он хорош в написании веб приложений, но в iOS-коде просто отвратителен. Вот что вышло вначале:

После уговоров сделать мне всё же файлы для Xcode, он мне выдал PDF-файл, без форматирования, который я час копировала и исправляла в Xcode:

PDF от Perplexity
PDF от Perplexity
Как это выглядело в коде
Как это выглядело в коде

В общем после исправления всего этого шлака - лучше не стало, зря потратила час.

Perplexity
Perplexity

И последним в списке шёл Claude, к которому я испытываю то любовь, то ненависть, так как иногда он выдаёт мне гениальные и простые решения на порядок лучше GPT. Но зачастую наоборот, я от него устаю.

В этот раз он превзошёл себя, именно сгенерированный Claude код я и использовала в итоге.

Не заскринила, что получилось вначале, но в общем у меня был работающий функционал, но не было никаких картинок: ни котика, ни фона, ничего. Я глупо надеялась, что основная часть работы выполнена, осталось всего лишь нагенерить картиночек...

Ох, как я ошибалась, мне нужно было сделать 4 разных состояния кота: сонный, бодрый, голодный и игривый. Я по-привычке всякие картинки делаю в GPT, попросила его сделать мне 4 пиксельных png котика без хвоста с прозрачным фоном. Он, конечно, сделал попытку, но выдал разных котов разного размера и степени кринжовости.

Вот тут-то я и застряла на пару часов, уговаривая сделать мне одинаковых котов в одном стиле. Уже хотела психануть и всё бросить, но тут вспомнила про Sora. Там с первого же промпта у меня вышло сделать сразу 4 картинки котика и фоны. Затем, обрадовавшись, что так всё легко пошло, я нагенерила картинок для "магазина", для "настроек", всякие мелочи для главного экрана, в общем заменила абсолютно все стандартные иконки на новые.

Какой вывод. Для меня самое сложное в разработке чего-то своего - это дизайн. Написать код - это легко, но мы все в первую очередь оцениваем визуал и какой бы классный функционал у приложения не был, если внешне оно некрасивое, то и шансы на успех сильно уменьшаются сразу же.

Так что Котаны-кодеры, кто как делает дизайн для приложений, поделитесь своими лайфхаками и секретами!

Ссылочка на проект на GitHub тут.

Комментарии (1)


  1. rPman
    07.01.2026 04:36

    Задай мне все необходимые вопросы прежде чем давать ответ

    ценнейшая рекомендация всем кто вайбкодит, в реальности именно так и происходит, почему люди думают что с ИИ будет по другому.

    Следующим шагом вам с ИИ нужно составить план, вот вы тут делаете код, тут занимаетесь usability (собственно интерфейс нужно тоже описывать не абы ка бы, и все должно проходить через жесткий диалог с вами), тут картинки (это не только картинки, но и их размеры, подгонка под интерфейс, банально направление взгляда котика), тут порядок организации файлов и их именование,.. я прямо вижу что об игре у вас смутное представление, ее план тоже нужно составлять (до ТЗ), потом, когда рабочий код создан, нужен цикл тестирования и подгонка гиперпараметров игры...

    И так надо делать, даже если у вас пресловутая коровья кликалка (кнопка с картинкой 'коровы', при нажатии говорит му, нельзя нажимать часто, но можно купить возможность кликать чаще,.. помню был такой эксперимент, его автор заработал за недели десятки тысяч баксов)