Разработка простой игры с использованием теории графов от А до Я

Если вы следили за мной в последние несколько недель, то должны знать, что я опубликовал полдюжины статей о возможностях параллельного программирования в Swift 5.5, одиссею кодирования, в которой освещались некоторые из наиболее сложных аспектов написания Swift в наши дни.

Но не бойтесь, потому что эта работа будет намного веселее. Вдохновленный этим видео простой игры, основанной на числах, я решил попробовать создать ее электронную версию. Хотя, конечно, задача, которая, как мне казалось, будет легкой, выглядит обманчивой.

Бриф

В игре с долларом вы рисуете сеть узлов. Все узлы имеют хотя бы одно соединение, некоторые несколько. У вас есть значение в долларах в каждом узле, причем некоторые узлы отрицательные, а некоторые положительные.

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

Дизайн

Теперь я должен начать с того, что не думаю, что чистый SwiftUI — оптимальный выбор для этого — и я могу доказать это, создав игру с помощью SpriteKit.

Задача здесь состоит в том, чтобы построить доску, доску узлов — узлов, которые не перекрываются и связаны. Проблема заключается в том, что SwiftUI не очень хорошо подходит для всей парадигмы дизайна в рамках, настроенных на интерфейсы со сбалансированной компоновкой.

Но это не единственная проблема — вам нужно убедиться, что род, то есть сумма всех узлов, тоже работает. Уравнение для рода — это количество узлов + количество ребер + 1, как говорится в видео — хотя я не уверен, что понял это правильно, потому что я получил работающий род гораздо меньшего размера.

Сингл

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

Он работает достаточно хорошо, а основная кодовая база выглядит так. Он начинается с настройки координат сетки для ребер, узлов и значений — почти все жестко запрограммировано. Затем он запускает пару циклов, которые вытягивают все.

Некоторые циклы

Помимо этого, я добавил еще несколько узлов и несколько циклов, в результате чего общий эффект выглядит следующим образом. Это, безусловно, меняет игровой процесс здесь, поскольку петли делают его гораздо более сложным для решения.

Но код для создания различий не так хорош, как мне бы хотелось. Большая часть этого жестко закодирована — это изменение означает, что вы всегда будете видеть одно и то же расположение узлов и ребер. Мы можем сделать лучше.

Случайное решение

Я сделал шаг назад в этот момент и пересмотрел свои варианты. Значения узлов - это слэм-данк; на самом деле, не имеет значения, использую ли я каждый раз одни и те же значения, пока я их смешиваю.

Секрет в количестве узлов + ребер. Поэтому я перекодировал двойные соединения, чтобы сделать их случайными, и увеличил количество узлов.

Хотя существенным отличием, которое я также добавил, была возможность переупорядочивать узлы на карте.

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

я говорю конец; Я не совсем остановился на этом — я решил продолжить сборку для разнообразия и загрузить эту версию в магазин приложений. Снимок финальной версии вы видите в заголовке этой статьи. Что я изменил помимо того, что я описал здесь?

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

Затем я установил его в iTunes, добавил скриншоты и описание и отправил на проверку. На одобрение ушло всего 24 часа, и пока вы читаете это, товар уже в магазине; вот оно (ссылка на магазин приложений).

Что хорошо и действительно подводит меня к концу этой статьи. Вдохновляйтесь — напишите свою игру и загрузите ее в магазин приложений.