ZADÁNÍ BAKALÁŘSKÉ PRÁCE

Název: AI turnaj Student: Martin Sedláček Vedoucí: Ing. Eliška Šestáková Studijní program: Informatika Studijní obor: Webové a softwarové inženýrství Katedra: Katedra softwarového inženýrství Platnost zadání: Do konce letního semestru 2019/20

Pokyny pro vypracování

Seznamte se s problematikou implementace strategických her typu Tower Defense - analyzujte použité algoritmy pro navigaci jednotek po herní mapě a existující způsoby rozlišení herní obtížnosti. Dále se seznamte s hrami, které poskytují API pro napojení externí umělé inteligence. Na základě této analýzy navrhněte a implementujte prototyp vlastní strategické hry typu Tower Defense, jenž bude kromě lidského hráče poskytovat také komunikační API zpřístupňující ovládání hry pro napojení umělé inteligence (externích agentů). Hru vhodně parametrizujte, aby poskytovala více herních úrovní (základní, střední a těžká obtížnost). Navrhněte též algoritmus pro generování náhodné herní mapy. Proveďte uživatelské testování výsledné implementace. Navrhněte alespoň tři různé umělé inteligence, otestujte jejich chování a vyhodnoťte jejich úspěšnost ve hře. Seznam odborné literatury

Dodá vedoucí práce.

Ing. Michal Valenta, Ph.D. doc. RNDr. Ing. Marcel Jiřina, Ph.D. vedoucí katedry děkan

V Praze dne 27. listopadu 2018

Poděkování

Chtěl bych poděkovat především své vedoucí bakalářské práce Ing. Elišce Šestákové za její vedení a trefné poznámky. Dále děkuji všem testerům za je- jich pomoc.

Prohlášení

Prohlašuji, že jsem předloženou práci vypracoval samostatně a že jsem uvedl veškeré použité informační zdroje v souladu s Metodickým pokynem o etické přípravě vysokoškolských závěrečných prací. Beru na vědomí, že se na moji práci vztahují práva a povinnosti vyplývající ze zákona č. 121/2000 Sb., autorského zákona, ve znění pozdějších předpisů. V souladu s ust. § 46 odst. 6 tohoto zákona tímto uděluji nevýhradní oprávnění (licenci) k užití této mojí práce, a to včetně všech počítačových programů, jež jsou její součástí či přílohou, a veškeré jejich dokumentace (dále souhrnně jen Dílo“), a to všem osobám, které si přejí Dílo užít. Tyto osoby jsou oprávněny ” Dílo užít jakýmkoli způsobem, který nesnižuje hodnotu Díla, a za jakýmkoli účelem (včetně užití k výdělečným účelům). Toto oprávnění je časově, teri- toriálně i množstevně neomezené. Každá osoba, která využije výše uvedenou licenci, se však zavazuje udělit ke každému dílu, které vznikne (byť jen zčásti) na základě Díla, úpravou Díla, spojením Díla s jiným dílem, zařazením Díla do díla souborného či zpracováním Díla (včetně překladu), licenci alespoň ve výše uvedeném rozsahu a zároveň zpřístupnit zdrojový kód takového díla ale- spoň srovnatelným způsobem a ve srovnatelném rozsahu, jako je zpřístupněn zdrojový kód Díla.

V Praze dne 13. května 2019 ………………… České vysoké učení technické v Praze Fakulta informačních technologií © 2019 Martin Sedláček. Všechna práva vyhrazena. Tato práce vznikla jako školní dílo na Českém vysokém učení technickém v Praze, Fakultě informačních technologií. Práce je chráněna právními před- pisy a mezinárodními úmluvami o právu autorském a právech souvisejících s právem autorským. K jejímu užití, s výjimkou bezúplatných zákonných li- cencí a nad rámec oprávnění uvedených v Prohlášení na předchozí straně, je nezbytný souhlas autora.

Odkaz na tuto práci Sedláček, Martin. Tower Defense AI turnaj. Bakalářská práce. Praha: České vysoké učení technické v Praze, Fakulta informačních technologií, 2019. Abstrakt

Práce se zabývá návrhem a implementací prototypu hry žánru Tower Defense. Za tímto účelem jsou prozkoumány existující Tower Defense hry a jejich herní prvky. Dále jsou popsány algoritmy pro hledání cest a hry umožňující externí napojení umělé inteligence. Vytvořený prototyp umožňuje pomocí skriptování napojení umělé inteligence, jež může hrát hru místo hráče.

Klíčová slova Tower Defense, strategická hra, umělá inteligence, skripto- vání, generování mapy, AI agent

Abstract

This work is dealing with a design and implementation of a Tower Defense game prototype. For this cause the analysis of existing Tower Defense games and their game elements was performed. Pathfinding algorithms and games allowing external plug-in of artificial intelligence were also described. The created prototype allows such plug-in of artificial intelligence via scripting.

Keywords Tower Defense, strategy game, artificial intelligence, scripting, map generation, AI agent

7

Obsah

Úvod 1

1 Průzkum existujících řešení 3 1.1 Prvky a herní mechaniky her typu Tower Defense ...... 3 1.1.1 Mapa ...... 4 1.1.2 Věže ...... 5 1.1.3 Suroviny ...... 6 1.1.4 Nepřátelé ...... 6 1.1.5 Podmínky vítězství ...... 7 1.1.6 Obtížnosti ...... 7 1.2 Existující Tower Defense hry ...... 8 1.2.1 Bloons Tower Defense ...... 9 1.2.2 Plants vs. Zombies ...... 11 1.2.3 Kingdom Rush Frontiers ...... 12 1.2.4 Cursed Treasure 2 ...... 14 1.2.5 Desktop Tower Defense ...... 17 1.2.6 Shrnutí ...... 18 1.3 Hry poskytujících napojení umělé inteligence ...... 19 1.3.1 Herní AI ...... 19 1.3.2 Umělá inteligence v roli hráče ...... 19 1.3.3 Age of Empires 2 ...... 20 1.3.4 Angry Birds AI Competition ...... 21 1.4 Algoritmy pro navigaci jednotek po mapě ...... 23 1.4.1 Breadth-first Search ...... 24 1.4.2 Dijkstrův algoritmus ...... 24 1.4.3 A* ...... 25

2 Návrh 29 2.1 Mapa ...... 29

9 10 OBSAH

2.2 Věže ...... 30 2.3 Suroviny ...... 31 2.4 Nepřátelé ...... 32 2.5 Podmínky vítězství ...... 34 2.6 Obtížnosti ...... 34 2.7 Funkční požadavky ...... 34 2.8 Nefunkční požadavky ...... 35 2.9 Případy užití ...... 35

3 Realizace 39 3.1 Struktura projektu ...... 39 3.2 Základní herní objekty ...... 40 3.3 Napojení externí umělé inteligence ...... 42 3.4 Náhodné generování mapy ...... 43 3.5 Výběr nalezených cest ...... 48 3.6 Časovač ...... 50

4 Testování 51 4.1 Měření ...... 55

Závěr 59

Seznam použité literatury 61

A Seznam použitých zkratek 65

B Dokumentace skriptovacího API 67

C Obsah přiloženého média 73 Seznam obrázků

1.1 Hra Bloons TD 5 ...... 9 1.2 Hra Plants vs. Zombies ...... 11 1.3 Hra Kingdom Rush Frontiers ...... 13 1.4 Základní typy věží v Kingdom Rush Frontiers ...... 13 1.5 Hra Cursed Treasure 2 ...... 15 1.6 Vylepšení věží v Cursed Treasure 2 ...... 16 1.7 Hra Desktop Tower Defense ...... 17 1.8 Ukázka pravidla v Age of Empires 2 ...... 21 1.9 Detekce objektů v Angry Birds pomocí computer vision ...... 22 1.10 Ukázka kódu základního agenta ...... 23

2.1 Věže ve hře ...... 32 2.2 Diagram případů užití v menu hry ...... 37 2.3 Diagram případů užití ve hře ...... 38

3.1 Diagram tříd dědících z GameObject ...... 41 3.2 Ukázka mapovací metody ...... 43 3.3 Kompilace skriptu ...... 44 3.4 Spuštění skriptu ...... 45 3.5 Sekvenční diagram spouštění skriptu ...... 46 3.6 Kód metody GeneratePathUtil ...... 47 3.7 Kód rozhraní IPathSelector ...... 48 3.8 Kód třídy InOrderPathSelector ...... 49 3.9 Kód třídy PathSelectorFactory ...... 49 3.10 Kód Update metody třídy Timer ...... 50

11

Seznam tabulek

1.1 Shrnutí her a jejich prvků ...... 19

2.1 Schopnosti věží na úrovni 5 ...... 31 2.2 Systém vylepšení věží ...... 31 2.3 Ceny vylepšení věží ...... 32 2.4 Přehled nepřátel ...... 33 2.5 Modifikace poškození dle elementů ...... 34

4.1 Výsledky měření externích AI agentů na mapě Level 1 s lehkou obtížností ...... 55 4.2 Výsledky měření externích AI agentů na mapě Level 1 s normální obtížností ...... 55 4.3 Výsledky měření externích AI agentů na mapě Level 1 s těžkou obtížností ...... 56 4.4 Výsledky měření externích AI agentů na mapě Level 2 s lehkou obtížností ...... 56 4.5 Výsledky měření externích AI agentů na mapě Level 2 s normální obtížností ...... 56 4.6 Výsledky měření externích AI agentů na mapě Level 2 s těžkou obtížností ...... 56 4.7 Výsledky měření externích AI agentů na mapě Level 3 s lehkou obtížností ...... 56 4.8 Výsledky měření externích AI agentů na mapě Level 3 s normální obtížností ...... 57 4.9 Výsledky měření externích AI agentů na mapě Level 3 s těžkou obtížností ...... 57

13

Seznam algoritmů

1 Breadth-First Search ...... 25 2 Dijkstrův algoritmus ...... 26 3 A* ...... 27

15

Úvod

Herní průmysl je nedílnou součástí oblasti informačních technologií. Vývoj videoher s sebou přináší nutnost řešit složité algoritmické i matematické pro- blémy. Mnoho algoritmů vzniklo právě díky hrám. Hry a umělá inteligence jsou témata, která jsou propojená čím dál více a problematika umělé inteligence se stává čím dál více aktuální a důležitá. Oblast využití umělé inteligence je opravdu široká. Historicky hry pomohly s rozvojem umělé inteligence a dnes i samotné hry používají složité umělé inteligence jako svoji nedílnou součást, například pro procedurální generování světa. Her poskytujících hráči možnost vytvořit vlastní umělou inteligenci ovšem na trhu příliš není. Taková možnost navíc přináší do hry úplně jinou rovinu. Umožňuje transformovat činnost hráče tak, že se bude moci bavit nikoliv sa- motným hraním hry, ale vytvářením inteligence pro hraní hry. Hlavním cílem této práce je návrh a implementace prototypu Tower De- fense hry poskytujícího rozhraní pro napojení externí inteligence, která bude schopná ovládat hru místo hráče. Dílčím cílem je vytvoření tří umělých inteli- gencí a vyhodnocení jejich úspěšnosti. Dalším z cílů je vytvoření algoritmu pro náhodné generování map. Za tímto účelem je proveden průzkum existujících her žánru Tower Defense, algoritmů pro navigaci herních jednotek po mapě a her poskytujících napojení externí umělé inteligence. Práce je členěná na několik logických celků. V kapitole 1 je popsán sa- motný žánr Tower Defense a jeho herní prvky. Prozkoumány jsou i existující hry zastupující tento žánr a hry umožňující napojení umělé inteligence a v po- slední řadě i algoritmy pro navigaci jednotek po mapě. Kapitola 2 se zabývá samotným návrhem hry. Dle předchozího průzkumu byly navrhnuty jednot- livé herní prvky. Některé parametry vyskytující se v návrhu byly v průběhu vývoje upravovány tak, aby hra působila vyváženě. V kapitole 3 je popsána realizace vytvořeného prototypu – struktura a některé detaily implementace. Poslední kapitola 4 se zabývá testováním hry a měřením umělých inteligencí.

1

Kapitola 1

Průzkum existujících řešení

Tato kapitola se zabývá herním žánrem Tower Defense (TD). Kromě obecné charakteristiky žánru (viz sekce 1.1) je prozkoumáno pět existujících populár- ních her (viz sekce 1.2). Dále je zkoumáno použití umělé inteligence ve hrách a způsoby napojení externích agentů (viz sekce 1.3). Kapitola též obsahuje popis algoritmů používaných pro hledání cest (viz sekce 1.4).

1.1 Prvky a herní mechaniky her typu Tower Defense

Tower Defense je populární žánr, který spadá pod žánr realtimových strategií (RTS). Jednou z prvních her, obsahujících prvky TD, je arkádová hra Rampart z roku 1990. Tato hra ovlivnila vznikající žánr Tower Defense. Úkolem hráče v této hře je bránit hrady na pobřeží střílením nepřátelských lodí. [1] Nárůst popularity Tower Defense her však nastal o několik let později. Nejprve se kolem roku 2000 objevily speciální mapy v RTS hrách jako je Starcraft nebo Warcraft III. Tyto mapy využívaly principy TD her, ale až o několik let později se Tower Defense vyhranil jako samostatný žánr, který používal především flash platformu.2 [ ] Dnes se Tower Defense žánr hojně vyskytuje ve formě aplikací v chytrých telefonech a dokonce dal vznik novému žánru zvanému MOBA (Multiplayer online battle arena), který staví na prvcích TD a je dnes velice populární – jedním z nejznámějších představitelů tohoto žánru je League of Legends. [3] Vývojáři této hry v roce 2016 odhadovali přes 100 milionů aktivních hráčů měsíčně [4]. V TD hrách je úkolem hráče bránit svou základnu. Tato základna může mít podobu pokladu, nějaké budovy, nebo to může být jen konec cesty (záleží na konrétní hře). RTS hry mají obvykle velké mapy, které lze posouvat a hráč má k dispo- zici i minimapu pro celkový přehled. Oproti tomu herní mapy TD her bývají

3 1. Průzkum existujících řešení menších rozměrů a vejdou se na jednu obrazovku. Na těchto mapách obvykle existuje cesta, po které přicházejí nepřátelé. Nepřátelské jednotky se objevují ve vlnách a jejich cílem je dojít na konec cesty a zničit tak budovu nebo objekt, kterou hráč brání, nebo prostě ubrat hráči životy. V klasických Tower Defense hrách nemá útočník nijak speciální umělou inteligenci a spíše se pouze snaží dostat k cíli. Existují ovšem i hry, kde se vyskytuje třeba i více cest a útočník disponuje nějakou umělou inteligencí, která je schopná reagovat, vybírat bezpečnější cestu apod. Ve většině běž- ných Tower Defense hrách nepřátelé neútočí na hráčovy věže, ale i takové hry existují, například Plants vs. Zombies (viz sekce 1.2.2). V Tower Defense žánru se nejčastěji využívají následující herní prvky: mapa obsahující cesty a překážky, věže, suroviny, nepřátelé (přicházejí ve vl- nách, lze je zrychlit pomocí ovládání času), podmínky vítězství, obtížnosti. Tyto prvky jsou v této sekci dále popsány a rozebrány. Následující popis je založen především na popisu existujících Tower Defense her (viz sekce 1.2) a předešlých herních zkušenostech autora.

1.1.1 Mapa Mapa je důležitým prvkem TD her. Představuje herní plochu, jež dává hráčovi prostor pro stavbu věží. Na mapě se ovšem mohou vyskytovat i překážky, které hráče omezují ve stavbě věží, například stromy nebo kameny. Kromě toho mapa obvykle také obsahuje cestu, po níž se pohybují nepřátelské jednotky. Cesta omezuje hráčův prostor, neboť na ní obvykle nelze stavět věže. Cesta primárně slouží pro nepřátele, kteří ji využívají k tomu, aby se dostali na její konec. V některých hrách ale pevně daná cesta na mapě nemusí vůbec existovat a hráč ji vytváří sám stavěním věží a překážek – tyto cesty se dle [1] nazý- vají otevřené. V takovém případě je nutné, aby nepřátelé disponovali nějakým algoritmem pro hledání cesty, například prohledáváním do šířky. Při použití jednoduchých lineárních nebo rozvětvených cest není takový algoritmus vy- loženě nutný. Cesty mohou být totiž uloženy předdefinované, jako kdyby už byly nalezené. Samotná cesta může ovlivňovat obtížnost hry. Například hodně zatáček znamená hodně efektivních míst, kam postavit věže, aby měly nejlepší dosah na nepřátele a aby útočily co nejdéle. Pokud se cesta větví, tedy nepřátelé si například náhodně volí, kterou cestou se vydají, pak dochází k rozptýlení nepřátel po mapě a snížení efektivity věží. Cesty můžeme rozdělit do několika základních kategorií, nicméně existují i hry, které implementují jejich různé kombinace. Cesty lze dle [1] rozlišit na: jednoduché lineární na mapě je pouze jedna cesta, například ve hře Gem- craft [5], Flash Element TD [6];

4 1.1. Prvky a herní mechaniky her typu Tower Defense rozvětvené cesta je rozvětvená, někdy se vyskytuje i více cest, například ve hře Cursed Treasure 2 (viz sekce 1.2.4) či Bloons TD (viz sekce 1.2.1); otevřené hráč vytváří cestu umísťováním věží, například ve hře Desktop Tower Defense (viz sekce 1.2.5); paralelní linie jedná se o pevně dané vedle sebe umístěné cesty, typicky jsou bez zatáček a zabírají velkou část mapy, například ve hře Plants vs. Zombies (viz sekce 1.2.2), Defender II [7].

Již bylo zmíněno, že se ve hře mohou vyskytovat překážky. Překážky lze dle autora rozdělit na dva druhy: překážky pro hráče jsou typicky umístěné na mapě mimo cestu. Tyto pře- kážky zabraňují hráči postavit na obsazené místo věž. Překážka tedy může fungovat jako faktor ovlivňující obtížnost – blokuje hráči stra- tegicky důležité místo. Objevují se ve ve hrách jako je Bloons TD 5 (viz sekce 1.2.1), Cursed Treasure 2 (viz sekce 1.2.4) či Plants vs. Zom- bies (viz sekce 1.2.2); překážky pro nepřátele nejčastěji se jedná o věže (na otevřených mapách) nebo o jiné objekty, jež se staví nepřátelům do cesty. Vyskytují se na- příklad ve hře Plants vs. Zombies (viz sekce 1.2.2) nebo Desktop Tower Defense (viz sekce 1.2.5).

1.1.2 Věže Dalším důležitým herním prvkem jsou věže, které zajišťují hráčovu obranu. Většinou se jedná o budovy, které si hráč kupuje za herní měnu a umísťuje je podél cesty. Nemusí se však jednat pouze o budovy, mohou to být různé stroje, rostliny, zvířata, kouzelníci vrhající ohnivé koule apod. Všechny věže mají ovšem společný účel, a to pomáhat hráči s obranou. Věže mají většinou následující vlastnosti: poškození udává, kolik životů způsobí útok nepříteli; dosah jak daleko věž dostřelí; frekvence střelby například střelba každou vteřinu; speciální schopnost například věž zmrazuje nepřátele v dosahu; typ cíle na jaký typ nepřátel věž útočí, například pouze na pozemní jednotky; cena kolik musí hráč za stavbu věže zaplatit.

5 1. Průzkum existujících řešení

Nepřátelé mohou mít brnění nebo jinou odolnost, která snižuje poškození věží. Některé věže pak mohou mít takzvanou penetraci brnění – ta udává, jak dobře proráží brnění. Poškození u věží se uvádí jako takzvané raw damage (tj. poško- zení v případě nulové redukce). Do výpočtu skutečného poškození nepřátelské jednotky je však nutno zahrnout redukce, penetraci brnění atd. Věže lze obvykle za herní měnu vylepšovat. Každá TD hra má jiný systém vylepšování, většinou ale vylepšení zlepší některé vlastnosti věže nebo přidá nějakou speciální schopnost. Kromě útočících věží mohou být i věže poskytující nějakou podporu speciálním efektem, například věž, která zmrazí na nějaký čas nepřátele ve svém dosahu, a hráč tak získá více času. Hra může umožňovat stavět i pasti. Ty jsou poněkud vyjímečné, protože je hráč může stavět na cestu a pasti se sepnou po vstupu nepřátel. Pasti lze nalézt například ve hře Bloons TD 5 (viz sekce 1.2.1). Věže jsou prostředky, které má hráč ve svých rukou a pomocí nichž může vytvářet svoji herní strategii – jaký typ věže zvolí, kam ji umístí, zdali vylepší věž nebo postaví novou, jaká věž je účinná proti jakým nepřátelům apod. Čím větší možnost volby a čím více faktorů, tím větší prostor pro vymýš- lení různých strategií jak hru zahrát. Variabilita je důležitá a také do hry přináší faktor zábavy, nicméně je také nutné, aby byly všechny parametry dobře nastavené a hra byla vyvážená.

1.1.3 Suroviny

Stavba věží stojí nějaké suroviny, čímž je zajištěno, že hráč nebude moci posta- vit velké množství věží najednou. Typicky tyto suroviny dostává hráč za zabití nepřátel. Za ně pak může postavit nové věže nebo je vylepšit. Je na hráči ja- kou strategii zvolí, zdali například investuje suroviny hned, nebo bude čekat a šetřit třeba na dražší vylepšení. Hráč například utratí všechny suroviny za levné věže, ale pak se objeví nepřátelé, proti kterým jsou tyto věže neúčinné. Hráč by ale potřeboval dražší věž, na kterou mu ale už nezbyly suroviny. Proto je nutná takzvaná správa surovin (resource management). Správa surovin a jejich investice je klíčový mechanismus strategických her. V některých TD hrách (např. Bloons TD 5, viz sekce 1.2.1) hráč může získávat suroviny nejenom za zabití nepřátel, ale i pomocí speciálních věží, které suroviny umí generovat.

1.1.4 Nepřátelé

V každé Tower Defense hře figurují nepřátelé. Typicky následují nějakou cestu a snaží se dostat na její konec. Na konci cesty se může, ale nemusí, vyskytovat nějaký objekt. Tento objekt se pak nepřátelé snaží zničit. Může se jednat o poklad, hrad nebo něco jiného – záleží na tématu hry.

6 1.1. Prvky a herní mechaniky her typu Tower Defense

Ve hře typicky existuje několik různých typů nepřátel lišících se svými vlastnostmi. Mezi nejčastější vlastnosti nepřátelských jednotek patří počet životů a rychlost pohybu. Hráč by měl svoji strategii měnit tak, aby byl připraven na typ příchozích nepřátel. Ke každému typu nepřítele obvykle existují i odpovídající věže, se kterými se dá proti těmto jednotkám efektivně hrát. V TD hrách se používá mechanismus vln. To znamená, že se nepřátelé ob- jevují ve vlnách. Například každých deset sekund se objeví nová vlna nepřátel. Mechanismus vln má tyto vlastnosti: velikost vlny počet nepřátel ve vlně frekvence například vlna přijde každých 10 sekund počet vln udává kolik vln na hráče zaútočí

Mechanismus vln lze různě upravovat a měnit tím tak obtížnost. Například zvětšením velikosti vlny, změnou složení vlny, zlepšením samotných vlastností nepřátel ve vlně nebo snížením frekvence vypouštění vln lze zvýšit obtížnost hry. Někdy se například další vlna objeví až po stisknutí tlačítka hráčem, hráč má tedy času na přípravu kolik chce. Tlačítko umožňuje zvyšovat či snižovat obtížnost pro lidského hráče. Umělá inteligence pracuje rychleji než člověk a tento mechanismus se jí tedy nedotkne. Do ovládání času také spadá možnost zrychlení celkové hry. Typicky se v TD hrách používá dvojnásobné zrychlení.

1.1.5 Podmínky vítězství Co se vítězství týká, obvykle hráč musí úspěšně bránit konec cesty či nějaký objekt proti nepřátelům. Kdykoliv se nepřítel dostane na místo objektu či na konec cesty, hráč přijde o životy nebo jiné body. Podmínkou vítězství je ve většině hrách přežít útok všech nepřátel, přičemž body (životy) nesmí klesnout na nulu.

1.1.6 Obtížnosti V TD hrách se typicky objevují tři obtížnosti: lehká, střední, těžká. K rozlišení těchto obtížností lze dle autora využít různých možností: modifikace vlastností nepřátel změnou například životů nebo rychlosti nepřátel lze upravit obtížnost hry. Typicky se změna týká celé vlny a vlastnosti nepřátel se tak v průběhu hry graduálně zvyšují. Tento způsob používá například Desktop Tower Defense (viz sekce 1.2.5) či Gemcraft;

7 1. Průzkum existujících řešení mechanismus ovládání času tlačítko umožňující přivolání další vlnu zjed- nodušuje hru. Hráč si může přivolat vlnu kdy chce a má tak dostatek času pro rozmyšlení strategie, postavení či vylepšení věží. Tlačítko pou- žívá například hra Bloons TD 5 (viz sekce 1.2.1);

Cursed Treasure 2 (viz sekce 1.2.4) umožňuje použít tlačítko pro dřívější přivolání, ale i bez něj bude stejně po fixní době vlna přivolána. Nao- pak hra Gemcraft tlačítko vůbec nepoužívá a vlny přicházejí v určitém intervalu; mechanismus vln měnit lze složení vln, velikost, frekvenci či počet vln. Na- prosto typické pro TD hry je, že každá další vlna je větší než předchozí. Co se počtu vln týče, tak ve většině her (například Cursed Treasure 2, viz sekce 1.2.4) se s každou další mapou tento počet zvyšuje a gradu- álně tak vzrůstá i obtížnost. Bloons TD 5 (viz sekce 1.2.1) pro jednotlivé obtížnosti mění celkový počet vln; modifikace mapy přidáním rozvětvených cest nebo překážek lze zvýšit ob- tížnost hry. Tento způsob používá zejména Kingdom Rush Frontiers (viz sekce 1.2.3) nebo Cursed Treasure 2 (viz sekce 1.2.4). modifikace počtu životů Tento způsob používá například Bloons TD 5 (viz sekce 1.2.1). Pro lehkou obtížnost má hráč 200 životů, pro střední 150 a pro těžkou 100.

Například hry jako Bloons TD 5 (viz sekce 1.2.1) nebo Desktop Tower Defense (viz sekce 1.2.5) nabízí možnost zvolit si obtížnost. Existují ale i hry, kde volba obtížnosti není. To ale neznamená, že by se obtížnost neměnila. Tyto hry obtížnost graduálně zvyšují. Většinou je k dispozici kampaň, během níž se hráč setkává se stále novými typy nepřátel a novými mapami, přičemž počet vln postupně narůstá.

1.2 Existující Tower Defense hry

Tato sekce popisuje existující Tower Defense hry. Vybrány byly především známé a úspěšné tituly jako je například Bloons TD 5 (viz sekce 1.2.1) či Cur- sed Treasure 2 (viz sekce 1.2.4) nebo mobilní Plants vs. Zombies (viz sekce 1.2.2). Všechny vybrané hry mají na herních portálech jako je armorgames.com [8] či kongregate.com [9] miliony zahrání. Vyjímkou je Plants vs. Zombies, která se soustředí na jiné platformy, nicméně například na Google Play obchodu má přes 100 milionů stažení. Shrnutí a porovnání prvků jednotlivých her lze nalézt v sekci 1.2.6.

8 1.2. Existující Tower Defense hry

1.2.1 Bloons Tower Defense Bloons TD je série úspěšných Tower Defense her. První hra byla vydána jako prohlížečová hra implementovaná pomocí . Další hry v sérii už podporují více platforem. [10] Pro účely této práce byla vybrána prohlížečová hra Bloons TD 5 (viz obrázek 1.1) vydaná v roce 2011. [11] Hra nabízí několik map obsahujících pouze jednoduché lineární cesty. Kromě toho tu jsou i mapy, jež mají rozvětvené cesty. V rozvětvených cestách si ne- přátelé vybírají cestu postupně – například při dvou cestách si lichý nepřítel ve vlně vybere první cestu a sudý druhou cestu. V této hře nejsou žádné překážky, které by hráč mohl stavět nepřátelům do cesty, nicméně na některých mapách se vyskytují stromy blokující místo pro postavení věží. Hráč má k dispozici mnoho typů věží s různými vlastnostmi a schopnostmi (například zpomalení nepřítele). Některé věže jsou vůči určitým typům ne- přátel naprosto neúčinné. Někdy ovšem existuje pro věž vylepšení, jež tuto účinnost zajistí. Jinak hráč musí použít jinou věž. Je zde také třeba věž (loď), kterou lze umístit pouze do vody. Vylepšit lze například dosah věže, sílu útoku, rychlost nebo přidat nějaký speciální efekt (přidat účinnost proti určitému typu nepřátel, prodloužit dobu zmrazení apod.).

Obrázek 1.1: Hra Bloons TD 5 [11, snímek pořídil autor]

Nepřátelské jednotky představují balónky, kde některé mají více vrstev (například v modrém balónku je schovaný červený) a hýbou se rychleji. Exis-

9 1. Průzkum existujících řešení tují balónky, jež jsou imunní vůči specifickým útokům a jdou zničit pouze určitou věží nebo s pomocí vylepšení. Občas se vyskytnou i velké vzducho- lodě, které mají hodně životů, ale pohybují se pomalu. Po jejich zničení se na místě objeví další balónky. Nepřátelé přicházejí ve vlnách, přičemž velikost vln se s každým dalším kolem zvětšuje a objevují se silnější nepřátelé. Každé kolo zaútočí jedna vlna. Počet kol se liší dle obtížnosti. Hráč musí zavolat tlačítkem další vlnu a také má možnost hru zrychlit. Za každou zničenou vrstvu balónku hráč dostává jeden herní dolar. Na- příklad po zničení první vrstvy modrého balónku se objeví červený balónek s jednou vrstvou. Hráč tak dostane 2 dolary. Odměna se tedy zvyšuje dle náročnosti nepřítele. Také je možné prodat již postavenou věž, ovšem za nižší cenu, konkrétně 80 % původní ceny. Dalším způsobem jak získat dolary, je postavit speciální věž, která je generuje během hry. Takovou věž se vyplatí postavit brzy, její návratnost je zhruba po deseti kolech. Cílem hráče je zabránit balónkům dostat se na konec cesty. Dle úrovně obtížnosti má hráč různé množství životů a musí přežít daný počet kol (vln). Za zmínku ještě stojí speciální herní mód, kde není žádná podmínka vítězství, tedy počet vln je neomezený a hráč se snaží vydržet co nejdéle. Hráč na výběr ze tří základních obtížností:

• lehká

– věže jsou levnější – nepřátelé jsou pomalejší – hráč má 200 životů – 50 kol

• střední

– hráč má 150 životů – 65 kol

• těžká

– věže jsou dražší – nepřátelé jsou rychlejší – hráč má 100 životů – 85 kol

10 1.2. Existující Tower Defense hry

1.2.2 Plants vs. Zombies Hra Plants vs. Zombies [12] (viz obrázek 1.2) byla vydána v roce 2009 na počítač a později i na další platformy. Hráč brání svůj dům proti valícím se zombie a využívá k tomu různé věže. Nicméně během kampaně se hra neustále mění, zpřístupňují se nové věže i nové typy nepřátel, což hráče nutí reagovat, adaptovat se a vymýšlet nové strategie. Hra obsahuje několik map. Na každé z nich je pět až šest paralelních linií. Mapy se vyznačují tím, že se na nich vyskytují specifičtí nepřátelé pro danou mapu a jdou stavět specifické věže. Existuje mapa Pool“, kde jsou vodní linie. ” Na těchto liniích lze stavět jen některé věže, což mimo jiné zvyšuje obtížnost.

Obrázek 1.2: Hra Plants vs. Zombies [12, snímek pořídil autor]

Překážky jsou v této hře důležitým a používaným mechanismem. Každá věž, kterou hráč postaví, se stává překážkou pro nepřítele. Kromě věží je zde další druh překážek a to hroby. Hráč na nich nemůže stavět věže – nejprve musí hrob odstranit, což ale stojí herní měnu. Věže hráč staví na paralelní linie, tedy přímo do cesty, po které se pohybují nepřátelé. Věž má životy a nepřítel ji musí zničit, aby mohl jít dál. Když hráč postaví věž, musí čekat určitou dobu, než tento typ věže může postavit znovu. Tato doba je specifická pro každý typ věže. Věže dále mohou disponovat schopností útočit, tedy se mohou lišit frekvencí a silou útoku nebo mají nějaký podpůrný či speciální efekt – například věž, která pouze generuje herní měnu či věž, která má hodně životů a slouží pouze jako překážka. Na začátku každé hry si hráč může vybrat ze všech (ve hře je přes 40 věží) odemknutých věží až osm, které bude v dané hře moci používat. Postavenou věž je možné z mapy odebrat, ale bez návratu investovaných surovin.

11 1. Průzkum existujících řešení

V Plants vs. Zombies za zabití nepřátel hráč nezískává žádné suroviny. Herní měnou, za kterou lze stavět věže nebo ničit hroby jsou slunce. Malé množství surovin získává automaticky během hry (neplatí pro noční mapy), ale hlavně ze speciálních věží, které tyto slunce generují s určitou frekvencí. Nepřátelé jsou zombie a existuje jich velké množství, liší se rychlostí po- hybu, rychlostí útoku, poškozením a speciálními schopnostmi. Například je zde zombie se skákací tyčí, která této zombie umožní přeskočit jednu věž. Každý nepřítel má nějakou slabinu a tedy určité věže jsou vůči němu efektivnější. Nepřátelé se objevují náhodně na některé z paralelních linií. Přicházejí ve vlnách a následující vlna nečeká až skončí předchozí. Několikrát za hru se může vyskytnout speciální velká vlna. Mechanismus ovládání času se zde nevyskytuje, tudíž nelze zrychlit hru nebo ručně přivolat další vlnu. Na konci každé cesty je sekačka, která hráče může napoprvé zachránit. Při kontaktu s nepřítelem se sekačka rozjede a zabije všechny nepřátele na celé linii. Potom ale sekačka zmizí a jakmile se nějaký zombie dostane na konec cesty, hráč prohrál. Hráč si nemůže zvolit obtížnost, nicméně během hraní kampaně se ob- tížnost postupně zvyšuje. Plants vs. Zombies během hry představuje nové nepřátele, věže a složitější koncepty (například nakloněná mapa, která většinu střílecích věží naprosto zneefektivní) a hra se stává komplexnější, což zvyšuje obtížnost. Ve hře jsou také noční mapy. V noci je generovaní surovin pomalejší a také se na mapě vyskytují hroby, jejichž odstranění stojí suroviny.

1.2.3 Kingdom Rush Frontiers Kingdom Rush Frontiers [13] (KR Frontiers, viz obrázek 1.3) je pokračování hry Kingdom Rush, posazené v středověkém fantasy světě, která vyšla v roce 2011 jako flashová hra. Toto pokračování bylo vydáno v roce 2013.[14] Na stránce armorgames.com [8] má KR Frontiers přes 40 milionů zahrání. Hra obsahuje kampaň a přes dvacet různých map. Na mapách se vyskytují hlavně rozvětvené cesty, najdeme zde ale i jednoduchou lineární cestu. Někde dokonce hráč musí bránit dva konce cesty. Hráč nemůže stavět překážky přímo do cesty, nicméně různými způsoby může umístit svoje vojáky na cestu. Tito vojáci pak bojují s nepřítelem a tím ho blokují (tvoří překážku), tedy nepřítel nemůže jít dál, dokud hráčovy jed- notky neporazí. Ve hře jsou čtyři základní typy věží:

• lučistnická věž

• kasárny

• magická věž

• artilerie

12 1.2. Existující Tower Defense hry

Obrázek 1.3: Hra Kingdom Rush Frontiers [13, snímek pořídil autor]

Obrázek 1.4: Základní typy věží v Kingdom Rush Frontiers [13, snímek pořídil autor]

13 1. Průzkum existujících řešení

Hráč může stavět věže jen na speciálně určená místa (strategické body), která jsou podél cest. Každá věž je dobrá na něco jiného (viz obrázek 1.4). Věže lze vylepšovat. Vylepšení na druhou a třetí úroveň však pouze zlepšuje vlastnosti věže. Na čtvrtou úroveň si hráč může vybrat jedno ze dvou odlišných vylepšení, které změní typ věže a odemkne speciální schopnosti specifické pro daný typ. Kromě toho existují ještě speciální věže, které se vyskytují na různých mapách a jsou už předem postavené. Nezvyklým mechanismem této hry je hrdina. Hráč si může vybrat z něko- lika hrdinů a zvolit si pro něj různé schopnosti. S hrdinou pak může chodit po mapě a bojovat proti nepřátelům. Věže stojí zlaťáky a tuto herní měnu hráč získává za zabití nepřátel. Od- měna je podle typu nepřítele. Hráč může zbourat věž, a získat tak zpět 60 % investovaných surovin. Dalším způsobem jak získat zlaťáky je přivolat vlnu dříve nebo nechat nepřítele dojít až na konec cesty. Nepřátelských jednotek je mnoho typů a hráč se s nimi setkává postupně během kampaně. Mají různé životy, brnění, sílu poškození, schopnosti, re- zistanci proti magii a je za ně různá odměna. Hráč má dvacet životů a musí přežít útok nepřátel. Nepřátelé útočí ve vlnách a to z různých směrů, někdy třeba i najednou ze všech směrů. Na začátku jsou vlny malé, postupně se zvětšují a přicházejí i silnější nepřátelé. V poslední vlně se někdy objeví i speciální silná jednotka (tzv. boss). Počet vln se postupně v kampani zvyšuje. Hráč může vlny přivolat dříve, pokud tak učiní, získá nějaké zlaťáky navíc. Po dokončení kampaně se hráči odemkne takzvaný Endless (Survival) mód, kde má hráč deset životů a snaží se ubránit co nejdéle proti neustále rostoucím vlnám nepřátel. Složení těchto vln je generováno náhodně. V tomto módu si nepřátelé vybírají cestu, která pro ně bude výhodnější. Každou vlnu se také zvýší vlastnosti nepřátel o 2 %. Jinak si hráč může vybrat jednu ze tří obtížností: lehká nepřátelé mají o 20 % méně životů střední nepřátelé mají normální počet životů těžká nepřátelé mají o 20 % více životů

1.2.4 Cursed Treasure 2 Cursed Treasure 2 [15] (viz obrázek 1.5) je původně flashová hra vydaná v roce 2013, dnes je již na více platformách. Nabízí poněkud netradiční mapy a sys- tém vylepšování. Jedná se o velice úspěšnou hru. Na stránce armorgames.com [8] má přes 23 milionů zahrání. Mapy obsahují jak jednoduché lineární cesty, tak i větvené. Na některých mapách je například voda, přes kterou si létající nepřátelé mohou zkrátit cestu. Na mapě se také vyskytují různé speciální budovy, které hráč může za manu

14 1.2. Existující Tower Defense hry

Obrázek 1.5: Hra Cursed Treasure 2 [15, snímek pořídil autor]

(speciální surovina) obsadit – například důl na zlato nebo vesnice, která při- volává nepřátele. Jejím obsazením hráč sníží počet příchozích nepřátel. Ve hře se také vyskytují speciální místa, tzv. High Grounds, kam hráč může umístit věž, a získat tak o polovinu větší dosah. Věž lze umístit pouze na terén odpovídající danému typu věže. Místo pro věž ovšem může být zarostlé stromy a hráč ho musí za manu vykácet. Pře- kážky, které by hráč umístil do cesty, ve hře nejsou, maximálně může použít speciální magický svitek, jenž udeří nepřítele strachem a pošle ho na chvíli opačným směrem. Ve hře jsou tři základní typy věží: Den, Crypt a Temple. Den lze postavit pouze na trávě, Crypt na sněhu a Temple na kamenném terénu. Každá věž má rozdílné poškození, rychlost útoku a dosah. Aby hráč mohl věž vylepšit, musí mít dostatek zlaťáků a zároveň musí mít věž dostatek zkušeností, ty získává útočením na nepřítele. Věž lze vylepšit na úroveň 2, toto vylepšení pouze zlepší vlastnosti věže. Při vylepšení na úroveň 3 se hráč musí rozhodnout mezi dvěma odlišnými typy věží, kde každý přináší speciální vlastnosti. Dále následuje pouze vy- lepšení vlastností a na závěr další vylepšení na úroveň 5, kde se znovu hráč musí rozhodnout mezi dvěma odlišnými typy (jeden je společný pro obě věže), viz obrázek 1.6. Herní měnou jsou zlaťáky, jež hráč získá za každého zabitého nepřítele. Ob- vykle je to patnáct zlaťáků s vyjímkou několika silnějších nepřátel. Z nepřátel může spadnout nějaký předmět – někdy i zlaťáky navíc. Hráč může prodat

15 1. Průzkum existujících řešení

Den

Den 2

Sniper’s Den Ballista’s Den

Sniper’s Den 2 Ballista’s Den 2

Bunker Den Rocket Den Catapult Den

Obrázek 1.6: Vylepšení věží v Cursed Treasure 2 již postavenou věž a získat tak zpět menší množství investovaných zlaťáků. Na mapě se často vyskytuje zlatý důl. Pokud ho hráč obsadí (k obsazení je nutné investovat manu), pak tento důl během hry neustále generuje množství zlaťáků. Zajímavé je i to, že každá další věž daného typu je dražší. Důležitá je ovšem i ona zmíněná mana, hráč ji musí umět správně využít. Za manu lze vykácet les pro umístění věže, obsadit či zneškodnit budovy na mapě a také přivolat kouzlo. Mana se regeneruje sama nebo lze obsadit speciální budovu, jež regeneraci many urychlí. Nepřátel je mnoho typů a liší se počtem životů, rychlostí a speciálními schopnostmi. Například Bard může zrychlit jiného nepřítele na 3 sekundy. Nebo Paladin, který je imunní vůči magii, či Valkyrie, jež umí létat přes vodu, a zkrátí si tak cestu a vyhne se některým věžím. Ve hře je implementován mechanismus vln. Každou další hru v kampani se počet vln zvyšuje o pět. Nepřátelé přicházejí jak ze začátku cesty, tak i z bu- dov na mapě. Hráč může průběh hry tlačítkem zrychlit. Vlny jsou přivolány automaticky, ale lze je přivolat i ručně dříve. Tato hra je poměrně netradiční, neboť hráč brání pět drahokamů a nepřá- telé se snaží drahokamy odnést. Nepřátelé si vybírají nejkratší cestu k nejbliž- šímu drahokamu. Pokud nepřítel nese drahokam a zemře, pak tento drahokam zůstane na místě a může ho sebrat další nepřítel. Hráč vyhraje, pokud po útoku všech vln zůstane alespoň jeden drahokam na mapě. Drahokamy jsou umís- těny v jeskyni, mohou být však různě rozděleny do několika jeskyň. Potom hráč nebrání pouze jedno místo ale více. Po úspěšném odehrání mapy lze mapu zahrát v nočním módu, kde lze věže umísťovat pouze v dosahu světla z jeskyně a postavených věží, což stěžuje hru. Jinak hra nenabízí volitelné obtížnosti, nicméně obtížnost se během kampaně zvyšuje – narůstá počet vln, mění se mapy a objevují se nové typy nepřátel.

16 1.2. Existující Tower Defense hry

1.2.5 Desktop Tower Defense Hra Desktop Tower Defense [16] (viz obrázek 1.7) vyšla jako flashová hra v roce 2007 a stala se velice úspěšnou, má přes 70 milionů zahrání. [17] Díky úspěchu této hry se její autor dokonce rozhodl odejít z práce, založit startup a věnovat se vývoji her naplno. [18] Název Desktop je odvozený od toho, že hra obsahuje pouze jednu mapu, která vypadá jako kancelářský stůl. Na mapě není žádná předem daná cesta, jedná se tedy o otevřenou mapu. Hráč zde staví věže a tím v podstatě dyna- micky vytváří cestu v reálném čase, jelikož nepřátelé jsou vybaveni algorit- mem, který hledá nejkratší cestu k cíli.

Obrázek 1.7: Hra Desktop Tower Defense [16, snímek pořídil autor]

Věže tedy slouží jako překážky pro nepřátele a ti se jim vyhýbají. Samo- zřejmě věže nejde postavit tak, aby neexistovala žádná cesta, vždy musí být k dispozici alespoň jeden průchod. Věže lze vylepšovat až na pátou úroveň, kde každé vylepšení zlepšuje vlastnosti věže. Ve hře se vyskytuje několik typů věží. Levné základní věže se používají hlavně pro budování bludiště – cílem je, aby byla cesta pro nepřítele co nejdelší. Také mohou útočit na pozemní i vzdušné jednotky. Dále tu jsou věže s vysokou rychlostí útoku či věže, které mohou útočit pouze na pozemní jednotky. Ve hře lze také naleznout věže, jež zpomalují nepřítele nebo podpůrné věže zvyšující poškození okolních věží. Zlato, za které hráč staví a vylepšuje věže, lze získat zabíjením nepřátel. Odměna se liší dle nepřátelské jednotky. Věže lze také prodat, ovšem za sní-

17 1. Průzkum existujících řešení

ženou částku, zhruba 40 % investovaných peněz. Ve hře je několik kategorií nepřátel, každá s jinými vlastnostmi: normal základní nepřátelé immune jsou imunní proti zpomalení group nepřátelé nepřichází s odstupem jeden za druhým, ale najednou ve skupině fast mají velkou rychlost spawn po smrti se objeví dva další nepřátelé flying vzdušné jednotky, mohou přelétávat věže a některé věže na ně neútočí dark mají brnění, které redukuje poškození morph mohou se proměnit na vzdušný typ Hráč má na počátku hry 20 životů a brání se proti nepřátelům, jež přichá- zejí ve vlnách – v každé vlně je jedna kategorie nepřátel nebo boss (speciální silná jednotka). Intervaly mezi jednotlivými vlnami jsou fixní, nicméně hráč může tlačítkem vlnu zavolat dříve. Hra nabízí různé módy, například mód, kde hráč musí přežít 100 vln, jinak je to pouze 50. Nebo mód, kde může postavit nejvýše 15 věží. Hráč si může vybrat buď mód nebo jednu ze základních obtížností, nikoliv obojí najednou. Ve hře jsou k dispozici tři základní obtížnosti: lehká nepřátelé přicházejí pouze z jednoho směru, více slabších nepřátel střední nepřátelé přicházejí ze dvou směrů těžká nepřátelé přicházejí ze dvou směrů a mají o polovinu životů víc

1.2.6 Shrnutí Provedený průzkum žánru Tower Defense a existujících her pomohl autorovi vytvořit si náhled na danou problematiku. Získané znalosti jsou použity v ná- vrhu a implementaci hry. Autor se snažil využít nejpoužívanější prvky a me- chanismy TD her. Shrnutí prozkoumaných her a jejich prvků je znázorněno v tabulce 1.1. Z tabulky vyplívá, že nejčastějším typem cest jsou cesty rozvětvené. Roz- větvené cesty zajišťují různorodost map a ovlivňují obtížnost hry. Ve čtyřech z pěti prozkoumaných her se vyskytují překážky pro hráče, zamezují mož- nost stavět věže na některá místa. Naopak překážky pro nepřátele se v prů- zkumu vyskytly pouze ve hře s otevřenou mapou nebo ve hře s paralelními liniemi. Většina her umožňuje ovládání času, ať už přivolání vlny nebo zrych- lení. Změna obtížnosti je dostupná ve třech z pěti zkoumaných her.

18 1.3. Hry poskytujících napojení umělé inteligence

Překážky Překážky Ovládání Hra Cesty pro Obtížnosti pro hráče času nepřítele Přivolání Bloons TD 5 Rozvětvené Ano Ne vlny, Ano Zrychlení Plants vs. Zombies Paralelní linie Ano Ano Žádné Ne Přivolání KR Frontiers Rozvětvené Ano Ne Ano vlny Přivolání Cursed Treasure 2 Rozvětvené Ano Ano vlny, Ne Zrychlení Přivolání Desktop TD Otevřená mapa Ne Ano Ano vlny

Tabulka 1.1: Shrnutí her a jejich prvků

1.3 Hry poskytujících napojení umělé inteligence

Tato sekce se zabývá hrami, které umožňují externí napojení umělé inteligence. Jsou zde popsány různé přístupy a řešení.

1.3.1 Herní AI V dnešní době se vývojáři her kromě dobře vypadající grafiky snaží poskytnout i co nejlepší herní zážitek (game experience), ten se totiž stal důležitým fakto- rem pro prodávání hry. Právě pro tento zážitek je herní AI (umělá inteligence) klíčovým elementem. [19] Z akademického hlediska se termínem herní AI“ rozumí inteligentní cho- ” vání herních postav. Z vývojářského pohledu se tento termín používá v širším významu a je tím myšleno například řešení kolizí, hledání cest, generování světa či dokonce generování náhodných čísel. [19] Je těžké poskytnout pokročilou umělou inteligenci pro komplexní hry (na- příklad strategie). V takových hrách jsou obvykle k dispozici až tisíce různých možností. Většinou se proto vývojáři rozhodnou využít skriptování, například list pravidel, které jsou sekvenčně prováděny. Díky své jednoduchosti, čitel- nosti, snadnou implementací či rozšiřitelností jsou skripty jednou z nejpouži- vanějších technik pro herní AI. [19]

1.3.2 Umělá inteligence v roli hráče Důvodů, proč se ve hrách používá umělá inteligence v roli hráče, je několik. Cílem umělé inteligence může být vyhrát a nebo pozitivně ovlivnit zážitek ze hry – aby byla hra pro hráče zábavnější. Herní zážitek jistě nevylepší umělá inteligence, jež se bude chovat nepřirozeně nebo až příliš předvídatelně. [20]

19 1. Průzkum existujících řešení

Umělá inteligence, jež se snaží vyhrát, se používá zejména ve výzkumu pro zkoumání a testování úspěšnosti různých AI algoritmů. Hry jsou k tomuto účelu velice vhodné, jelikož jsou komplexní a vyžadují kognitivní schopnosti a samotný hráč se hraním hry učí jak hru (efektivně) hrát. Hry vlastně testují inteligenci hráče a právě hry pomohly ve výzkumu umělé inteligence. [20] Za zmínku stojí například počítač Deep Blue od firmy IBM, který v roce 1997 porazil světového šampiona Garryho Kasparova v šachu. Projekt Deep Blue inspiroval další projekt zvaný Watson, také od IBM. Watson dokázal po- razit šampióny ve hře Jeopardy!, která je komplexnější než šachy. [21] Dle [22] společnost Google DeepMind přišla s programem AlphaGo, který dokázal po- razit světové špičky ve hře Go. Go byla mnohem větší výzva než šachy, jelikož sestrojení vyhledávacího stromu (search tree) nad všemi možnostmi tahů, jako to dělal například Deep Blue, by v Go kvůli její komplexitě neobstálo. AlphaGo používal například zpětnovazebné učení (reinforcement learning) a hluboké neuronové sítě (deep neural networks). [20] Dalším z důvodů proč využít umělou inteligenci v roli hráče může být potřeba poskytnout hráči silného oponenta, například v šachu, Go, ale i počí- tačových hrách, jako je například strategická hra Age of Empires 2. Nicméně toto je v počítačových hrách velice často řešeno tím, že umělá inteligence podvádí – má k dispozici informace, které hráč nevidí nebo je oproti hráči zvýhodněná. To znamená, že má například levnější budovy nebo na začátku hry disponuje větším množstvím surovin než hráč. [20] Umělá inteligence v roli hráče se dá také použít na testování hry. Vývojáře může například zajímat, jestli je navržená úroveň (level) hry vůbec možno dohrát. K účelu testování lze využít i AI s cílem nikoliv vyhrát, ale zlepšit herní zkušenost. V takovém případě může být vhodné použít umělou inteligenci, která svým chováním co nejvíce odpovídá lidskému hráči (human-like artificial agent). [20] Herní vývojář tak uvidí, jak by hráč hrál hru a jakým způsobem intera- guje s prostředím a díky tomu může třeba vylepšit herní návrh. Například ve hrách, kde je hlavní mechanikou střelba, je pro roli nehráče“ (non-playable ” character) často žádoucí, aby nepřítel působil věrohodně, tedy co nejvíce jako lidský hráč. [20]

1.3.3 Age of Empires 2 Jedná se hru řánru RTS, která patří mezi jeho nejznámější představitele. Age of Empires 2 (AoE 2) umožňuje hrát proti nepřátelům ovládáných počítačem. Ve hře je několik předpřipravených umělých inteligencí, ale hráč má možnost si vytvořit i vlastní a to pomocí skriptování. AoE 2 použivá takzvaný rule-based expertní [23] systém. Pokud hráč chce vytvořit vlastní AI, tak ve skriptu zadefinuje množinu pravidel (rule-base). Tyto pravidla jsou potom testovány několikrát za sekundu. Předpřipravené AI nepřátel má tuto množinu pravidel již předem zadefinovanou.24 [ ]

20 1.3. Hry poskytujících napojení umělé inteligence

(defrule (food-amount greater-than 50) => (train villager) )

Obrázek 1.8: Ukázka pravidla v Age of Empires 2 [24]

Pravidlo je ve stylu if-then, tedy se skládá z podmínky a akce, která se vykoná při splnění podmínky. [23] AoE 2 používá pro skripty vlastní speci- ální deklarativní jazyk. Podmínku lze zkonstruovat pomocí faktů a operátorů. Fakty jsou informace o stavu hry, které hráč může ve skriptech používat. Na- příklad kolik má hráč dřeva nebo kolik má vesničanů. [24] V ukázce jednoduchého pravidla (viz obrázek 1.8) lze vidět food-amount. To je fakt, neboli proměnná, jež obsahuje aktuální množství jídla. Operátor greater-than porovná fakt s hodnotou. Je-li podmínka splněná, tedy množ- ství jídla je větší než 50, pak se provede akce train-villager, která vycvičí vesničana.

1.3.4 Angry Birds AI Competition Angry Birds AI Competition je projekt, který pořádá soutěž o naprogramování umělé inteligence, jež zvládne hrát hru Angry Birds lépe než lidé. [25] Angry Birds je hra založená na fyzice. Cílem je střílením ptáků zničit všechna zelená prasata, v cestě ale stojí překážky. Ve hře jsou fyzikální pa- rametry jako je hmotnost, tření či gravitace. Jednotlivé akce lze odsimulovat pomocí fyzikálního simulátoru za předpokladu, že jsou k dipozici všechny pa- rametry. Jenomže v Angry Birds AI Competition člověk ani umělá inteligence tyto parametry k dispozici nemají. [26] Umělá inteligence pouze získává snímky obrazovky. Tím se přibližuje člo- věku. Ten také nezná interní parametry a má k dispozici pouze vizuální vjem. Řešení tohoto problému omezeného pouze na zjednodušený svět Angry Bi- rds může zdokonalením umělé inteligence přispět i k řešení jiných problému v reálném světě. [26] V samotné hře hráč pouze vybírá bod odkud vystřelí ptáka a tím ovlivní trajektorii. Pak ještě musí vybrat časový okamžik, kdy aktivuje speciální schopnost vystřeleného ptáka. Je obrovské množství množností jak provést tyto dvě akce. Umělá inteligence musí bod odstřelu a časový moment něja- kým způsobem zvolit a predikovat jejich výsledek bez přímé znalosti světa, v němž fyzická“ akce probíhá. [26] ” Hra Angry Birds skriptování vůbec nepodporuje, tedy nemá ani žádné rozhraní, díky kterému by bylo možné například zjistit interní parametry, pozici objektů ve světě apod. To však nebrání napsat umělou inteligenci, která

21 1. Průzkum existujících řešení bude hru hrát. AI bude provádět chování hráče nikoliv voláním funkcí ve skriptu, ale simulováním vstupu myši apod. Nicméně to ještě stále nestačí, je potřeba získat informace o objektech ve světě, jejich pozicích atd. K tomu slouží takzvaná computer vision (viz obrázek 1.9). [26] Pořadatelé soutěže zveřejnili základního herního agenta z minulých ročníků soutěže. Je napsaný v jazyce Java a účastníci soutěže ho mohou použít jako základ. Agent komunikuje se serverem, na kterém běží hra, a posílá mu příkazy přes speciálně navržený komunikační protokol. Základní agent se skládá ze tří komponent:

Computer vision component analyzuje jednotlivé snímky hry a detekuje jednotlivé objekty ve hře a identifikuje jejich typ a lokaci;

Trajectory component počítá trajektorii ptáků a místo odkud střílet;

Game playing component provádí jednotlivé akce, tedy simuluje napří- klad vstup myši apod. [27]

Obrázek 1.9: Detekce objektů v Angry Birds pomocí computer vision [28, snímek pořídil autor]

Ukázka části kódu základního agenta je na obrázku 1.10. V ukázce se posílá příkaz serveru, aby vytvořil snímek obrazovky a poslal ho zpět. Tento snímek je dále předán vision komponentě. Ta nabízí metody, které umožní na snímku identifikovat jednotlivé objekty. Například prak pomocí metody findSlingshotMBR či prasata pomocí metody findPigsMBR.

22 1.4. Algoritmy pro navigaci jednotek po mapě

public GameState solve() {

// capture Image BufferedImage screenshot = ActionRobot.doScreenShot();

// process image Vision vision = new Vision(screenshot);

// find the slingshot Rectangle sling = vision.findSlingshotMBR();

// confirm the slingshot while (sling == null && aRobot.getState() == ,→ GameState.PLAYING) { System.out .println("No slingshot detected. Please remove pop up or ,→ zoom out"); ActionRobot.fullyZoomOut(); screenshot = ActionRobot.doScreenShot(); vision = new Vision(screenshot); sling = vision.findSlingshotMBR(); } // get all the pigs List < ABObject > pigs = vision.findPigsMBR(); ... }

Obrázek 1.10: Ukázka kódu základního agenta [29]

Této soutěže se v roce 2014 zúčastnil tým z Fakulty informačních tech- nologií Českého vysokého učení techníckého v Praze a zvítězil. Jejich agent uměl čtyři specifické strategie, kde rozhodování, kterou z nich použít, bylo ovlivněno různými faktory – pozicí překážek, dosažitelností nepřátel apod. Dle těchto faktorů byla pro každou strategii vypočítána tzv. utility funkce a vybrala se strategie s nejvyšší hodnotou této funkce. [30]

1.4 Algoritmy pro navigaci jednotek po mapě

V této sekci jsou popsány algoritmy řešící problematiku hledání cesty (tzv. pathfinding). Tyto algoritmy typicky dostanou jako vstup startovní pozici, cílovou pozici a grafovou reprezentaci prostoru. Výstupem je potom nějaká posloupnost vrcholů grafu vedoucí k cíli.

23 1. Průzkum existujících řešení

V rámci průzkumu existujících řešení byl prozkoumán kód open source hry ASD Tower Defense [31], která používá Dijkstrův algoritmus. Ten je po- psán v sekci 1.4.2. Naopak další open source hra Towerstorm [32] má uložené definované cesty, které není potřeba vyhledávat. Stejně je na tom například Bloons TD 5 (viz sekce 1.2.1), tuto informaci obdržel autor této práce přímo od vývojářů. [33] Dle emailové komunikace vývojáři hry Cursed Treasure 2 (viz sekce 1.2.4) používají prohledávání do šířky (Breadth-First Search). [34] Tento algoritmus je popsán v sekci 1.4.1. Pokusy kontaktovat autora hry Desktop TD (viz sekce 1.2.5) či vývojáře Kingdom Rush Frontiers (viz sekce 1.2.3) byly bohužel neúspěšné a nepodařilo se tedy zjistit jaké algoritmy používají. Nicméně ve hrách se obecně často používá algoritmus A* a proto je mu věnována sekce 1.4.3. Herní mapa je ve hrách často reprezentována pomocí pole (grid). Není ovšem nutností, aby stejná reprezentace byla používána i pro hledání cesty. Může být výhodné využít pro hledání cesty jinou reperezentaci, která bude mít méně vrcholů k prohledávání. Například pokud některá políčka na mapě jsou označena jako průchozí a jiná jako neprůchozí, pak lze sestrojit graf pouze z průchozích políček, a snížit tak velikost prohledávaného prostoru, což může urychlit algoritmus. [35]

1.4.1 Breadth-first Search Breadth-first Search (BFS) neboli prohledávání do šířky patří mezi takzvané neinformované algoritmy. To znamená, že nevyužívá informace o struktuře problému, čímž dochází ke zbytečnému expandování vrcholů. BFS pracuje s neohodnoceným grafem. [36] Tento algoritmus je používán například ve hře Cursed Treasure 2 (viz sekce 1.2.4). Jedná se o optimální algoritmus – najde nejkratší cestu k cíli. Nicméně graf prohledává ve vlnách a to všesměrově. Navštíví všechny sousedy startovního vrcholu a následně je vloží do fronty (datová struktura založená na principu FIFO – First In, First Out). Potom vybírá vrcholy z fronty a otevírá jejich sousedy. Po nalezení cílového vrcholu stačí ke zkonstruování cesty zpětně projít (backtracking) seznam předchůdců. [36] Pseudokód je znázorněn v algoritmu 1. Tento pseudokód nalezne nejkratší cesty ke všem vrcholům, ale lze ho snadno modifikovat tak, aby při nalezení jednoho cílového vrcholu skončil a dále neprohledával.

1.4.2 Dijkstrův algoritmus Dijsktrův algoritmus patří mezi neinformované algoritmy. Jedná se v podstatě o BFS, jež bere v potaz ohodnocení grafu. Algoritmus nalezne optimální řešení v případě, že je graf ohodnocen nezápornými hodnotami. [36] Dijkstrův algoritmus si ke každému vrcholu ukládá délku již nalezené cesty a pokud je během prohledávání nalezena kratší cesta k listu (vrchol se stupněm

24 1.4. Algoritmy pro navigaci jednotek po mapě

Vstup : graf G, startovní vrchol s Výstup: pole předchůdců P , pole vzdáleností D 1 for vrchol v ∈ G do 2 stav(v) ← nenalezen ; 3 D(v) ← nedefinovano ; 4 P (v) ← nedefinovano ; 5 end 6 stav(s) ← otevren ; 7 D(s) ← 0 ; 8 Q.enqueue(s) ; 9 while Q not empty do 10 v ← Q.dequeue() ; 11 for soused w vrcholu v do 12 if stav(w) == nenalezen then 13 stav(w) ← otevren ; 14 D(w) ← D(v) + 1 ; 15 P (w) ← v ; 16 Q.enqueue(w); 17 end 18 end 19 stav(v) ← uzavren ; 20 end Algoritmus 1: Breadth-First Search, D je pole vzdáleností, P pole před- chůdců a Q je fronta [37] jedna), pak je tento vrchol přesunut do odpovídající větve v prohledávacím stromu. Tato procedura se nazývá relaxace. [36] Pseudokód (viz algoritmus 2) lze snadno upravit, aby se ukončil po uza- vření cílového vrcholu. Pro nalezení cesty stačí opět zpětně projít seznam předchůdců tohoto vrcholu. Na řádce 9 se vybírá vrchol s nejmenší hodnotou h – v praxi se k tomuto účelu kvůli rychlosti využívá prioritní fronta.

1.4.3 A* Algoritmus A* je de facto standard, který se používá pro hledání cesty.“ ” [39] Tento algoritmus (viz algoritmus 3) je vlastně kombinací tzv. Hladového prohledávání (Greedy search) a Dijkstrova algoritmu. Hladové prohledávání patří mezi informované algoritmy. Používá takzva- nou evaluační funkci f(n) a k expanzi se vybírá vrchol s nejmenší hodno- tou této funkce. Většinou se pro evaluační funkce používají heuristické funkce h(n). Heuristická funkce dává odhad ceny nejkratší cesty z vrcholu n k cíli. Lze využít například euklidovskou vzdálenost. Algoritmus pak rychle expanduje jedním směrem, ale nedokáže si poradit s překážkami. [40]

25 1. Průzkum existujících řešení

Vstup : graf G, startovní vrchol s Výstup: pole předchůdců P 1 for vrchol v ∈ G do 2 stav(v) ← nenalezen; 3 h(v) ← +∞ ; 4 P (v) ← nedefinovano ; 5 end 6 stav(s) ← otevren ; 7 h(s) ← 0 ; 8 while existuji nejake otevrene vrcholy do 9 v ← otevreny vrchol s nejmensim h(v); 10 for naslednik w vrcholu v do 11 if h(w) > h(v) + l(v, w) then 12 stav(w) ← otevren ; 13 P (w) ← v ; 14 stav(v) ← uzavren ; 15 end 16 end 17 end 18 return P Algoritmus 2: Dijkstrův algoritmus, h(v) je délka nalezené cesty k vrcholu v a l je váhová funkce [38]

Kombinací s Dijkstrovým algoritmem lze tento problém vyřešit. A* po- užívá následující evaluační funkci: f(n) = g(n) + h(n). Kde g(n) je délka dosavadní cesty k vrcholu n a h(n) je odhadovaná délka cesty z vrcholu n k cíli. Pokud je použitá heuristika h(n) takzvaně přípustná (admissible), pak algoritmus vždy najde optimální cestu. [36] Přípustná heuristika se vyznačuje tím, že nevrací delší vzdálenost k cíli než je skutečná vzdálenost. Na mřížkových mapách (grid map) se často používá Manhattonská vzdálenost, která je známou přípustnou heuristikou. [41]

26 1.4. Algoritmy pro navigaci jednotek po mapě

Vstup : graf G, startovní vrchol s, cílový vrchol z Výstup: cesta zkonstruovaná zpětným projitím pole předchůdců P cílového vrcholu 1 for vrchol v ∈ G do 2 D(v) ← nedefinovano ; 3 P (v) ← nedefinovano ; 4 end 5 open.enqueue(s, h(s)) ; 6 D(s) ← 0 ; 7 while open not empty do 8 v ← open.dequeue() ; 9 if v == z then 10 return cesta(P (v)); 11 end 12 for soused w vrcholu v do 13 if w∈ / closed then ′ 14 d ← D(v) + l(v, w) ; 15 if w ∈ open then ′ 16 if d < D(w) then ′ 17 D(w) ← d ; 18 P (w) ← v; ′ 19 open.updateKey(w, d + h(w)); 20 end 21 else ′ 22 D(w) ← d ; 23 P (w) ← v; ′ 24 open.enqueue(w, d + h(w)); 25 end 26 end 27 end 28 closed.add(v); 29 end Algoritmus 3: A*, D je pole vzdáleností, P pole předchůdců, closed je množina a open je prioritní fronta [36]

27

Kapitola 2

Návrh

Tato sekce se zabývá návrhem samotného prototypu Tower Defense hry. Ná- vrh byl vytvořen na základě vlastních zkušeností a předchozího popisu žánru Tower Defense a jeho prvků (viz sekce 1.1), dále popisu her ze sekce 1.2 a jejich shrnutí (viz tabulka 1.1).

2.1 Mapa

Často se ve hrách pro reprezentaci mapy používá pole. Pro hry žánru Tower Defense je tato reprezentace vhodná a dle [42] hned z několika důvodů:

• Jedná se o řešení, které je jednoduché na implementaci a práce s polem je intuitivní;

• pole lze jednoduše ukládat do souboru a editovat;

• ceny nebo průchodnost políček lze jednoduše dynamicky měnit;

• snadné určení políčka v poli z pozice jednotky.

Proto bude v prototypu realizovaném v této práci použito dvourozměrné čtver- cové pole. Největší nevýhodou pole je paměťová náročnost, ta ovšem pro TD hry nehraje roli. Mapy v Tower Defense hrách totiž bývají malých rozměrů, tedy i rozměry mapy budou zvoleny 10 × 10 herních políček (tile) a výška i šířka každého políčka bude pro základní rozlišení 64 pixelů. Všechny jed- notky uvedené v pixelech jsou uvedené pro základní rozlišení. Do hry byla později na základě zpetné vazby z uživatelského testování přídána podpora více rozlišní. Naprostá většina her z popsaných v sekci 1.2 obsahuje větvené cesty, proto hra bude nabízet jak jednoduché lineární cesty, tak i rozvětvené, které mohou udělat hru zajímavější i těžší.

29 2. Návrh

Stejně tak se ve většině her vyskytují překážky pro hráče. Prototyp proto bude obsahovat i překážku pro hráče. Může blokovat některá strategicky dů- ležitá místa, ale bude spíše pro kosmetické účely.

2.2 Věže

Hra bude umožňovat vylepšování věží. Autor se inspiroval hlavně u her jako je Bloons TD 5 (viz sekce 1.2.1) a Cursed Treasure 2 (viz sekce 1.2.4). Nově postavená věž má úroveň 1 a element Neutral, lze ji ovšem vylepšit až na úroveň 5 a element pomocí vylepšení změnit. Druhy vylepšení se tedy liší dle úrovně, například při vylepšení z úrovně 1 na úroveň 2 si hráč může vybrat jakou vlastnost chce vylepšit. Při vylepšení z úrovně 2 na 3 si může zvolit element věže. A při vylepšení na úroveň 5 má hráč na výběr jednu ze dvou schopností (popsány v tabulce 2.1). Tento systém je znázorněn v tabulce 2.2. Pro každou věž je tedy 3 × 4 × 3 × 2 = 72 možností vylepšení. Každý typ věže bude mít jinak nastavené parametry a tedy bude efektiv- nější proti určitým nepřátelům. Například proti pomalým nepřátelům, kteří mají obvykle hodně životů, se hodí věž, která udílí velké poškození. Taková věž ovšem obvykle střílí pomalu, a proto je málo účinná proti rychlým ne- přátelům. Proti nim lze naopak použít věž s menším poškozením, ale vyšší frekvencí střelby. Věže tedy mají různé vlastnosti a jsou různě silné, proto musí mít odlišné ceny (viz tabulka 2.3). Na obrázku 2.1 jsou znázorněny typy věží ve hře. Návrh vlastností těchto věží je zde: Věž Monster

• poškození: 8

• dosah: 105 pixelů

• frekvence střelby: 1,2 s

• speciální schopnost: na úrovni 2 může útočit i na letecké jednotky

• typ cíle: pozemní jednotky

• vylepšení na úroveň 5: DoubleShot nebo SlowShot

Věž Eye

• poškození: 12

• dosah: 150 pixelů

• frekvence střelby: 2,1 s

30 2.3. Suroviny

• speciální schopnost: na úrovni 2 může útočit i na pozemní jednotky

• typ cíle: letecké jednotky

• vylepšení na úroveň 5: Combustion nebo Greed

Věž Evil Eye

• poškození: 14 %

• dosah: 125 pixelů

• frekvence střelby: 2,5 s

• speciální schopnost: udílí procentuální poškození (procenta z maximál- ního počtu životů nepřítele)

• typ cíle: pozemní jednotky, letecké jednotky

• vylepšení na úroveň 5: Elementalist nebo Flurry

Schopnost Popis DoubleShot Věž má 20 % šanci vystřelit dva projektily za sebou. SlowShot Střely zpomalí nepřítele na 2 sekundy. Combustion Nepřátelé v dosahu věže dostávají 4 ohnivého poškození každé 2 sekundy. Greed Za každého nepřítele v dosahu hráč každé 2 sekundy dostane 1-2 zlaťáků. Elementalist Střela změní element nepřítele tak, aby byl proti elementu věže co nejzranitelnější. Flurry Rychlost střelby věže se zvyšuje s každým nepřítelem v dosahu veže.

Tabulka 2.1: Schopnosti věží na úrovni 5

2.3 Suroviny

Za herní měnu byly zvoleny klasické zlaťáky, které jsou nutné pro stavbu věží. Hráč je může získat zabíjením nepřátel nebo pomocí vylepšení věže Eye. Odměna se liší dle typu nepřítele.

Úroveň Typ vylepšení 1 Vybrat jednu z vlastností: poškození, rychlost střelby, dosah 2 Vybrat jeden z elementů: Fire, Earth, Water, Wind 3 Vybrat jednu z vlastností: poškození, rychlost střelby, dosah 4 Vybrat jednu ze dvou schopností specifických pro daný typ věže

Tabulka 2.2: Systém vylepšení věží

31 2. Návrh

Úroveň Cena Monster věže Cena Eye věže Cena Evil Eye věže 1 100 zlaťáků 110 zlaťáků 75 zlaťáků 2 120 zlaťáků 120 zlaťáků 125 zlaťáků 3 50 zlaťáků 60 zlaťáků 70 zlaťáků 4 210 zlaťáků 230 zlaťáků 265 zlaťáků 5 250 zlaťáků 340 zlaťáků 275 zlaťáků

Tabulka 2.3: Ceny vylepšení věží

(a) Monster (b) Eye (c) Evil Eye

Obrázek 2.1: Věže ve hře

Každá další postavená věž od daného typu bude o určité množství zlaťáku dražší – podobný přístup se vyskytuje například ve hře Cursed Treasure 2 (viz sekce 1.2.4).

2.4 Nepřátelé

Již bylo zmíněno, že je nutné, aby hra byla dostatečně variabilní. To otevře, jak hráčovi, tak i umělé inteligenci, prostor pro různé strategie. Je to právě možnost volby, která dělá hru zajímavou a zábavnou, tam se může hráč rea- lizovat. Pro zajištění této variability bude hra obsahovat několik druhů nepřátel- ských jednotek, které jsou popsány v tabulce 2.4. Rychlost je v jednotkách ppf (pixels per frame), tedy udává o kolik pixelů se za jednu obrazovku nepřítel posune. Zmínění nepřátelé disponují následujícími vlastnostmi: typ Pozemní nebo letecká jednotka, letecké jednotky lze zničit pouze pomocí určité věže nebo pomocí speciálního vylepšení. element Element každé jednotky může být Neutral, Fire, Earth, Water nebo Wind.

životy Životy udávají kolik poškození nepřítel vydrží. rychlost Jakou rychlostí se nepřítel pohybuje. speciální schopnost Většina nepřátel má nějakou specifickou speciální schop- nost, například schopnost se teleportovat.

32 2.4. Nepřátelé odměna Odměna udává, kolik herní měny hráč za zabití nepřítele dostane.

Název Typ Životy Rychlost Speciální schopnost Odměna Fly Letecká 35 32 ppf Speed boost 25 zlaťáků Bee Letecká 70 42 ppf Speed boost(self) 45 zlaťáků Stinkbug Pozemní 35 27 ppf Žádná 25 zlaťáků Ladybug Pozemní 225 28 ppf Metamorphosis 55 zlaťáků Blue beetle Pozemní 250 29 ppf Invisibility 58 zlaťáků Leaf beetle Pozemní 300 28 ppf Heal 60 zlaťáků Star beetle Pozemní 500 27 ppf Žádná 65 zlaťáků

Tabulka 2.4: Přehled nepřátel

Nepřátelé mají speciální schopnosti, které přidávají na komplexitě hry. In- spirací pro tyto schopnosti byla především hra Cursed Treasure 2 (viz sekce 1.2.4). Popis jednotlivých speciálních schopností nepřátel:

Speed boost může zrychlit všechny jednotky v okolí, včetně sebe;

Speed boost(Self) může zrychlit sebe sama na 2,5 sekund;

Metamorphosis umožní proměnu na létající typ;

Invisibility po prvním zásahu se nepřítel stane neviditelným na 8 sekund;

Heal může vyléčit menší množství životů sobě nebo jiné jednotce v okolí;

Například Kingdom Rush Frontiers (viz sekce 1.2.3) využívá systém re- dukcí – nepřátelé mají různě silné brnění nebo odolnost proti magii. Tento přístup dělá hru zajímavější a přidává další možnosti strategizace. Proto byl k podpoření variability hry navržen systém elementů, jenž funguje na jedno- duchém principu. Každý typ nepřátelské jednotky může mít jeden z pěti elementů. Každá věž na úrovni 1 má neutrální element. Hráč si bude moci při vylepšení věže na úroveň 3 vybrat jeden ze čtyř zbývajících elementů. Pří útoku jednoho elementu na druhý dochází k modifikaci poškození, buď se redukuje nebo am- plifikuje. Tato modifikace se řídí tabulkou 2.5. Tedy například věž s elementem Water udělí nepříteli s elementem Water pouze 25 % poškození. Pro věž Evil Eye byla hodnota upravena a zvýšení poškození je místo 175 % pouze 130 %. Ve hře bude implementován mechanismus vln. Velikost vln se bude měnit a měnit se bude i složení těchto vln. V každé vlně se náhodně objeví určité nepřátelské jednotky.

33 2. Návrh

Element věže Element nepřítele Neutral Fire Earth Water Wind Neutral 100 % 100 % 100 % 100 % 100 % Fire 100 % 25 % 100 % 175 % 100 % Earth 100 % 175 % 25 % 100 % 100 % Water 100 % 100 % 100 % 25 % 175 % Wind 100 % 100 % 175 % 100 % 25 %

Tabulka 2.5: Modifikace poškození dle elementů

2.5 Podmínky vítězství

Hráč bude mít 20 životů a jeho cílem bude přežít 17 vln, které budou přichá- zet v pevně daných časových rozestupech. Jakmile se objeví poslední nepřítel z aktuální vlny, začne odpočet pro další vlnu. Hráč zvítězí když budou všichni nepřátelé mrtví a počet životů hráče bude větší než nula. Naopak v okamžiku, kdy počet životů klesne na nulu, hráč prohraje.

2.6 Obtížnosti

Hráč si bude moci zvolit jednu ze tří obtížností, jež budou rozlišeny pomocí modifikace rychlosti nepřátel (jako například v Bloons TD 5, vizsekce 1.2.1), modifikace získané odměny za zabití a bude odlišeno i chování nepřátel. Kromě toho bude mít hráč k dispozici tři odlišné mapy a možnost hrát na náhodně vygenerované mapě.

• lehká – nepřátelé jsou o 20 % pomalejší a vybírají cestu náhodně, hráč získává o 20 % více zlata za zabití nepřítele

• střední – nepřátelé vybírají cestu postupně, lichý první cestu, sudý dru- hou cestu atd.

• těžká – hráč získává o 10 % méně zlata za zabití nepřítele, nepřátelé si vybírají nejkratší cestu

2.7 Funkční požadavky

• F1 – Hráč si může vybrat jednu ze tří různých obtížností.

• F2 – Hráč si může vybrat jednu ze tří různých map.

• F3 – Hráč si může nechat vygenerovat náhodnou mapu.

• F4 – Hráč bude moci kupovat a stavět věže.

34 2.8. Nefunkční požadavky

• F5 – Hráč bude moci vylepšovat věže. • F6 – Hráč bude moci pozastavit hru. • F7 – Hráč bude moci zrychlit hru. • F8 – Hráč bude moci restartovat hru. • F9 – Hráč se bude moci vrátit ze hry do menu. • F10 – Hra bude kromě lidského hráče podporovat hraní umělé inteli- gence. • F11 – Hra bude poskytovat rozhraní pro napojení externí umělé inteli- gence.

2.8 Nefunkční požadavky

• NF1 – Hra bude podporovat rozlišení 1024 × 768. • NF2 – Hra bude realizována v programovacím jazyce C#. • NF3 – Hra bude realizována pomocí herního frameworku MonoGame. • NF4 – Skriptování bude realizováno pomocí knihovny .NET Compiler Platform (dříve Roslyn). • NF5 – Hra bude podporovat operační systém Windows (verze 7 a vyšší). • NF6 – Hra bude v anglickém jazyce.

2.9 Případy užití

Na základe funkčních požadavků byly vytvořeny případy užití:

UC1 – Volba mapy • Aktér: Hráč • Popis: Hráč si v menu může vybrat jednu ze tří základních map nebo si nechá vygenerovat náhodnou mapu. • Pokryté funkční požadavky: F2, F3

UC2 – Volba obtížnosti • Aktér: Hráč • Popis: Hráč si v menu může vybrat jednu ze tří obtížností. • Pokryté funkční požadavky: F1

35 2. Návrh

UC3 – Volba hráče – lidský nebo AI • Aktér: Hráč

• Popis: Hráč si v menu může vybrat, jestli chce hru hrát sám nebo nechá hrát umělou inteligenci a nahraje skript s touto umělou inteligencí.

• Pokryté funkční požadavky: F10

UC4 – Stavba věže • Aktér: Hráč, AI

• Popis: Hráč nebo AI si může zvolit typ věže a postavit ji na jím zvolené políčko na mapě. Musí mít dostatek peněz a zvolené políčko nesmí být cesta nebo překážka.

• Pokryté funkční požadavky: F4, F11

UC5 – Vylepšení věže • Aktér: Hráč, AI

• Popis: Hráč nebo AI si může vybrat postavenou věž na mapě a zvolit a zakoupit vylepšení.

• Pokryté funkční požadavky: F5, F11

UC6 – Pozastavení hry • Aktér: Hráč

• Popis: Hráč může pozastavit hru.

• Pokryté funkční požadavky: F6

UC7 – Zrychlení hry • Aktér: Hráč

• Popis: Hráč může zrychlit průběh hry.

• Pokryté funkční požadavky: F7

UC8 – Restart hry • Aktér: Hráč

• Popis: Hráč může restartovat hru.

• Pokryté funkční požadavky: F8

36 2.9. Případy užití

UC9 – Návrat do menu

• Aktér: Hráč

• Popis: Hráč se může ze hry vrátit do menu.

• Pokryté funkční požadavky: F9

Obrázek 2.2 znázorňuje případy užití v menu hry. Na obrázku 2.3 jsou zná- zorněny případy užití přímo ve hře. Vystupuje zde jak lidský hráč, tak i umělá inteligence. Pokud byla v menu zvolena umělá inteligence, pak lidský hráč stále může provádět všechny případy užití, až na stavbu věže (UC4) a vylep- šení věže (UC5), které provádí umělá inteligence.

Volba mapy

Volba obtížnosti

Hráč

Volba hráče – lidský nebo AI

Obrázek 2.2: Diagram případů užití v menu hry

37 2. Návrh

Stavba věže

Vylepšení věže

Hráč AI

Pozastavení hry

Zrychlení hry

Návrat do menu Restart hry

Obrázek 2.3: Diagram případů užití ve hře

38 Kapitola 3

Realizace

Tato kapitola se zabývá implementací prototypu. Je zde popsána struktura projektu (viz sekce 3.1), základní herní objekty (viz sekce 3.2), napojení externí umělé inteligence (viz sekce 3.3), generování náhodné mapy (viz sekce 3.4) a další zajímavosti. Implementace prototypu je provedena pomocí programovacího jazyka C# s využitím herního frameworku MonoGame [43]. Podpora skriptování je řešena pomocí .NET Compiler Platform (dříve Roslyn) [44] od firmy Microsoft.

3.1 Struktura projektu

U každého projektu je důležité, aby byl dobře strukturovaný a přehledný. Tento projekt obsahuje přes 80 tříd, které jsou logicky rozděleny do něko- lika takzvaných namespace a pro větší přehlednost má každý namespace svoji složku. Základní namespace projektu je Tower_Defense_AI_Competition. Pod tímto jmenným prostorem se vyskytuje 9 dalších namespace:

GUI (Graphical User Interface) obsahuje prvky souvicející s grafickým uži- vatelským rozhraním (například tlačítko) a třídy zajišťující zpracování vstupu myši;

ScreenManagement obsahuje manažera obrazovek (screen) a jednotlivé ob- razovky – například obrazovku menu nebo herní obrazovku. Herní obra- zovka představuje samotný herní svět a proto se zde nachází velká část logiky samotné hry;

Physics zajišťuje kolize objektů;

GameMap obsahuje například třídu Map reprezentující mapu, dále třídu Tile reprezentující políčko na mapě a také i generátor náhodných map;

Pathfinding se zabývá hledáním cest v mapě a jejich výběrem (viz sekce 3.5);

39 3. Realizace

Abilities obsahuje třídy reprezentující schopnosti nepřátel a věží;

Controller umožňuje ovládat hru – kupovat věže či vylepšení a stavět věže. Nachází se zde abstraktní třída BaseGameController a její dva potomci (jeden controller pro hráče a druhý pro umělou inteligenci);

General obsahuje herní objekty – nepřátele, věže, projektily a různé další třídy;

Scripting obsahuje třídu ScriptingAPI, jejíž proměnné a metody lze ve skriptech používat. Kromě toho obsahuje například třídu Tower nebo Entity, které jsou zjednodušenými verzemi stejnojmenných tříd z na- mespace General. Jejich mapování zajišťuje třída ObjectMapper.

3.2 Základní herní objekty

Pro reprezentaci herních objektů byla vytvořena základní třída GameObject. Poskytuje základní vlastnosti a možnosti, které herní objekty potřebují. Kon- krétně se jedná o atributy jako je například pozice, rotace či textura. Mezi nejdůležitější metody patří metoda Draw, která zajišťuje vykreslování a me- toda Update, v níž lze vykonávat nějakou logiku. Mezi další metody patří metody k nahrání textury či nastavení aktuální textury. Ze třídy GameObject dědí několik dalších herních objektů. Jejichž přehled lze vidět na obrázku 3.1. Tyto zděděné třídy mají podle potřeby přepsané (override) virtuální metody (například Draw či Update) svého rodiče. Samotný MonoGame framework používá tento přístup dvou metod (Update, Draw), logika je tedy oddělena od vykreslování. Na tento přístup bylo v tomto projektu navázáno.

Tile Mezi třídy dědící z GameObject patří třída Tile. Ta reprezentuje políčko mapy. Obsahuje proto kromě zděděných vlastností navíc výčtový typ (enum) TileType a TileTextureType. TileType může být buď cesta, překážka nebo prostředí (kde lze umísťovat věže). Na políčka lze stavět věže, proto třída Tile obsahuje i atribut typu Tower. Pokud na políčku není umístěná věž, pak má tento atribut hodnotu null.

Entity Třída Entity představuje nepřátelskou jednotku. Má navíc například počet životů, typ jednotky, typ elementu, rychlost. Dále obsahuje instanci třídy PathFollower, jež zajišťuje následování cesty. Třída Entity implementuje rozhraní ICollidable, což je nutné pro detekci kolizí s projektily.

40 3.2. Základní herní objekty

Obrázek 3.1: Diagram tříd dědících z GameObject

Ve hře je sedm typů nepřátel, každý s jinými vlastnostmi, nicméně ne- bylo vytvořeno sedm tříd, ale pouze jedna. O vytvoření jednotlivých typů nepřátel – přiřazení odpovídajícíh vlastností či schopností – se stará třída EntityFactory. Vlastnosti nepřátel jsou uloženy ve třídě EntityConstants.

Projectile Třída Projectile představuje střelu věže. Obsahuje velikost poškození, ele- ment, rychlost a cíl (nepřítel), na jehož základě vypočítá směr. Implemen- tuje rozhraní ICollidable, aby mohla kolidovat s nepřítelem. Každá věž má svůj typ projektilu. Vytváření jednotlivých typů projektilů zajišťuje třída ProjectileFactory.

Tower Třída Tower reprezentuje věž. Mezi její proměnné patří například dosah, ve- likost poškození, rychlost střelby, typ věže či cíl. Ve své Update metodě má logiku pro zaměřování nepřítele a otáčení se za ním. K implementaci střelby s určitou frekvencí byla použita třída Timer. Vytváření jednotlivých typů věží zajišťuje třída TowerFactory.

Spawner Třída Spawner zajišťuje vytváření instancí nepřátel. Mezi jednotlivými nepřa- tely je časový rozestup, stejně tak mezi vlnami. Proto byla k implementaci použita třída Timer.

41 3. Realizace

3.3 Napojení externí umělé inteligence

Hra je vytvořená tak, že ji může hrát buď hráč, nebo místo sebe může ne- chat hrát umělou inteligenci. Za tímto účelem bylo vytvořeno rozhraní, jež umožňuje umělé inteligenci komunikovat s hrou. Toto rozhraní představuje třída ScriptingAPI. Třídy, atributy a metody dostupné pro autora skriptu dokumentuje příloha B. Napojení externí umělé inteligence bylo realizováno pomocí skriptování. Pro podporu skriptování byla použita knihovna .NET Compiler Platform (dříve Roslyn) od firmy Microsoft. Hráč nahraje skript v jazyku C#slo- gikou umělé inteligence a tento skript je následně spouštěn každou obrazovku (frame). Ve skriptech hráč nepotřebuje mít k dispozici herní objekty se všemi atri- buty a metodami. Navíc by tak mohl podvádět – modifikovat přímo třeba životy nepřátel. Jelikož má skriptovací engine k dispozici celou assembly hry, bylo nutné ochránit většinu tříd modifikátorem internal. K herním objektům byly vytvořeny jejich ekvivalenty pro skriptování – jednodušší a s méně atri- buty. Třída ObjectMapper se stará o přemapování objektů ze hry na objekty pro skriptování (viz obrázek 3.2). K samotnému ovládání hry (stavba věží, vylepšování věží) byla vytvo- řena třída BaseGameController a její dva potomci PlayerGameController a AIGameController. PlayerGameController slouží ke hrání hráčem. Nao- pak AIGameController umožňuje spouštět skripty. Nejdříve nahraný skript zkompiluje (viz. obrázek 3.3) a to asynchronně – aby se při delší kompilaci hra nezastavila. Pokud dojde k chybě při kompilaci skriptu, chyba se zapíše do souboru. Poté dochází v metodě Update(GameTime gameTime) k předání herních dat (počet životů, nepřátelé atd.) do objektu hostScriptingAPI (instance třídy ScriptingAPI). Následně je spuštěn (viz obrázek 3.4) skript a jako pa- rametr má právě objekt hostScriptingAPI, jehož public proměnné a metody lze ve skriptu používat. Pokud nastane chyba za běhu skriptu, pak je zapsána do souboru. Skript je spouštěn opakovaně, jelikož metoda Update předsta- vuje v MonoGame frameworku herní smyčku a volá se opakovaně dokud hra běží. Jelikož se skript spouští opakovaně, tak pokud si hráč chce uchovat třeba stav nějakých proměnných, může k tomu použít slovník (Dictionary) StateHolder, který je součástí třídy ScriptingAPI. Případ, kdy hráč v menu vybere soubor se skriptem a následně klikne na tlačítko Play nebo Play Random, je znázorněn sekvenčním diagramem na obrázku 3.5.

První umělá inteligence Byla vytvořena jednoduchá umělá inteligence, která na začátku postaví dvě náhodné věže. Věže staví na náhodná políčka kolem cesty. Potom čeká, dokud

42 3.4. Náhodné generování mapy

public static Tile Map(GameMap.Tile tile) { return new Tile(tile.Position, Map(tile.Tower), ,→ tile.TileType); }

Obrázek 3.2: Ukázka mapovací metody není k dispozici dostatek peněz pro vylepšení náhodné postavené věže (jelikož se skript neustále pouští znovu, pak tuto podmínku splní nejlevnější vylepšení, jež je v daném momentu k dispozici). Jakmile je dostatek peněz, inteligence se náhodně rozhodne zda postaví další věž nebo provede vylepšení.

Druhá umělá inteligence Tato umělá inteligence se snaží postupně stavět věže na políčka, která mají co nejvyšší počet sousedních políček, které jsou cestou. Na začátku umělá inteligence postaví 4 věže, náhodně zvolí první nebo druhý typ věže. Poté začne vylepšovat všechny postavené věže na úroveň 2. Jakmile jsou všechny věže vylepšeny, umělá inteligence se náhodně rozhoduje, zda postaví náhodnou věž nebo vylepší stávající – vybere nejlevnější dostupné vylepšení.

Třetí umělá inteligence Tato umělá inteligence umísťuje věže dvěma způsoby. Pokud je na mapě pouze jedna cesta, pak umísťuje věže stejně jako předchozí umělá inteligence. Pokud se na mapě vyskytuje více cest, pak umísťuje věže k políčkům, které sousedí s políčkem cesty, jenž se vyskytuje v co nejvíce cestách. Tento přístup by měl zajistit, že umělá inteligence nebude stavět věže k méně frekventovaným cestám. Na začátku se umělá inteligence dívá na složení vln a podle toho po- staví několik prvních věží. Poté vylepší postavené věže na třetí úroveň a začne stavět blízko konce cesty 6 nejlevnějších věží. Poté jsou kupovány nejlevnější vylepšení.

3.4 Náhodné generování mapy

Tuto funkcionalitu zajišťuje třída MapGenerator pomocí své třídní me- tody GenerateRandomMap, která vrátí náhodně vygenerovanou mapu. Nej- prve se náhodně vygenerují souřadnice startovního políčka (v prvním sloupci mapy). Dále se vytvoří dvourozměrné pole objektů Tile, jež reprezentují po- líčka mapy. Těmto políčkům je náhodně přiřazena jedna ze dvou textur trávy. V takto připraveném poli se nyní musí vygenerovat náhodná cesta.

43 3. Realizace

Task.Run(() => { try { scriptRunner = CSharpScript.Create(script, ,→ options, ,→ typeof(ScriptingAPI)).CreateDelegate(); } catch (Exception ex) { using (StreamWriter sw = ,→ File.AppendText("Log\\" + scriptName + ,→ date + ".txt")) { sw.WriteLine(ex.ToString()); } throw; } compiled = true; });

Obrázek 3.3: Kompilace skriptu

K tomu slouží třída DFSPathGenerator. Tato třída, jak už z názvu plyne, používá modifikovaný algoritmus DFS (Depth-first search), který v mapě vy- generuje náhodnou cestu vedoucí ze startovního políčka. Třída obsahuje pro- měnnou MinimalPathLength, jež udává minimální délku vygenerované cesty. Algoritmus tedy náhodně vygeneruje cestu, jejíž délka je větší nebo rovna této délce. Metoda GeneratePathUtil(Map map, Tile current, List path) (viz obrázek 3.6) obsahuje samotnou implementaci algoritmu. Metoda navštíví políčko current, nastaví jeho typ a texturu na cestu a vloží ho do seznamu již navštívených políček. Dále se testuje ukončovací podmínka – v případě, že je vygenerovaná cesta delší než nastavená minimální délka a zároveň jsou souřadnice políčka current v posledním sloupci (konec cesty se musí nacházet v posledním sloupci mapy), pak se vrátí vygenerovaná cesta. Pokud podmínka není splněná, dochází k náhodnému zamíchání seznamu sousedů políčka current. Tím je zajištěna náhodná expanze políček a tedy i náhodnost výsledné cesty. Následně dochází k expanzi sousedů a to pouze v případě, že nejsou v seznamu již navštívených políček a nejsou již cestou. A pokud by se cestou staly, tak by pak nebyly součástí čtverce o rozměrech 2 × 2 složeného pouze z políček cest. Takové rozmístění bylo zakázáno, jednak

44 3.4. Náhodné generování mapy

if (compiled) { hostScriptingAPI.Entities = entityList.Select(e ,→ => ObjectMapper.Map(e)).ToList(); hostScriptingAPI.GameTime = gameTime; hostScriptingAPI.Lives = Lives; hostScriptingAPI.Money = Money; hostScriptingAPI.Wave = Wave; hostScriptingAPI.Difficulty = Difficulty; hostScriptingAPI.Tower1Count = Tower1Count; hostScriptingAPI.Tower2Count = Tower2Count; hostScriptingAPI.Tower3Count = Tower3Count;

try { scriptRunner.Invoke(hostScriptingAPI); } catch (Exception ex) { using (StreamWriter sw = ,→ File.AppendText("Log\\" + scriptName + ,→ date + ".txt")) { sw.WriteLine(ex.ToString()); } throw; } }

Obrázek 3.4: Spuštění skriptu narušuje pozdější vyhledávání cest v mapě a navíc nevypadá příliš hezky. Pokud je podmínka splňěna, dochází k rekurzivnímu zanoření. Po návratu se testuje výsledek zanoření. Pokud vrácená cesta není null, pak je znovu vrácena a propaguje se skrze rekurzi až do vynoření. Pokud podmínka pro expanzi políček není splněná nedochází k rekurziv- nímu zanoření, ale políčko je vloženo do seznamu navštívených políček, aby dále nebylo zpracováváno. Pokud se například algoritmus dostane do situace, kde vznikne neúplná cesta se slepým koncem a nejsou k dispozici žádná políčka pro další expanzi, tak algortimus provádí backtracking (vynořuje se z rekurze). Aktuální políčko musí samozřejmě přenastavit a odebrat z cesty. Vrátí se hodnota null a řízení

45 3. Realizace P l a y e r l o o p

: G a m e ( g a U m p d e a T t i e m I n e i ) t ( ) : S c r e e n M báe .:Skečídarmsošěískriptu spouštění diagram Sekvenční 3.5: Obrázek a n a U g e p r d a t e ( g a m e T i m e ) : G a m e S c r e e n g a m e C o a ( G n i i t s e S r A t c o G r I l = i a l p e t m t r r = u = e a U

e C : i a , p S o i c d n C r t a o i r p t n o e t t l ) ( r l g e o a r l l m e : G r e T a i m m e e C ) o n t r o l l e r ( F s a c c r i t p o t N r = y e a w i S c r i p t ) A I G a a i C m o e n C t r o o n l l t e r o r

l : I l n e v r « o c k r e e a ( h t e o » s t S c r i p ti n g A P I ) : S c r i p t R u n n e r

46 3.4. Náhodné generování mapy private Path GeneratePathUtil(Map map, Tile current, ,→ List path) { //fill path current.TileType = TileType.Path; current.TextureType = TileTextureType.Path_0; visited.Add(current);

if (path.Count + 1 >= MinimalPathLength && Map.TransformPositionTo2DIndexes(current.Position).X ,→ == 9)//reached end { path.Add(current);//append to path return new Path(path); } List neighbours = ,→ map.GetNeighboursForTile(current).Shuffle();//so ,→ we expand randomly foreach (Tile neighbour in neighbours) { if (!visited.Contains(neighbour) && ,→ neighbour.TileType == TileType.Environment ,→ && IsValidPosition(map, neighbour)) { Path p = GeneratePathUtil(map, neighbour, ,→ new List(path) { current ,→ });//append to path if (p != null) { return p; } } else { visited.Add(neighbour); } } //dead end, no path => reset filled tile and ,→ backtrack current.TileType = TileType.Environment; current.TextureType = random.Next(100) < 30 ? ,→ TileTextureType.Grass_1 : ,→ TileTextureType.Grass_0; path.Remove(current); return null; } 47

Obrázek 3.6: Kód metody GeneratePathUtil 3. Realizace se předá předchozímu políčku v cestě a hledá se alternativní cesta. Algoritmus tedy náhodně expanduje políčka a pokud se nedaří vygenerovat validní cestu, tak algoritmus provádí backtracking a hledá alternativní cestu. Cestu se ovšem nemusí vždy podařit vygenerovat. GenerateRandomMap() proto volá metodu na generování náhodné cesty tak dlouho, dokud se nepo- daří cestu vygenerovat. Po vygenerování náhodné cesty je na závěr nastavena textura startu a konce cesty a náhodně jsou do mapy doplněny překážky.

3.5 Výběr nalezených cest

Dle návrhu si nepřátelé vybírají jakou cestou se vydají v závislosti na nastavené obtížnosti. Pro tento účel bylo vytvořeno rozhraní (interface) IPathSelector (viz obrázek 3.7). Toto rozhraní je implementováno třemi třídami, kde každá z nich se používá pro konkrétní obtížnost. Metoda SelectPath(Paths paths) obdrží jako parametr seznam nalezených cest a vrátí jednu z nich. Cesty jsou vyhledány modifikovaným algoritmem BFS, který nalezne všechny cesty ze startu do cíle. Pro jednoduchou obtížnost byla vytvořena třída RandomPathSelector. Třída implementuje rozhraní IPathSelector. Tato implementace vybere ná- hodnou cestu ze všech nalezených. Při normální obtížnosti si nepřátelé vybírají cestu postupně – první ne- přítel se vydá první cestou, druhý druhou atd. Jakmile se nepřítel vydá po- slední cestou, začne se znovu od začátku. Tuto funkcionalitu zajišťuje třída InOrderPathSelector (viz obrázek 3.8), jež si ukládá index naposledy vy- brané cesty a pomocí jeho modulování s počtem cest dojde k zajištění cyklic- kého chování. Pro nejtěžší obtížnost je vytvořena třída ShortestPathSelector, která vybírá nejkratší cestu. Pokud je nejkratších cest více, pak vybere náhodnou z nich. Pro každou obtížnost je nutné vytvořit instanci jiné třídy implementu- jící rozhraní IPathSelector. Tuto funkcionalitu zajišťuje třída fungující na principu návrhového vzoru továrna (factory) PathSelectorFactory (viz ob- rázek 3.9).

public interface IPathSelector { Path SelectPath(Paths paths); }

Obrázek 3.7: Kód rozhraní IPathSelector

48 3.5. Výběr nalezených cest

internal class InOrderPathSelector : IPathSelector { private int pathIndex = 0;

public Path SelectPath(Paths paths) { Path selected = paths.PathList[pathIndex]; pathIndex++; pathIndex %= paths.PathList.Count; return selected; } }

Obrázek 3.8: Kód třídy InOrderPathSelector

internal class PathSelectorFactory { public static IPathSelector GetPathSelector() { switch (BaseGameController.Difficulty) { case DifficultyType.Easy: return new RandomPathSelector(); default: case DifficultyType.Normal: return new InOrderPathSelector(); case DifficultyType.Hard: return new ShortestPathSelector(); } } }

Obrázek 3.9: Kód třídy PathSelectorFactory

49 3. Realizace

3.6 Časovač

Ve hře se vyskytují mechanismy závislé na čase – například vlny nepřátel se objevují s určitou frekvencí nebo samotní nepřátelé ve vlnách. Také věže střílí s určitou frekvencí a některé schopnosti něpřátel či věží se provádějí frekventovaně. Proto byla vytvořena třída Timer (časovač), jež přijímá tzv. callback, což je ukazatel na metodu, kterou bude Timer volat dle nastavené frekvence. Timer se dobře a jednoduše používá a v projektu je hojně využíván. Logika časovače je znázorněna na obrázku 3.10.

public void Update(GameTime gameTime) { if (Enabled) { elapsedTimeMs += ,→ gameTime.ElapsedGameTime.Milliseconds; if (elapsedTimeMs >= Frequency / ,→ BaseGameController.GameSpeed) { if (!Paused) { Callback.Invoke(); Reset(); } } } }

Obrázek 3.10: Kód Update metody třídy Timer

50 Kapitola 4

Testování

Samotný kód byl podroben statické analýze kódu, jež například odhalila ne- používané namespace v některých třídách či zbytečné použití některých kvali- fikátorů. Pomohla také například doplnit modifikátor přístupu readonly k pro- měnným, ze kterých se pouze čte nebo nalézt nepoužívané proměnné. Hra byla neustále testována během vývoje, kromě toho bylo také provedeno uživatelské testování použitelnosti (User Experience) – to se týká zejména funkčnosti, přehlednosti a srozumitelnosti uživatelského rozhraní. Testovací scénáře pokrývají případy užití. Dále byla testována i herní zkušenost hráčů (Game Experience) – to znamená, jestli se hra dobře hraje, jestli není moc těžká nebo příliš lehká apod. Za účelem testování byli vybrání 4 testeři, kteří dostali tyto testovací scénáře:

Testovací scénář 1 1. Spusťe hru.

2. Vyberte si jednu ze třech map.

3. Vyberte si jednu ze třech obtížností.

4. Ponechte lidského hráče.

5. Začněte hru.

6. Zkontrolujte, že se zobrazila herní obrazovka – vlevo nahoře herní mapa, vlevo dole panel a vpravo také panel.

Testovací scénář 2 1. Spusťe hru.

2. Ponechte mapu Level 1.

51 4. Testování

3. Ponechte normální obtížnost.

4. Ponechte lidského hráče.

5. Začněte hru.

6. Pozastavte hru.

7. U každé věže zjistěte její název, poškození, dosah, rychlost střelby, typ jednotek, na které útočí, speciální schopnost a cenu.

8. Zrušte pozastavení hry.

9. Postavte věž s názvem Monster na nějaké políčko podél cesty.

10. Ověřte, že se na vybraném políčku objevila věž a množství zlata je 300.

Testovací scénář 3 1. Spusťe hru.

2. Ponechte normální obtížnost.

3. Ponechte lidského hráče.

4. Začněte hru na náhodné mapě.

5. Zvolte libovolnou věž a zkuste ji postavit na cestu.

6. Zvolte libovolnou věž a zkuste ji postavit na kámen.

7. Postavte věž, jež udílí procentuální poškození, někam podél cesty.

8. Klikněte na postavenou věž na mapě.

9. Ověřte, že se zobrazil indikátor značící dosah věže a v panelu vlevo dole by měly být vlastnosti věže.

Testovací scénář 4 1. Spusťe hru.

2. Ponechte normální obtížnost.

3. Ponechte lidského hráče.

4. Začněte hru na náhodné mapě.

5. Postavte několik věží.

6. Zrychlete hru.

52 7. Jakmile se objeví všichni nepřátelé ze třetí vlny, zrušte zrychlení.

8. Pozastavte hru a prohlédněte si složení další vlny.

9. Restartujte hru.

10. Přečtěte si nápovědu k elementům.

11. Vraťte se ze hry do menu.

12. Ukončete hru.

Testovací scénář 5 1. Spusťe hru.

2. Zvolte mapu Level 1.

3. Zvolte obtížnost dle uvážení.

4. Ponechte lidského hráče.

5. Začněte hru.

6. Postavte vedle cesty dvě Monster věže a jednu Eye věž.

7. Zrychlete hru.

8. Vylepšete jednu Monster věž na úroveň dva a poté pozastavte hru.

9. Klikněte na věž a podívejte se v dolním panelu na její vlastnosti.

10. Klikněte na Monster věž s úrovní jedna a porovnejte vlastnosti.

11. Odpauzněte hru.

12. Vylepšete Monster věž z úrovně dva na úroveň tři pomocí vylepšení rychlosti střelby.

13. Klikněte na vylepšenou Monster věž a ověřte změnu rychlosti střelby.

14. Ukončete hru.

Testovací scénář 6 1. Zahrajte si každou ze třech základních map na všech obtížnostech a zkuste hru vyhrát.

53 4. Testování

Testovací scénář 7 1. Spusťe hru.

2. Zvolte obtížnost, která vám vyhovuje.

3. Ponechte lidského hráče.

4. Začněte hru na náhodné mapě.

5. Zkuste hru vyhrát.

Testovací scénář 8 1. Spusťe hru.

2. Zvolte jakoukoliv obtížnost.

3. Vyberte umělou inteligenci – BasicAI2.csx.

4. Začněte hru na náhodné mapě.

5. Pozorujte průběh hry.

6. Zkuste hru pozastavit, restartovat, zrychlit.

Zpětná vazba testerů byla spíše pozitivní. Uživatelské rozhraní je funkční a dostatečně přehledné. Herní zkušenost byla také pozitivní, testerům se hra hrála dobře a nemyslí si, že by byly parametry hry nevhodně nastaveny. Něteré konkrétní podněty testerů:

1. Ve hře by mohl být zvuk.

2. Hra by mohla podporovat více rozlišení.

3. Hra by si mohla pamatovat nastavené rozlišení při dalším spuštění.

4. Informace o věži v pravém panelu by měly být blíže věži.

5. Ve hře by mohlo být tlačítko s nápovědou – informacemi o hře.

6. Tlačítko Menu přejde do menu bez varování.

7. Křížek zavře okno hry bez varování.

8. Náhled mapy neodpovídá skutečné mapě.

9. Text na tlačítku pro vylepšení přetékal tlačítko.

10. Klávesa escape ukončovala hru.

54 4.1. Měření

Podněty 2, 4, 5, 6, 7, 8, 9 a 10 byly do hry zapracovány. Podněty 1 a 3 ne- byly implementovány z důvodu nízké priority a závažnosti. Můžou být ovšem implementovány v budoucnu jako možné vylepšení hry. Při testování se také podařilo najít ve hře chybu, která zastavila celou hru. Tato chyba byla opra- vena.

4.1 Měření

Vytvořené umělé inteligence byly vyzkoušeny a spuštěny na třech základních mapách a to pro každou obtížnost. Výsledky měření pro první mapu jsou jsou uvedené v tabulkách 4.1, 4.2, 4.3. Pro druhou mapu v tabulkách 4.4, 4.5, 4.6. A pro poslední mapu v tabulkách 4.7, 4.8, 4.9. Tabulky znázorňují průměrná data pro 20 her. Tedy jaký byl průměrný počet životů, průměrné číslo vlny zobrazené v pravém panelu a průměrný počet zabitých nepřátel na konci hry. Poslední sloupec znázorňuje množství vyhraných her v procentech. Z tabulek lze vidět, že první umělá inteligence není příliš úspěšná, nejvíce se jí dařilo na první mapě s lehkou obtížností. Při těžších obtížnostech a více cestách není svým náhodným přístupem příliš efektivní. Druhé umělé inteli- genci se daří o něco lépe, ale má problémy s normální a těžkou obtížností. Třetí umělá inteligence má nejlepší výsledky, nicméně má problémy například s mapou Level 3 na těžké obtížnosti. Tato mapa je ovšem velice těžká i pro lidského hráče. AI Životy Vlna Zabito Výher 1 5,8 13,6 67,1 50 % 2 18,95 17 128,9 100 % 3 18,55 17 143,8 100 %

Tabulka 4.1: Výsledky měření externích AI agentů na mapě Level 1 s lehkou obtížností

AI Životy Vlna Zabito Výher 1 0,75 12,05 37,9 10 % 2 15,6 16,05 112,3 90 % 3 18,5 17 142,9 90 %

Tabulka 4.2: Výsledky měření externích AI agentů na mapě Level 1 s normální obtížností

55 4. Testování

AI Životy Vlna Zabito Výher 1 2,15 13,35 38,35 20 % 2 10,15 16,95 109,4 65 % 3 15,85 16,75 125,7 95 %

Tabulka 4.3: Výsledky měření externích AI agentů na mapě Level 1 s těžkou obtížností

AI Životy Vlna Zabito Výher 1 0 11,1 24,7 0 % 2 5,35 15,95 81,6 55 % 3 6,85 16,6 99,95 80 %

Tabulka 4.4: Výsledky měření externích AI agentů na mapě Level 2 s lehkou obtížností

AI Životy Vlna Zabito Výher 1 0,3 10,9 31,55 5 % 2 0,6 14,7 58,3 10 % 3 6,85 16,75 106 85 %

Tabulka 4.5: Výsledky měření externích AI agentů na mapě Level 2 s normální obtížností

AI Životy Vlna Zabito Výher 1 0 8,8 13,65 0 % 2 0 11,1 27,5 0 % 3 1,7 14,35 68,7 30 %

Tabulka 4.6: Výsledky měření externích AI agentů na mapě Level 2 s těžkou obtížností

AI Životy Vlna Zabito Výher 1 0,25 10,95 22,5 5 % 2 2,32 16,55 88,7 45 % 3 9,05 17 107,7 90 %

Tabulka 4.7: Výsledky měření externích AI agentů na mapě Level 3 s lehkou obtížností

56 4.1. Měření

AI Životy Vlna Zabito Výher 1 0 7,85 7,45 0 % 2 1 11,6 35,95 5 % 3 8,2 16,75 102,4 90 %

Tabulka 4.8: Výsledky měření externích AI agentů na mapě Level 3 s normální obtížností

AI Životy Vlna Zabito Výher 1 0 8,05 9,15 0 % 2 0 11,65 33,2 0 % 3 0,1 11,9 34,45 5 %

Tabulka 4.9: Výsledky měření externích AI agentů na mapě Level 3 s těžkou obtížností

57

Závěr

Cílem této práce bylo seznámit se s strategickými hrami žánru Tower De- fense, algoritmy pro navigaci jednotek a způsoby rozlišení herní obtížnosti. Žánr Tower Defense, jeho prvky a mechaniky (včetně způsobů rozlišení obtíž- ností) byly podrobně popsány. Zkoumáni byli i vybraní zástupci tohoto žánru. Práce dále obsahuje i popis algoritmů pro navigaci jednotek – vybráni byli tři zástupci: Prohledávání do šířky, Dijsktrův algoritmus a A*. Dalším z cílů bylo implementovat prototyp strategické hry typu Tower De- fense tak, aby kromě lidského hráče poskytovala i možnost napojení externí umělé inteligence. Za tímto účelem byl vytvořen návrh na základě předcho- zího popisu žánru Tower Defense. Jednotlivé parametry v návrhu byly během vývoje neustále upravovány tak, aby bylo dosaženo co nejlepšího herního zá- žitku. Hra také obsahuje generování náhodných map a tři úrovně obtížnosti, které jsou rozlišeny pomocí změny některých parametrů a způsobu navigace nepřátel. Za účelem napojení externí umělé inteligence bylo využito knihovny .NET Compiler Platform (dříve Roslyn) od firmy Microsoft, jež umožňuje spouštět skripty psané v jazce C#. Pro tyto skripty bylo vytvořeno rozhraní, které umožňuje komunikaci skriptu a samotné hry. Na závěr bylo provedeno uživatelské testování, jenž odhalilo možnosti zlep- šení a některé z nich byly do hry přidány. Jednotlivé umělé inteligence byly spuštěny a otestovány na různých mapách s různou obtížností. Do budoucna lze prototyp vylepšit například přídáním dalších typů nepřá- tel a věží, přidáním zvuku, animací nebo možností ukládat mapy do souborů a vytvořením editoru map pro hráče. Zajímavá je také myšlenka umístit hru na server, kde by byla fronta, do které by hráči nahrávali své skripty s umělou inteligencí. Server by tyto skripty spustil a zjistil jejich úspěšnost, tu by pak mohl zobrazovat v nějakém online žebříčku.

59

Seznam použité literatury

1. AVERY, Phillipa; TOGELIUS, Julian; ALISTAR, Elvis; LEEUWEN, Robert Pieter van. Computational intelligence and tower defence games. In: 2011 IEEE Congress of Evolutionary Computation (CEC) [online]. IEEE, 2011, s. 1084–1091 [cit. 2019-04-22]. ISBN 978-1-4244-7834-7. Do- stupné z DOI: 10.1109/CEC.2011.5949738. 2. SIMMONDS, Nic. Tower Defense – A brief History [online]. 2010 [cit. 2019-03-22]. Dostupné z: https://mygaming.co.za/news/features/ 6341-tower-defense-a-brief-history.html. 3. FUNK, John. MOBA, DOTA, ARTS: A brief introduction to gaming’s biggest, most impenetrable genre [online]. 2013 [cit. 2019-03-22]. Dostupné z: https://www.polygon.com/2013/9/2/4672920/moba-dota-arts- a-brief-introduction-to-gamings-biggest-most. 4. VOLK, Pete. League of Legends now boasts over 100 million monthly active players worldwide [online]. 2016 [cit. 2019-03-22]. Dostupné z: https : / / www . riftherald . com / 2016 / 9 / 13 / 12865314 / monthly - lol-players-2016-active-worldwide. 5. GAME IN A BOTTLE. GemCraft. Version 1.11 [software]. 2008 [cit. 2019-03-27]. Dostupné z: http://armorgames.com/play/1716/gemcraft. 6. SCOTT, David. Flash Element TD. Version 2007-02-01 [software]. 2007 [cit. 2019-04-30]. Dostupné z: http : / / www . webgames . cz / flash - element-tower-defence/2157-0/. 7. DROIDHEN. Defender II. Version 1.4.6 [software]. 2017 [cit. 2019-05- 01]. Dostupné z: https://play.google.com/store/apps/details? id=com.droidhen.defender2. 8. ARMOR GAMES. Tower Defense Games - Armor Games [online]. 2019 [cit. 2019-05-01]. Dostupné z: https://armorgames.com/category/ tower-defense-games?sort=plays.

61 Seznam použité literatury

9. KONGREGATE. Tower Defense games on Kongregate [online]. 2019 [cit. 2019-05-01]. Dostupné z: https://www.kongregate.com/tower- defense-games?sort=gameplays. 10. FARSANG, Roland. Welcome to Bloons Tower Defense fansite [online] [cit. 2019-04-11]. Dostupné z: https://people.inf.elte.hu/faruaai/. 11. NINJA KIWI. Bloons TD 5 [software]. 2012 [cit. 2019-03-22]. Dostupné z: https://www.kongregate.com/games/Ninjakiwi/bloons-td-5. 12. ELECTRONIC ARTS. Plants vs. Zombies. Version 2.3.30 [software]. 2019 [cit. 2019-05-03]. Dostupné z: https://play.google.com/store/ apps/details?id=com.ea.game.pvzfree_row. 13. IRONHIDE GAME STUDIO. Kingdom Rush Frontiers. Version 1.1.6a [software]. 2013 [cit. 2019-03-22]. Dostupné z: https://armorgames. com/play/15717/kingdom-rush-frontiers. 14. Kingdom Rush Frontiers - Ironhide Game Studio [online] [cit. 2019-04- 11]. Dostupné z: https://www.ironhidegames.com/Games/kingdom- rush-frontiers. 15. IRIYSOFT. Cursed Treasure 2. Version 1.3.2 [software]. 2013 [cit. 2019- 03-22]. Dostupné z: https://www.kongregate.com/games/IriySoft/ cursed-treasure-2. 16. PREECE, Paul. Desktop Tower Defense. Version 1.21b [software]. 2007 [cit. 2019-03-22]. Dostupné z: https://www.kongregate.com/games/ preecep/desktop-tower-defense. 17. Paul Preece [online]. 2019 [cit. 2019-03-22]. Dostupné z: https://www. crunchbase.com/person/paul-preece. 18. Desktop Tower Defense Creates Startup [online]. 2019 [cit. 2019-03-22]. Dostupné z: https://techcrunch.com/2007/06/08/desktop-tower- defense-spurs-startup/. 19. SPRONCK, Pieter; PONSEN, Marc; SPRINKHUIZEN-KUYPER, Ida; POSTMA, Eric. Adaptive game AI with dynamic scripting. Machine Learning [online]. 2006, roč. 63, č. 3, s. 217–248 [cit. 2019-04-22]. ISSN 0885-6125. Dostupné z DOI: 10.1007/s10994-006-6205-6. 20. YANNAKAKIS, Georgios N.; TOGELIUS, Julian. Artificial Intelligence and Games [online]. Cham: Springer International Publishing, 2018 [cit. 2019-04-22]. ISBN 978-3-319-63518-7. Dostupné z DOI: 10.1007/978- 3-319-63519-4. 21. Deep Blue [online]. 2019 [cit. 2019-03-22]. Dostupné z: https://www. ibm.com/ibm/history/ibm100/us/en/icons/deepblue/. 22. AlphaGo [online]. 2019 [cit. 2019-03-22]. Dostupné z: https://deepmind. com/research/alphago/.

62 Seznam použité literatury

23. BOURG, David M.; SEEMANN, Glenn. AI for game developers. 1st ed. Sebastopol, CA: O’Reilly, c2004. ISBN 05-960-0555-5. 24. Computer Player Strategy Builder Guide AI Expert Documentation [on- line]. Ensemble Studios Corporation [cit. 2019-04-11]. Dostupné z: http: //cobweb.cs.uga.edu/~potter/aok/CPSB_AOK2.DOC. 25. AI Birds.org - Angry Birds AI Competition [online]. 2019 [cit. 2019-04- 07]. Dostupné z: https://aibirds.org/. 26. RENZ, Jochen. Twenty-Ninth AAAI Conference on Artificial Intelli- gence. AIBIRDS: The Angry Birds artificial intelligence competition [on- line]. 2015 [cit. 2019-03-23]. Dostupné z: https://www.aaai.org/ocs/ index.php/AAAI/AAAI15/paper/view/10050/9872. 27. AI Birds.org - Basic Game Playing Software [online]. 2019 [cit. 2019- 04-07]. Dostupné z: https://aibirds.org/basic- game- playing- software.html. 28. AI Birds Logo [online obrázek] [cit. 2019-04-07]. Dostupné z: https : //aibirds.org/. 29. GE, XiaoYu; GOULD, Stephen; RENZ, Jochen; ABEYASINGHE, Sa- han; KEYS, Jim; WANG, Andrew; ZHANG, Peng. Angry Birds Game Playing Software. Version 1.32 [software]. 2014 [cit. 2019-04-07]. Do- stupné z: https://aibirds.org/basic- game- playing- software. html. 30. Angry Birds AI [online]. 2014 [cit. 2019-03-23]. Dostupné z: https:// datalab.fit.cvut.cz/research/projects/45-angry-birds-ai. 31. CAMPO, Aurélien Da; FARJALLAH, Lazhar; PUTALLAZ, Pierre-Dominique; POULAIN, Romain. ASD Tower Defense. Version 2.0 [software]. 2016 [cit. 2019-05-01]. Dostupné z: https : / / github . com / Adolio / asd - tower-defense. 32. ROBINSON, Tim. Towerstorm. Version 0.1.0 [software]. 2018 [cit. 2019- 05-01]. Dostupné z: https://github.com/towerstorm. 33. HERNACKI, Jacob. BTD5 Track Paths [email ze dne 2019-04-11]. 2019. 34. PAVLENKO, Dmitry. Cursed Treasure 2 [email ze dne 2019-03-19]. 2019. 35. PATEL, Amit. Map representation [online]. 2019 [cit. 2019-03-21]. Do- stupné z: http://theory.stanford.edu/~amitp/GameProgramming/ MapRepresentations.html. 36. ŘEHOŘEK, Tomáš. Zaklady umělé inteligence: Stavový prostor a jeho heuristické prohledávání [online]. 2016 [cit. 2019-03-23]. Dostupné z: https: //courses.fit.cvut.cz/BI-ZUM/media/lectures/02-spacesearch- v5.0-anim.pdf.

63 Seznam použité literatury

37. MALÍK, Josef; SUCHÝ, Ondřej; TVRDÍK, Pavel; VALLA, Tomáš. Kostry, vzdálenosti v grafech, topologické řazení [online]. 2018 [cit. 2019-03-23]. Dostupné z: https://courses.fit.cvut.cz/BI-AG1/media/lectures/ bi-ag1-p3-handout.pdf. 38. MALÍK, Josef; SUCHÝ, Ondřej; TVRDÍK, Pavel; VALLA, Tomáš. Hle- dání nejkratších cest v ohodnoceném grafu [online]. 2018 [cit. 2019-03- 23]. Dostupné z: https://courses.fit.cvut.cz/BI- AG1/media/ lectures/bi-ag1-p12-handout.pdf. 39. BJÖRNSSON, Yngvi; ENZENBERGER, Markus; C. HOLTE, Robert; SCHAEFFER, Jonathan. Fringe Search: Beating A* at Pathfinding on Game Maps. IEEE 2005 Symposium on Computational Intelligence and Games, CIG’05 [online]. 2005, roč. 5, s. 121–133 [cit. 2019-05-03]. Do- stupné z: https://webdocs.cs.ualberta.ca/~holte/Publications/ fringe.pdf. 40. RUSSELL, Stuart. Artificial intelligence: a modern approach. Upper Sad- dle River, NJ: Prentice Hall, 2010. ISBN 978-0-13-604259-4. 41. BOTEA, Adi; BOUZY, Bruno; BURO, Michael; BAUCKHAGE, Chris- tian; NAU, Dana. Pathfinding in Games. In: LUCAS, Simon M.; MA- TEAS, Michael; PREUSS, Mike; SPRONCK, Pieter; TOGELIUS, Julian (ed.). Artificial and Computational Intelligence in Games. Dagstuhl, Ger- many: Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik, 2013, sv. 6, s. 21–31. Dagstuhl Follow-Ups. ISBN 978-3-939897-62-0. ISSN 1868-8977. Dostupné z DOI: 10.4230/DFU.Vol6.12191.21. 42. RABIN, Steven. Game AI Pro [online]. A K Peters/CRC Press, 2013-9- 11 [cit. 2019-04-22]. ISBN 978-146-6565-975. Dostupné z DOI: 10.1201/ b16725. 43. MonoGame. Version 3.6 [software]. 2017 [cit. 2019-05-02]. Dostupné z: http://www.monogame.net/2017/03/01/monogame-3-6/. 44. MICROSOFT. .NET Compiler Platform. Version 3.0.0 [software]. 2019 [cit. 2019-05-02]. Dostupné z: https://github.com/dotnet/roslyn.

64 Příloha A

Seznam použitých zkratek

AI Artificial Intelligence (umělá inteligence)

AoE 2 Age of Empires 2

BFS Breadth-first search (Prohledávání do šířky)

DFS Depth-first search (Prohledávání do hloubky)

FIFO First In, First Out

GUI Graphical user interface

KR Kingdom Rush ppf pixels per frame

RTS Real-time strategy

TD Tower Defense

65

Příloha B

Dokumentace skriptovacího API

Skriptování probíhá v jazyce C#. Samotný skript stačí uložit do textového souboru, na příponě nezáleží, ale pro zachování konvence je lepší soubor uložit s příponou csx. Skript je spouštěn každou obrazovku (frame) – pro uchování stavu využijte StateHolder. Ve skriptech jsou k dispozici následující třídy:

ScriptingAPI Tato třída umožňuje komunikaci mezi hrou a skriptem. Nabízí tyto proměnné a metody:

Map Map instance herní mapy

List Entities kolekce nepřátel na mapě int Lives počet životů hráče int Money počet peněz hráče int Wave číslo aktuální vlny

DifficultyType Difficulty aktuální obtížnost hry int Tower1Count počet postavených věží typu TowerType.Tower1 int Tower2Count počet postavených věží typu TowerType.Tower2 int Tower3Count počet postavených věží typu TowerType.Tower3

List> Paths všechny cesty na mapě

GameTime GameTime instance třídy Microsoft.Xna.Framework.GameTime, jež reprezentuje herní čas

Random Random instance třídy System.Random, jedná se o pseudonáhodný generátor čísel

67 B. Dokumentace skriptovacího API

Dictionary StateHolder kolekce klíčů a hodnot sloužící k uchovávání stavu (proměnných) skrze vícenásobné spuštění skriptů bool CanPlace(Tile tile) vrátí true, pokud na políčko lze umístit věž (políčko je typu TileType.Environment a žádná věž na něm nestojí), jinak false bool CanBuy(TowerType towerType, TowerLevel towerLevel = TowerLe- vel.Level1) vrátí true, pokud má hráč dostatek peněz, jinak false void PlaceTower(TowerType towerType, Tile tile) pokud jsou splněny všechny podmínky pro postavení věže, pak postaví věž na určené políčko void UpgradeTower(Tile tile, UpgradeType upgradeType, ElementType elementType = ElementType.Neutral) pokud má hráč dostatek pe- něz, pak vylepší věž na daném políčku

List GetNextWave() vrátí kolekci typů entit, které jsou v ná- sledující vlně. Pokud další vlna není, vrátí prázdnou kolekci.

List GetNextNextWave() vrátí kolekci typů entit, které jsou ve vlně po následující vlně. Pokud taková vlna není, vrátí prázdnou kolekci.

Map Tato třída reprezentuje herní mapu. Nabízí tyto proměnné a metody: Tile[,] Tiles dvourozměrné pole políček herní mapy Point Start souřadnice začátku cesty Point End souřadnice konce cesty List GetNeighboursForTile(Tile tile) vrátí kolekci sousedních po- líček (ve 4 směrech – nahoře, dole, vlevo, vpravo) políčka v parametru

List GetAllNeighboursForTile(Tile tile) vrátí kolekci všech sou- sedních políček (v 8 směrech) políčka v parametru

Tile GetLeftNeighbourForTile(Tile tile) vrátí levé sousední políčko po- líčka v parametru, pokud políčko nemá levého souseda, tak vrátí null Tile GetRightNeighbourForTile(Tile tile) vrátí pravé sousední políčko políčka v parametru, pokud políčko nemá pravého souseda, tak vrátí null Tile GetUpperNeighbourForTile(Tile tile) vrátí horní sousední políčko políčka v parametru, pokud políčko nemá horního souseda, tak vrátí null

68 Tile GetBottomNeighbourForTile(Tile tile) vrátí spodní sousední po- líčko políčka v parametru, pokud políčko nemá spodního souseda, tak vrátí null

Tile Tato třída reprezentuje políčko herní mapy. Nabízí tyto proměnné:

Tower Tower věž umístěná na políčku, pokud políčko neobsahuje žádnou věž, pak je proměnná null

Point Position souřadnice políčka v mapě

TileType TileType typ políčka int NeighbouringPathCount počet všech sousedních políček, které jsou ces- tou

Tower Tato třída reprezentuje věž. Nabízí tyto proměnné:

TowerType TowerType typ věže

TowerLevel Level úroveň věže

ElementType Element typ elementu int Range dosah věže float FireRate frekvence střelby int Damage poškození udílené věží

Entity Tato třída reprezentuje nepřítele. Nabízí tyto proměnné: float Health počet životů float MaxHealth maximální počet životů float Speed rychlost

ElementType Element typ elementu

UnitType UnitType typ jednotky (pozemní, letecká)

EntityType EntityType typ nepřítele

Point Position souřadnice políčka, na kterém se nepřítel nachází

69 B. Dokumentace skriptovacího API

DifficultyType Jedná se o výčtový datový typ, který reprezentuje obtížnost hry. Nabývá těchto hodnot: Easy, Normal, Hard

TileType Jedná se o výčtový datový typ, který reprezentuje typ políčka. Nabývá těchto hodnot: Path, Environment, Obstacle

ElementType Jedná se o výčtový datový typ, který reprezentuje typ elementu. Nabývá těchto hodnot: Neutral, Fire, Earth, Water, Wind K dispozici jsou dvě extension metody:

ElementType GetVulnerableElement(this ElementType value) vrátí ele- ment, který je proti zvolenému elementu nejslabší.

ElementType GetStrongAttackingElement(this ElementType value) vrátí element, který je proti zvolenému elementu nejsilnější.

EntityType Jedná se o výčtový datový typ, který reprezentuje typ nepřítele. Nabývá těchto hodnot: Fly, Bee, Stinkbug, Ladybug, BlueBeetle, LeafBeetle, StarBeetle

TowerLevel Jedná se o výčtový datový typ, který reprezentuje úroveň věže. Nabývá těchto hodnot: Level1, Level2, Level3, Level4, Level5

TowerType Jedná se o výčtový datový typ, který reprezentuje typ věže. Nabývá těchto hodnot: Tower1, Tower2, Tower3

UnitType Jedná se o výčtový datový typ, který reprezentuje typ jednotky. Nabývá těchto hodnot: Ground, Flying

UpgradeType Jedná se o výčtový datový typ, který reprezentuje typ vylepšení. Nabývá těchto hodnot: Damage, FireRate, Range, Element, Ability1, Ability2

70 Timer Tato třída představuje časovač a umožňuje opakované volání metody dle na- stavené frekvence. Nabízí tyto proměnné a metody:

Action Callback metoda určená k volání float Frequency frekvence v milisekundách bool Enabled příznak zda je časovač zapnutý nebo vypnutý public Timer(Action callback, float frequency) konstruktor

Update(GameTime gameTime) tato metoda zajišťuje běh časovače, je nutné ji zavolat v každé obrazovce (frame), jinak časovač nebude fungovat

Ve skriptech jsou předem přídány tyto namespace:

• System;

• System.IO;

• System.Collections.Generic;

• System.Diagnostics;

• System.Dynamic;

• System.Linq;

• System.Linq.Expressions;

• System.Text;

• Microsoft.Xna.Framework.

71

Příloha C

Obsah přiloženého média

readme.txt...... stručný popis obsahu média exe...... adresář se spustitelnou formou implementace src impl...... zdrojové kódy implementace thesis...... zdrojová forma práce ve formátu LATEX TowerDefense.zip...projekt kompatibilní s aplikací Microsoft Visual Studio 2017 text...... text práce BP_Sedlacek_Martin_2019.pdf ...... text práce ve formátu PDF

73