От А до Я за разработване на проста игра с помощта на теория на графите

Ако сте ме следвали през последните няколко седмици, ще знаете, че публикувах половин дузина статии за функциите за паралелно програмиране в Swift 5.5, кодираща одисея, която покрива някои от по-предизвикателните аспекти на писането на Swift в наши дни.

Но не се страхувайте, защото тази хартия ще бъде много по-забавна. Вдъхновен от това видео на проста игра, базирана на числа, реших да опитам да създам негова електронна версия. Въпреки че, разбира се, задача, която смятах, че ще бъде лесна, изглежда може да бъде измамна.

The Brief

В играта с долари вие рисувате мрежа от възли. Всички възли имат поне една връзка, някои множество. Имате стойност в долари във всеки възел, като някои възли са отрицателни, а някои положителни.

Целта на играта е да гарантира, че всеки възел има минимум нула долара. Докосвате възел, за да споделите стойността му със съседите му. Споделянето е предизвикателството, тъй като възелът трябва да сподели своята важност с всички възли, директно свързани.

Дизайнът

Сега трябва да започна, като кажа, че не мисля, че чистият SwiftUI е оптималният избор за това – и може да го докажа, като изградя играта с помощта на SpriteKit.

Предизвикателството тук е да се изгради дъската, дъска от възли – възли, които не се припокриват и са свързани. Задачата е, че SwiftUI не е подходящ за цялата парадигма на дизайна в рамка, настроена за интерфейси с балансирано оформление.

Но това не е единственото предизвикателство – защото трябва да сте сигурни, че родът, известен още като сборът от всички възли, също работи. Уравнението за рода е броят на възлите + броят на ръбовете + 1, така че видеото казва - въпреки че не съм сигурен, че съм го разбрал правилно, защото имам много по-малък род, който работи.

Единичният

Фокусът първоначално беше да се изгради минимално функционираща игра. За да усетя как мога ефективно да направя интерфейса. Използвах шест възела, всички с единични връзки един към друг.

Работи сравнително добре, като основната кодова база зад него изглежда така. Започва с настройване на координатите на мрежата за ръбовете и възлите и стойностите - почти всичко е твърдо кодирано. След това изпълнява няколко цикъла, които извличат всичко.

Някои Loops

Преминавайки отвъд това, добавих още няколко възела и няколко цикли, с нетния ефект, който изглежда така. Това със сигурност има значение за геймплея тук, като циклите го правят много по-трудно за решаване.

Но кодът, който прави разликите, отново не е толкова добър, колкото бих искал. Голяма част от него е твърдо кодирана - промяна, която означава, че винаги ще виждате една и съща подредба на възел/ръб. Можем и по-добре.

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

В този момент направих крачка назад и преосмислих възможностите си. Стойностите на възлите са забиване; наистина, няма значение дали използвам едни и същи стойности всеки път, стига да ги смесвам.

Тайната е в броя на възлите + ръбовете. Така че прекодирах двойните връзки, за да ги направя произволни и увеличих броя на възлите.

Въпреки че съществената разлика, която добавих, беше възможността за пренареждане на възлите на картата.

Само като ме гледате как пренареждам възлите, можете да започнете да оценявате, че правенето на това с алгоритъм ще бъде много трудно. Всичко това ме води до края на това парче. Ето го окончателният код, за да започнете:

казвам края; Не спрях дотук — реших да продължа да изграждам за промяна и да кача версия на това в магазина за приложения. Моментна снимка на окончателната версия, която виждате в заглавието на тази статия. Какво промених извън това, което описах тук?

  • Персонализирах използвания шрифт.
  • Дефинирах персонализирана структура за задържане на връзките, замествайки масива, който използвах тук.
  • Създавам входна страница, която ви дава възможност да играете с различни размери на мрежи.
  • Замених магическите числа, които използвах в този код, за да извърша горната работа.
  • Настроих някаква основна навигация напред и назад.
  • Добавих проверка, за да видя кога сте решили мрежата — заедно с предупреждение.

След това го настроих в iTunes, включително екранни снимки и описание, и го изпратих за преглед. Отне само 24 часа, за да бъде одобрен, и е в магазина, докато четете това; ето го (връзка към магазина за приложения).

Което наистина ме доведе до края на тази статия. Бъдете вдъхновени — напишете своя собствена игра и я качете в магазина за приложения.