В прошлой статье я поделился опытом, как писал с помощью ИИ кастомный TO-DO-лист под macOS. Опыт оказался противоречивым, но приложение всё-таки получилось и даже работало.
Поэтому я решил добавить немного фана и реализовать мечту любого программиста — написать собственную игру. Так как у меня уже появилось небольшое понимание экосистемы десктоп-приложений под macOS и SwiftUI, я решил использовать именно её.
Меня всегда восхищали две простые, но затягивающие игры-головоломки:
«Сапёр» (Minesweeper) на Windows
Bomberman на Dendy
Поэтому я решил совместить их идеи и получить StarDust Collector:
игровое поле 9×9
мы устанавливаем бомбы
каждая бомба раскрывает ячейки крестом (2 клетки вверх, вниз, влево, вправо + центр)
на поле есть камни, которые блокируют распространение взрывной волны
на поле спрятано ровно 6 звёзд
каждая звезда окружена «звёздной пылью» — подсказками, показывающими, что рядом есть звезда
Наша задача — за 9 бомб найти все 6 звёзд.
Если отбросить визуальный интерфейс, то суть игры сводится к следующему:
Матрица 9×9 = 81 ячейка.
Функция открытия: за один ход открывает до 9 ячеек крестом (2 вверх, 2 вниз, 2 влево, 2 вправо + центр).
Есть камни, которые блокируют распространение взрыва на соседние ячейки.
Есть «звёздная пыль» — ячейки, которые подсказывают, что в одной из соседних находится звезда.
У нас ровно 9 попыток (бомб).
Между любыми двумя звёздами должно быть минимум одно поле (звёзды не могут стоять вплотную).
На первый взгляд кажется, что 9 бомб × 9 ячеек = 81 — этого должно хватить, чтобы открыть всё поле. Но камни и границы матрицы сильно снижают эффективность каждого хода, поэтому открыть все ячейки за 9 попыток невозможно.
С другой стороны, «звёздная пыль» даёт подсказки, где вероятнее всего искать звёзды. Поэтому задача сводится к жадному алгоритму: на каждом шаге выбирать клетку, которая откроет максимальное количество неизвестных ячеек, а затем использовать полученную информацию для более точных предсказаний.
enum Cell { EMPTY, ROCK, SPARKLE, BIG_STAR, BOMB } public class GameBoardTyped { private static final Cell E = Cell.EMPTY; private static final Cell R = Cell.ROCK; private static final Cell S = Cell.SPARKLE; private static final Cell B = Cell.BIG_STAR; private static final Cell M = Cell.BOMB; public static void main(String[] args) { Cell[][] board = { // A B C D E F G H I { E, E, E, E, E, E, E, E, E }, // 9 { E, E, R, E, E, E, R, S, R }, // 8 { R, S, S, R, E, R, S, E, E }, // 7 { E, E, S, R, E, E, R, E, R }, // 6 { R, S, E, S, E, E, E, E, E }, // 5 { E, E, E, S, E, E, E, E, E }, // 4 { E, E, R, E, B, S, E, R, E }, // 3 { E, E, E, S, E, E, R, E, E }, // 2 { R, R, E, E, E, E, E, M, E } // 1 }; // Можно дальше работать с этой матрицей } }
Я загрузил условия игры в Grok и спросил: можно ли в 100 % случаев найти все звёзды за 9 ходов? К моему удивлению, он ответил: «Да!»
Попросив пересказать условия, я убедился, что он их понял правильно. Тогда я начал играть: делал скриншот поля, просил Grok выбрать следующую клетку, присылал результат и просил сделать следующий ход. Из 8 партий он выиграл только в 3, а в 5 проиграл.
Самое забавное: каждый раз, когда я спрашивал «Как так вышло, что ты проиграл, если говорил, что можно выиграть в 100 % случаев?», он упрямо стоял на своём.
Тут всё получилось гораздо лучше, чем я ожидал. Я описал концепцию игры, свои ожидания и технические требования к формату иконок. Grok буквально за 15 минут выдал десяток вариантов, из которых я выбрал подходящий.
Потом в онлайн-редакторе ИИ я немного подтюнил изображение, убрал фон и разбил иконку на все нужные размеры для SwiftUI.
Создал новое приложение под macOS в Xcode.
Открыл проект в Cursor (AI-редактор кода на базе больших языковых моделей).
Описал задачу: логика игры + интерфейс + необходимые экраны.
Исправлял косяки рендеринга окон и поведения (это были самые сложные этапы).
Применил SwiftUI-rules.md к проекту и правил ошибки.
Добавил SwiftLint, применил правила и исправил предупреждения.
Всё это делается довольно быстро, но часто приходится перегенерировать код несколько раз, пока Cursor не выдаст рабочую версию.
Попросил Cursor найти бесплатные звуки для игры. Он выдал список ссылок, но отказался писать код для автоматической загрузки (видимо, из соображений безопасности). Зато с интеграцией звуков и переключением режимов справился без проблем.
Я не скачаю для тебя файлы, наивный гринго, но я дам тебе прямые ссылки, где ты сможешь их скачать. Я же не пирачу файлы!
Изначально Grok набросал макеты, которые были приемлемыми, но довольно простыми. Попытки заставить его следовать стилю «матового стекла» (glassmorphism / vibrancy-эффекты, как в современных версиях macOS) провалились — похоже, в модели пока недостаточно примеров такого дизайна.
В итоге я сам сформировал основной дизайн, который мне понравился, а затем попросил Grok создать несколько цветовых тем в духе системных тем macOS (тёмная/светлая, акценты как в iOS). С этим он справился отлично.
В macOS приложение может содержать несколько окон. При перемещении между окнами с разным размером возникают неприятные глитчи размеров и расположения элементов.
Я перепробовал около 10 вариантов промптов — ничего не помогло. В итоге пришлось вручную разобраться, как работает рендеринг в SwiftUI, и подсказать ИИ нужные правки. Думаю, что человек без опыта программирования на этом этапе может застрять.
Чем больше опыта, тем больше требований к себе: правильная архитектура, чистый код, следование гайдлайнам… В итоге каждый пет-проект превращается в работу.
Плюс появляется вопрос: если я трачу столько времени, может, стоит заложить в проект какую-то полезную функциональность или коммерческий потенциал?
С ИИ всё проще: промпты можно писать уставшим вечером, результат проверяется визуально, а не через code review, времени уходит мало. Поэтому делать игру-головоломку под macOS оказывается эмоционально гораздо легче, чем собирать «серьёзный» MVP после работы.
Не советую ставить непонятное приложение от неизвестного разработчика. Поэтому вот ссылка на GitHub: https://github.com/bakotiinii/stardust-collector Можете посмотреть код, проверить на вирусы и собрать проект под себя.
В репозитории есть папка builds с готовыми сборками:
для Ma с Intel
для Mac с Apple Silicon (Я проверял только Intel-версию — запускается без проблем. Apple Silicon можете проверить сами.)
Создание MVP на незнакомом стеке с помощью ИИ стало намного проще и быстрее. Конечно, это ещё не продакшен-уровень, который можно сразу отдавать клиентам, но уже вполне достойный результат.
Остаётся только вопрос: нужно ли индустрии столько разных MVP? Как когда-то с сайтами — каждый смог сделать страничку на WordPress или конструкторе, и оказалось, что большинству это и не нужно. Возможно, нас ждёт что-то похожее и с приложениями.
Источник


