В ноябре (2025) проходило соревнование по вайбкодингу от Яндекса. У меня было 2 свободных дня на праздниках, поэтому решила поучаствовать и выбрала тему из списка: «AI тамагочи».
У меня некоторая потребность к созданию чего-то красивого, каких-то игр, персонажей, так как в обычной разработческой жизни из красивого приходится только «красить кнопочки».
Сразу покажу финальный результат, что вышло за примерно 10 часов. Суть была в том, что все реплики и общение с котиком генерируется в реальном времени через GPT (типа такой ИИ функционал). А в дальнейшем уже планировалось ввести какой-то чат с котиком, с сохранением истории и персонализацией.

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

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

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

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


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

И последним в списке шёл Claude, к которому я испытываю то любовь, то ненависть, так как иногда он выдаёт мне гениальные и простые решения на порядок лучше GPT. Но зачастую наоборот, я от него устаю.
В этот раз он превзошёл себя, именно сгенерированный Claude код я и использовала в итоге.
Не заскринила, что получилось вначале, но в общем у меня был работающий функционал, но не было никаких картинок: ни котика, ни фона, ничего. Я глупо надеялась, что основная часть работы выполнена, осталось всего лишь нагенерить картиночек...
Ох, как я ошибалась, мне нужно было сделать 4 разных состояния кота: сонный, бодрый, голодный и игривый. Я по-привычке всякие картинки делаю в GPT, попросила его сделать мне 4 пиксельных png котика без хвоста с прозрачным фоном. Он, конечно, сделал попытку, но выдал разных котов разного размера и степени кринжовости.
Вот тут-то я и застряла на пару часов, уговаривая сделать мне одинаковых котов в одном стиле. Уже хотела психануть и всё бросить, но тут вспомнила про Sora. Там с первого же промпта у меня вышло сделать сразу 4 картинки котика и фоны. Затем, обрадовавшись, что так всё легко пошло, я нагенерила картинок для "магазина", для "настроек", всякие мелочи для главного экрана, в общем заменила абсолютно все стандартные иконки на новые.
Какой вывод. Для меня самое сложное в разработке чего-то своего - это дизайн. Написать код - это легко, но мы все в первую очередь оцениваем визуал и какой бы классный функционал у приложения не был, если внешне оно некрасивое, то и шансы на успех сильно уменьшаются сразу же.
Так что Котаны-кодеры, кто как делает дизайн для приложений, поделитесь своими лайфхаками и секретами!
Ссылочка на проект на GitHub тут.
rPman
ценнейшая рекомендация всем кто вайбкодит, в реальности именно так и происходит, почему люди думают что с ИИ будет по другому.
Следующим шагом вам с ИИ нужно составить план, вот вы тут делаете код, тут занимаетесь usability (собственно интерфейс нужно тоже описывать не абы ка бы, и все должно проходить через жесткий диалог с вами), тут картинки (это не только картинки, но и их размеры, подгонка под интерфейс, банально направление взгляда котика), тут порядок организации файлов и их именование,.. я прямо вижу что об игре у вас смутное представление, ее план тоже нужно составлять (до ТЗ), потом, когда рабочий код создан, нужен цикл тестирования и подгонка гиперпараметров игры...
И так надо делать, даже если у вас пресловутая коровья кликалка (кнопка с картинкой 'коровы', при нажатии говорит му, нельзя нажимать часто, но можно купить возможность кликать чаще,.. помню был такой эксперимент, его автор заработал за недели десятки тысяч баксов)