В прошлой статье я поделился опытом, как писал с помощью ИИ кастомный TO-DO-лист под macOS. Опыт оказался противоречивым, но приложение всё-таки получилось и даВ прошлой статье я поделился опытом, как писал с помощью ИИ кастомный TO-DO-лист под macOS. Опыт оказался противоречивым, но приложение всё-таки получилось и да

Пишем игру-головоломку под macOS на SwiftUI [StarDust Collector]

В прошлой статье я поделился опытом, как писал с помощью ИИ кастомный TO-DO-лист под macOS. Опыт оказался противоречивым, но приложение всё-таки получилось и даже работало.

Поэтому я решил добавить немного фана и реализовать мечту любого программиста — написать собственную игру. Так как у меня уже появилось небольшое понимание экосистемы десктоп-приложений под macOS и SwiftUI, я решил использовать именно её.

ард режиме
ард режиме

Концепция

Меня всегда восхищали две простые, но затягивающие игры-головоломки:

  • «Сапёр» (Minesweeper) на Windows

  • Bomberman на Dendy

сапер
сапер
bomberman
bomberman

Поэтому я решил совместить их идеи и получить StarDust Collector:

  • игровое поле 9×9

  • мы устанавливаем бомбы

  • каждая бомба раскрывает ячейки крестом (2 клетки вверх, вниз, влево, вправо + центр)

  • на поле есть камни, которые блокируют распространение взрывной волны

  • на поле спрятано ровно 6 звёзд

  • каждая звезда окружена «звёздной пылью» — подсказками, показывающими, что рядом есть звезда

Наша задача — за 9 бомб найти все 6 звёзд.

negxhlkgjuaezykl64neseofpi0.png

Считаем

Если отбросить визуальный интерфейс, то суть игры сводится к следующему:

  1. Матрица 9×9 = 81 ячейка.

  2. Функция открытия: за один ход открывает до 9 ячеек крестом (2 вверх, 2 вниз, 2 влево, 2 вправо + центр).

  3. Есть камни, которые блокируют распространение взрыва на соседние ячейки.

  4. Есть «звёздная пыль» — ячейки, которые подсказывают, что в одной из соседних находится звезда.

  5. У нас ровно 9 попыток (бомб).

  6. Между любыми двумя звёздами должно быть минимум одно поле (звёзды не могут стоять вплотную).

На первый взгляд кажется, что 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

Я загрузил условия игры в Grok и спросил: можно ли в 100 % случаев найти все звёзды за 9 ходов? К моему удивлению, он ответил: «Да!»

Попросив пересказать условия, я убедился, что он их понял правильно. Тогда я начал играть: делал скриншот поля, просил Grok выбрать следующую клетку, присылал результат и просил сделать следующий ход. Из 8 партий он выиграл только в 3, а в 5 проиграл.

Самое забавное: каждый раз, когда я спрашивал «Как так вышло, что ты проиграл, если говорил, что можно выиграть в 100 % случаев?», он упрямо стоял на своём.

Грок на основе скриншота дает рекомендации по следующей бомбе
Грок на основе скриншота дает рекомендации по следующей бомбе

Создаём иконки с помощью Grok

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

Потом в онлайн-редакторе ИИ я немного подтюнил изображение, убрал фон и разбил иконку на все нужные размеры для SwiftUI.

lrnjsbzdbiqrcydkkpnegxnpynk.jpeg

Создаём базовый скелет

  1. Создал новое приложение под macOS в Xcode.

  2. Открыл проект в Cursor (AI-редактор кода на базе больших языковых моделей).

  3. Описал задачу: логика игры + интерфейс + необходимые экраны.

  4. Исправлял косяки рендеринга окон и поведения (это были самые сложные этапы).

  5. Применил SwiftUI-rules.md к проекту и правил ошибки.

  6. Добавил SwiftLint, применил правила и исправил предупреждения.

Всё это делается довольно быстро, но часто приходится перегенерировать код несколько раз, пока Cursor не выдаст рабочую версию.

Добавляем звуки

Попросил Cursor найти бесплатные звуки для игры. Он выдал список ссылок, но отказался писать код для автоматической загрузки (видимо, из соображений безопасности). Зато с интеграцией звуков и переключением режимов справился без проблем.
Я не скачаю для тебя файлы, наивный гринго, но я дам тебе прямые ссылки, где ты сможешь их скачать. Я же не пирачу файлы!

Добавляем дизайн

Изначально Grok набросал макеты, которые были приемлемыми, но довольно простыми. Попытки заставить его следовать стилю «матового стекла» (glassmorphism / vibrancy-эффекты, как в современных версиях macOS) провалились — похоже, в модели пока недостаточно примеров такого дизайна.

В итоге я сам сформировал основной дизайн, который мне понравился, а затем попросил Grok создать несколько цветовых тем в духе системных тем macOS (тёмная/светлая, акценты как в iOS). С этим он справился отлично.

цветовые схемы - прямо как айфоны
цветовые схемы - прямо как айфоны

Проблемы, которые ИИ так и не решил

В macOS приложение может содержать несколько окон. При перемещении между окнами с разным размером возникают неприятные глитчи размеров и расположения элементов.

Я перепробовал около 10 вариантов промптов — ничего не помогло. В итоге пришлось вручную разобраться, как работает рендеринг в SwiftUI, и подсказать ИИ нужные правки. Думаю, что человек без опыта программирования на этом этапе может застрять.

t7ddobzczr6ka5pafkowojk9fm8.png

Эмоциональная часть

Чем больше опыта, тем больше требований к себе: правильная архитектура, чистый код, следование гайдлайнам… В итоге каждый пет-проект превращается в работу.

Плюс появляется вопрос: если я трачу столько времени, может, стоит заложить в проект какую-то полезную функциональность или коммерческий потенциал?

С ИИ всё проще: промпты можно писать уставшим вечером, результат проверяется визуально, а не через code review, времени уходит мало. Поэтому делать игру-головоломку под macOS оказывается эмоционально гораздо легче, чем собирать «серьёзный» MVP после работы.

Как получить игру

  1. Не советую ставить непонятное приложение от неизвестного разработчика. Поэтому вот ссылка на GitHub: https://github.com/bakotiinii/stardust-collector Можете посмотреть код, проверить на вирусы и собрать проект под себя.

  2. В репозитории есть папка builds с готовыми сборками:

    • для Ma с Intel

    • для Mac с Apple Silicon (Я проверял только Intel-версию — запускается без проблем. Apple Silicon можете проверить сами.)

Вывод

Создание MVP на незнакомом стеке с помощью ИИ стало намного проще и быстрее. Конечно, это ещё не продакшен-уровень, который можно сразу отдавать клиентам, но уже вполне достойный результат.

Остаётся только вопрос: нужно ли индустрии столько разных MVP? Как когда-то с сайтами — каждый смог сделать страничку на WordPress или конструкторе, и оказалось, что большинству это и не нужно. Возможно, нас ждёт что-то похожее и с приложениями.

Источник

Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу service@support.mexc.com для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.