В ноябре (2025) проходило соревнование по вайбкодингу от Яндекса. У меня было 2 свободных дня на праздниках, поэтому решила поучаствовать и выбрала тему из списка: "AI тамагочи".
У меня некоторая потребность к созданию чего-то красивого, каких-то игр, персонажей, так как в обычной разработческой жизни из красивого приходится только "красить кнопочки".
Сразу покажу финальный результат, что вышло за примерно 10 часов. Суть была в том, что все реплики и общение с котиком генерируется в реальном времени через GPT (типа такой ИИ функционал). А в дальнейшем уже планировалось ввести какой-то чат с котиком, с сохранением истории и персонализацией.
Теперь по порядку, что и как делала:
Для начала в ChatGPT написала, что я хочу и попросила задать мне миллион уточняющих вопросов прежде чем выдавать ответ.Это мой личный лайфхак, так как если просто самой писать промпт, то получится какашка. А так я пишу что-то типа: "Хочу сделать приложение тамагочи с котиком, iOS, Xcode, SUI. Задай мне все необходимые вопросы прежде чем давать ответ". После этого он реально пишет тонну шикарных вопросов, отвечая на которые я уже точно и чётко формулирую ТЗ.
Дальше я попросила сам GPT сформулировать окончательное ТЗ и написать мне его. После этого я решила это ТЗ опробовать на нескольких разных ИИ.
Вот шаблон промпта:
Да, я определённо могу помочь вам создать AI Тамагочи котика на SwiftUI с пиксельной графикой в жёлто-оранжевых цветах! Основываясь на ваших подробных требованиях, я разработал комплексное решение, которое полностью соответствует условиям соревнования и включает все необходимые компоненты: анимации дыхания и хвоста, пиксельную графику, интеграцию с GPT API, SwiftData для персистентности и систему ухода за котом в реальном времени.
Приложение построено на архитектуре MVVM (Model-View-ViewModel) с использованием паттерна State Machine для управления состояниями кота. Это обеспечивает чёткое разделение ответственности: модели данных отделены от бизнес-логики, а UI-компоненты остаются лёгкими и переиспользуемыми. SwiftUI прекрасно сочетается с MVVM благодаря встроенной системе привязки данных через @State, @Observable и @Binding.
Состояния кота управляются через 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
AI-сервис построен на асинхронных запросах к OpenAI API с использованием модели GPT-3.5-turbo. Каждый запрос ограничен 30 токенами и температурой 0.8 для баланса между креативностью и релевантностью ответов.
Для минимизации API-вызовов и работы в офлайн-режиме реализована система кэширования. Фразы сохраняются в словаре [String: String], где ключ — контекст состояния кота, а значение — сгенерированная фраза. При повторных запросах с идентичным контекстом используется кэшированный ответ.
AI получает контекст о текущем состоянии кота (уровни потребностей, эмоциональное состояние), что позволяет генерировать релевантные короткие фразы на русском языке (3-10 слов) с лёгким юмором. Например: "Мяу! Давай поиграем! ?" или "Ммм, так вкусно! ?".
Встроен фильтр для исключения неуместного контента через системный промпт, который подчёркивает, что кот должен быть "милым и позитивным".
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.
Все элементы используют относительные размеры через GeometryReader для корректного отображения на разных размерах iPhone. Спрайты масштабируются пропорционально ширине экрана, сохраняя соотношение сторон.
Все интерактивные элементы размещены с учётом безопасных зон через .safeAreaInset модификатор, обеспечивая совместимость с iPhone с вырезами.
Для доступности текст поддерживает 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 пуша в день при низких показателях
✅ Звуки: Тихие мяу и мур при взаимодействии
✅ Короткие фразы: 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 тут.
