
По искане на читателите започва голям цикъл статии за приложението на технологията за безсървърни изчисления в разработката на реални приложения. В този цикъл ще се разгледа разработката на приложението, тестването и доставката до крайния потребител с помощта на съвременни средства: микросервисна архитектура на приложението (в безсървърен вариант, на база ), клъстер за разгръщане на приложението, база данни , ориентирана към облачно клъстеризиране и приложение, а също и облачна шина . Приложението реализира играта „Билини“, един от вариантите на популярната салонна игра „Мафия“.
Какво е „Билини“?
Това е вариант на играта „Мафия“, известна още като „Върколак“. В основата й стои отборна игра, при която участниците трябва стъпка по стъпка да разберат кой е кой и да се опитат да спечелят. За съжаление, при игра по мрежата изчезва важен елемент на играта, а именно личното взаимодействие, а правилата на класическата „Мафия“ са достатъчно прости, така че за по-нелинейния и интересен игрови процес обикновено се добавят и други персонажи, но основните черти на оригиналната „Мафия“ се запазват, например смяната на ден и нощ, ходовете само през нощта, както и съюзите между участниците. Също така важно отличие на играта по мрежата е, че водещият (който е и Майстор на играта, Разказвач) обикновено е компютърна програма.
Описание на играта
Правилата на играта, която искам да реализирам, са взети от стар irc-бот, който запазих в личния си архив преди около 10 години. „Билини“ имат предистория, с която започва всяка игра:
В тридевето царство, в тридесетото царство, зад седем морета, живееха няколко селца, а в тях Добри млади мъже и Червени девици. Те сели хлеб, а също така ходеха в околния лес за гъби и ягоди... И така продължаваше векове наред, докато страшна катастрофа не разтърси Земята и зло не започна да се разпространява по света! Нощите станаха дълги и студени, а в тъмното в леса и дойдоха в селото недобри и страшни твари. Прилетя отнякъде Змей Горыныч и започна да краде Червени девици и да отнема всичко ценно от селяните. Вредната и жадна Баба-Яга, която пристигна на метлата си от далечни гори, смути разума на жителите, и дори някои оставиха занаята си и отидоха в гората да разбойничат, събрали шайка там. Лиходеи срещнаха Леши, способен да се преобразява в дървета и храсти, той започна да следи за мирните селяни и да служи на разбойниците, улавяйки дали Добри юнаци подготвят нещо за избавление на селата си от нечистата сила. Добри юнаци и Красиви девици, изморени от нападенията на Разбойниците и ужасните смърти от ръцете на страшния Лихото с едното око, събрали злато и поканили известен борец от съседния град — Иван Царевич, обещаващ да избави селото от разбойниците. На поляна в гората Иван спаси от неминуема гибел Сивия вълк, който попада в капан на Разбойниците. В замяна Вълкът обеща да информира Царевича за различни горски нечистотии. Преминаваща известна лечителка Василиса Премъдра, когато видя бедствието — остана да се грижи за жителите, пострадали от нападенията на лихите. Зад гората се появи черен дворец, в който, според слуховете, се настанил Кощей Бессмъртный, всяка нощ той нахлуваше в селата и омагьосваше Добри юнаци и Красиви девици, за да не смеят да ослушват заповедите му, всеки правеше точно каквото той каже. А в Безживата гора се настани Кот Баюн, и всеки, който го срещал, заспиваше дълбок сън след неговите приказки или загиваше от железните му нокти.

Тридесетото царство
Както вече виждате, играчите са разделени на няколко групи:
- мирни жители (Добри юнаци, Красиви девици, Иван Царевич, Сивия вълк и Василиса Премъдра)
- разбойници (същинските разбойници, както и Баба Яга и Леши)
- независими (Змей Горыныч, Лихото с едното око, Царевна Лягушка, Кощей Бессмъртный, Кот Баюн)
Целта на играта, както вече бе споменато, е да останеш жив и да победиш. Противниците трябва по един или друг начин да напуснат играта, а независимите също трябва да останат живи до края на играта. В играта има злато, своеобразна игрова валута, която играчите печелят само в играта. Победителите получават злато. Колкото повече злато, толкова по-висок е рейтингът на играча.
Ще спра малко по-подробно на описанието на персонажите.

Добри юнак

Красива девица
Добри юнак и Красива девица — основната и най-масова роля в играта. Това са мирните жители, които нощем спят, а през деня работят. Нощем те могат да бъдат нападнати от някого от разбойниците, Змей Горыныч и други роли, а Василиса Премудрая ги лекува. С определена, малка вероятност, Добър молодец или Червена девица могат да оцелят атаката без загуби (възможно е, разбира се, да загубят злато), но тогава всеки ще разбере псевдонима на играча на следващия ден след нападението. Нощем тези играчи не правят ходове, а анализират игровата ситуация на базата на съобщенията в игровия чат. През деня тези играчи решават чрез гласуване кой от тях не е Добър молодец или Червена девица. Играчът, за когото е гласувало мнозинството, напуска играта, а останалите получават или губят злато. Ако играчите не изберат никого с мнозинство гласове, никой от играчите няма да бъде осъден.

Иван-Царевич
Иван-Царевич — първоначално анонимен защитник на мирните жители. Нощем проверява ролите на другите играчи, тъй като знае само за един свой съюзник — Сивия Вълк. С непосредственото участие на Сивия Вълк (който също може да проверява ролите на другите играчи), Иван-Царевич може вместо проверка, нощем да убие друг персонаж. Ако в резултат на проверката Иван-Царевич види ролята на Добър молодец или Червена девица при играча, той може да ги покани при себе си и да ги запознае със Сивия Вълк и другите Добри молодци и Червени девици. Иван може да бъде попречен от Царевна-Лягушка, която може да го съблазни през нощта, без да издава неговата роля на другите играчи през деня. Ако Иван сам открие Царевна-Лягушка, той може да й предложи да се присъедини към мирните жители, но ако Царевна откаже, тя загива от ръката на Ивана. Змей-Горыныч също може да пречи на проверките на Иван-Царевич, но за разлика от Царевна-Лягушка, през деня той ще разкаже на останалите играчи кой от тях е Иван-Царевич. През деня Иван-Царевич не се различава от другите Добри молодци.

Сивия Вълк
Сивия Вълк — помощник на Иван Царевич, чий чувствителен нос му помага на Иван да намери други Добри Младици и Красни Девици. Сивият Вълк казва на тези играчи кой е Иван Царевич и съобщава за други играчи с роли на Добри Младици и Красни Девици. Ако Вълк открие разбойник или друг противник, той незабавно съобщава на Иван Царевич, за да може той да предприеме мерки на следващата нощ. Ако на Вълка нападне Царевна-Лягунка, той се превръща в обикновен Добър Младост и не може да проверява никого, а Царевна не разбира, че всъщност е бил Сивият Вълк, тъй като Вълкът не спи нощем. Въпреки това самият Вълк денем разбира кой от играчите е Царевна-Лягунка и може да се опита да склонява другите Добри Младици и Красни Девици, които е довел при Иван Царевич, да гласуват за смъртта на Царевна-Лягунка. Освен това на следващата нощ може да се опита анонимно да склони Царевна-Лягунка на страната на мирните жители, за да не засяга никого от тях. Вълкът е в състояние да се жертва, за да спаси Иван Царевич или Василиса Премудра, ако подозира, че те внезапно могат да попаднат под ударите на разбойниците, или да бъдат зомбирани от Кощей (вълкът има вроден имунитет към магиите на Кощей), но след саможертвата Вълкът напуска играта.

Василиса Премъдра
Василиса Премъдра — играе за мирните жители, но те не знаят за нея, тъй като Василиса е много срамежлива. Когато лекува, Василиса Премудра не задава въпроси и като добър доктор лекува всички подред. Но ако нейното лекарство пие Кощей, Лихо или Леший — не им остава да живеят повече от един ден, тъй като Василиса лекува само хора. На Змея Горыныча или Кота-Баюна лекарствата на Василиса Премудра също няма да помогнат, но и вреда няма да донесат. Освен това нощем Василиса не е закачана от Кот-Баюн, тъй като Василиса не ходи за лечебни билки в Безжизнената гора. Освен това женските чари на Царевна-Лягунка не действат на Василиса. Ако нейният пациент се опитат да убият два пъти, медицината ще бъде безсилна. Василиса не може да спаси и от магически атаки, например от проклятие Лихо. Денем Василиса се държи като Красна Девица и само мимолетен, малко тъжен поглед може да насочи, че тя е наелният лекар в Тридевето царство.

Разбойник
Разбойници, за разлика от всички предишни роли, те се познават помежду си, тъй като живеят в една Логовица, и познават Лешия и Баба Яга, поради което могат да действат координирано още от първия ход. Но само Главатарят на бандата предприема действия през нощта и не гласува през деня, докато останалите Разбойници се преструват на Добри Младци и Красиви Девици. Ако Главатарят отпадне от играта по някаква причина, веднага на негово място застава един от останалите Разбойници. Първоначално, Разбойниците се опитват да неутрализират Иван-Царевича, преди той да е събрал достатъчно сила от Добри Младци и Красиви Девици за активно противопоставяне на Разбойниците през деня.

Леший
Леший през нощта шпионира за Разбойниците, съобщавайки им за намерените роли в тяхната Логовица, но през деня не гласува, тъй като не живее в селото. Въпреки това, другите играчи могат да гласуват против Лешия и по този начин да го екзекутират. Тъй като Лешият произхожда от блатото, Царевна-Лягушка не може да го примами, а ако опита, Лешият ще маркира нейния дом и жителите на селото ще разберат коя е тя всъщност. Лешият не бива да се страхува от заклинанията на Кощей, но Василиса може да го изцели до смърт. Ако Кот-Баюн опита да нападне Лешия, рискува да остане без своите железни нокти и впоследствие Котът ще трябва да приспива жертвите си само с мъркане.

Баба-Яга
Баба-Яга също така работи заедно с Разбойниците, през нощта прави магии: може или да наслeде болест на другите играчи, или да защити някой от съюзниците си от нападение. Нейната магия е дори по-силна от проклятието на Лихото. През деня Баба Яга също е активна: този, който е под нейната защита, не може да бъде екзекутиран дори с мнозинство от гласовете. Въпреки това, запасът от вълшебни коренчета за дневна защита е ограничен, така че Баба Яга не може да защити никого, включително себе си, повече от три пъти по време на играта. В същото време през деня Баба Яга се преструва на обикновена Красна Девица и гласува заедно с всички.

Змей-Горыныч
Змей-Горыныч Нощем лети над селата, гори и блата, обирайки, а през деня играе ролята на ограбен. През деня Змеят спи и затова не гласува, но може да бъде осъден с мнозинство гласове. Змеят е много опасен за всички, особено за Разбойниците и Иван Царевич. Змейът не му пука кого да обира, но ако го разкрие Вълк или Леши, може да се превърне в ценен съюзник. Ако убиеш Змея през нощта, можеш с малка вероятност да получиш изключително ценен предмет — Змеиная Кожа, която предпазва притежателя си веднъж от физическа атака.

Злото Однооко
Злото Однооко през нощта убива всички, които му попадат на пътя, а ония, които не може да убие (Лешия, Кота-Баюна или Змея Горыныча) — проклина, така че всеки, който се опита да общува с проклетията същата тази нощ, умира в течение на деня. Самият проклет също загива, само Котът-Баюн не загива — той просто ляга да спи, за да възстанови силите си, пропускайки хода на следващата нощ. Спасение от проклятието на Лихото може да донесе само Баба Яга. Проклятието не действа и на този, който победи Кота-Баюна: той, също като Кота, просто ляга да спи с пропуск на хода.

Царевна-Жаба
Царевна-Жаба не може да спечели играта, но може да изкара много пари, съблазнявайки другите играчи през нощта. Съблазненият пропуска хода си. Жабата не може да съблазни Воденцата Прекрасна, също така е добре да избягва Лешия, който ще я предаде на всички на следващия ден. Ако Иван Царевич или Главният Разбойник намерят Жабата, то могат да я поканят на страната на мирните жители или Разбойниците, при това Иван не приема отказ от Жабата, докато Главният е по-малко взискателен. Но Царевна е достатъчно хитра, може да стане двоен агент, тъй като, въпреки че сама не може да победи — това е отличен шанс да натрупа злато, тъй като шансовете да дотигнат до края на играта значително нарастват! През деня Царевна-Жаба се представя за Червена Девица и гласува с всички заедно.

Кощей Бессмъртный
Кощей Бессмъртный живее в своя замък. През нощите обикаля околните села и зомбирира Добри Младоци и Червени Девици, които преминават на негова служба и безпрекословно изпълняват всички задачи. Отказвайки да спази заповед, например да гласува през деня по различен начин от това, което е казал Кощей, или да пише съобщения през деня в чата, ако Кощей е забранил това, Слуга на Кощей загива. По този начин Кощей може да влияе на резултатите от гласуването през деня, макар самият той да не гласува. Ако Кощей бъде убит, всички негови жертви също загиват. Василиса може да излекува Слугата на Кощей, който след това възвръща своята първоначална роля. Змей-Горыныч и Вълкът имат вроден имунитет към зомбирирането, така че Кощей, дори и да иска, не може да ги привлече на своя страна. Освен това, Вълкът може да спаси Иван или Василиса, жертвайки се. Спасените от Вълка получават Вълчия имунитет към зомбирирането.

Кот Баюн
Кот Баюн живее в гората, през нощите лови. През деня спи в своята дупка, затова не участва в гласуването. Въпреки това, през деня той може да бъде осъден с мнозинство от гласовете. Котът може да атакува по два начина: да мърка — и тогава жертвата му заспива и не може да ходи през нощта, а също и да гласува на следващия ден, — или да убива веднага с железните си нокти. Атаката с нокти не работи на Змей-Горыныч, а при атака срещу Леши, Котът може изобщо да остане без нокти! Лихо не може да прокълне Кота, който след проклятието просто ще спи една нощ. Ако някой успее да победи Кота-Баюна, ще се излекува от всяка болест и недъг, включително проклятието на Лихо. Тази способност на Кота остава за играча до края на играта. Слугите на Кощей не могат да гласуват за Кота през деня, но могат косвено да разберат кой е Котът, без да съобщават това на Кощей. Кот-Баюн не влиза в съюзи с Иван или Разбойниците, така че те са основна цел за Кота.
Използвани технологии
За създаването на игра избрах технологията безсървърни изчисления (serverless) на базата на OpenFaaS, тъй като е доста проста за организиране на игра и в същото време достатъчно развита, за да напиша сложни игрови правила без излишни усложнения. Също така ще използвам кластер Kubernetes, тъй като този начин на разгръщане на приложения позволява доста лесно и надеждно бързо разгръщане и възможност за лесно мащабиране. За създаване на игровата логика мога да се огранича само до OpenFaaS, но също така ще се опитам да направя Сказочника в отделен контейнер, за да сравня сложността на реализирането. Като основен език за програмиране на микросервизи и функции избрах , тъй като отдавна го изучавам в свободното си време като заместител на Perl, а за взаимодействието на потребителите с микросервизите и функциите ще се използва js на базата на някакъв фреймуърк. За окончателното решение ще разкажа в съответната статия от цикъла. За комуникация между функциите избрах NATS.io, тъй като вече съм се сблъсквал с нея преди и има доста леко интегриране в Kubernetes.
Анонс
- Въведение
- Настройка на околната среда за разработка, разбиване на задачата на функции
- Работи по бекенд
- Работи по фронтенд
- Настройка на CICD, организация на тестването
- Стартиране на пробна сесия на играта
- Итог
Източник: habr.com
