{"id":52118,"date":"2019-11-01T00:00:00","date_gmt":"2019-10-31T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih"},"modified":"2020-02-18T13:59:47","modified_gmt":"2020-02-18T10:59:47","slug":"kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","title":{"rendered":"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/9e57175b233a104e0df98383b374eded.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNarazil jsem na zaj\u00edmav\u00fd materi\u00e1l o um\u011bl\u00e9 inteligenci ve hr\u00e1ch. Obsahuje vysv\u011btlen\u00ed z\u00e1kladn\u00edch pojm\u016f o AI na jednoduch\u00fdch p\u0159\u00edkladech a tak\u00e9 mnoho u\u017eite\u010dn\u00fdch n\u00e1stroj\u016f a metod pro pohodln\u00fd v\u00fdvoj a n\u00e1vrh. Jak, kde a kdy je pou\u017e\u00edvat \u2014 to tak\u00e9 najdete.<\/p>\n<p>V\u011bt\u0161ina p\u0159\u00edklad\u016f je naps\u00e1na v pseudok\u00f3du, tak\u017ee hlubok\u00e9 znalosti programov\u00e1n\u00ed nejsou nutn\u00e9. Pod perexem je 35 str\u00e1nek textu s obr\u00e1zky a gifkami, tak se p\u0159ipravte.<\/p>\n<p>UPD. Omlouv\u00e1m se, ale sv\u016fj vlastn\u00ed p\u0159eklad tohoto \u010dl\u00e1nku jsem u\u017e d\u011blal na Habru <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/PatientZero\/\">PatientZero<\/a><\/noindex>. Jeho verzi si m\u016f\u017eete p\u0159e\u010d\u00edst <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/420219\/\">zde<\/a><\/noindex>, ale z n\u011bjak\u00e9ho d\u016fvodu mi \u010dl\u00e1nek unikl (pou\u017e\u00edval jsem vyhled\u00e1v\u00e1n\u00ed, ale n\u011bco nevy\u0161lo). A jeliko\u017e p\u00ed\u0161u blog v\u011bnovan\u00fd hern\u00edmu v\u00fdvoji, rozhodl jsem se ponechat sv\u016fj p\u0159eklad pro sv\u00e9 \u010dten\u00e1\u0159e (n\u011bkter\u00e9 body m\u00e1m zpracov\u00e1ny jinak, n\u011bkter\u00e9 \u2014 \u00famysln\u011b vynech\u00e1ny na doporu\u010den\u00ed v\u00fdvoj\u00e1\u0159\u016f).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Co je AI?<\/h2>\n<p>\nHern\u00ed AI se soust\u0159ed\u00ed na to, jak\u00e9 akce by m\u011bl objekt vykon\u00e1vat na z\u00e1klad\u011b podm\u00ednek, ve kter\u00fdch se nach\u00e1z\u00ed. Obvykle se tomu \u0159\u00edk\u00e1 \u0159\u00edzen\u00ed \u201einteligentn\u00edch agent\u016f\u201c, kde agentem je hern\u00ed postava, vozidlo, bot, a n\u011bkdy i n\u011bco abstraktn\u011bj\u0161\u00edho: cel\u00e1 skupina entit nebo dokonce civilizace. V ka\u017ed\u00e9m p\u0159\u00edpad\u011b je to n\u011bco, co mus\u00ed vid\u011bt sv\u00e9 okol\u00ed, vyhodnocovat na jeho z\u00e1klad\u011b rozhodnut\u00ed a jednat v souladu s nimi. To se naz\u00fdv\u00e1 cyklus Sense\/Think\/Act (Vn\u00edmat\/P\u0159em\u00fd\u0161let\/Jednat):<\/p>\n<ul>\n<li>Sense: agent nalezne nebo obdr\u017e\u00ed informace o v\u011bcech ve sv\u00e9m prost\u0159ed\u00ed, kter\u00e9 mohou ovlivnit jeho chov\u00e1n\u00ed (bl\u00edzk\u00e9 hrozby, p\u0159edm\u011bty k sebr\u00e1n\u00ed, zaj\u00edmav\u00e1 m\u00edsta k prozkoum\u00e1n\u00ed).<\/li>\n<li>Think: agent se rozhoduje, jak reagovat (zva\u017euje, zda je dostate\u010dn\u011b bezpe\u010dn\u00e9 sb\u00edrat p\u0159edm\u011bty, nebo zda se nejprve mus\u00ed br\u00e1nit\/schov\u00e1vat).<\/li>\n<li>Act: agent vykon\u00e1v\u00e1 akce produktem p\u0159edchoz\u00edho rozhodnut\u00ed (za\u010dne se pohybovat k protivn\u00edkovi nebo p\u0159edm\u011btu).<\/li>\n<li>\u2026nyn\u00ed se situace zm\u011bnila v d\u016fsledku akc\u00ed postav, tak\u017ee se cyklus opakuje s nov\u00fdmi \u00fadaji.<\/li>\n<\/ul>\n<p>\nAI se obvykle zam\u011b\u0159uje na \u010d\u00e1st cyklu Sense. Nap\u0159\u00edklad autonomn\u00ed automobily po\u0159izuj\u00ed sn\u00edmky silnice, kombinuj\u00ed je s radarov\u00fdmi a lidarov\u00fdmi daty a interpretuj\u00ed je. Obvykle to d\u011bl\u00e1 strojov\u00e9 u\u010den\u00ed, kter\u00e9 zpracov\u00e1v\u00e1 p\u0159ich\u00e1zej\u00edc\u00ed data a d\u00e1v\u00e1 jim smysl t\u00edm, \u017ee extrahuje s\u00e9mantick\u00e9 informace, jako nap\u0159\u00edklad: \u201ep\u0159ed v\u00e1mi je je\u0161t\u011b jedno auto ve vzd\u00e1lenosti 20 yard\u016f\u201c. To jsou tzv. classification problems.<\/p>\n<p>Hry nepot\u0159ebuj\u00ed slo\u017eit\u00fd syst\u00e9m pro extrakci informac\u00ed, proto\u017ee v\u011bt\u0161ina dat je ji\u017e ned\u00edlnou sou\u010d\u00e1st\u00ed. Nen\u00ed pot\u0159eba spou\u0161t\u011bt algoritmy pro rozpozn\u00e1v\u00e1n\u00ed obraz\u016f, aby se zjistilo, zda je p\u0159ed hr\u00e1\u010dem nep\u0159\u00edtel \u2014 hra to ji\u017e v\u00ed a poskytuje informace p\u0159\u00edmo b\u011bhem rozhodovac\u00edho procesu. Proto je \u010d\u00e1st cyklu Sense \u010dasto mnohem jednodu\u0161\u0161\u00ed ne\u017e Think a Act.<\/p>\n<h2>Omezen\u00ed hern\u00edho AI<\/h2>\n<p>\nAI m\u00e1 \u0159adu omezen\u00ed, kter\u00e1 je t\u0159eba dodr\u017eovat:<\/p>\n<ul>\n<li>AI nen\u00ed pot\u0159eba p\u0159edem tr\u00e9novat, jako by to byl algoritmus strojov\u00e9ho u\u010den\u00ed. Je bezp\u0159edm\u011btn\u00e9 ps\u00e1t neuronovou s\u00ed\u0165 b\u011bhem v\u00fdvoje, aby bylo mo\u017en\u00e9 sledovat des\u00edtky tis\u00edc hr\u00e1\u010d\u016f a studovat, jak nejl\u00e9pe hr\u00e1t proti nim. Pro\u010d? Proto\u017ee hra nebyla vyd\u00e1na a hr\u00e1\u010di neexistuj\u00ed.<\/li>\n<li>Hra mus\u00ed bavit a kl\u00e1st v\u00fdzvy, tak\u017ee agenti by nem\u011bli nach\u00e1zet nejlep\u0161\u00ed p\u0159\u00edstup proti lidem.<\/li>\n<li>Agenti mus\u00ed vypadat realisticky, aby hr\u00e1\u010di c\u00edtili, \u017ee hraj\u00ed proti skute\u010dn\u00fdm lidem. Program AlphaGo p\u0159ekonal \u010dlov\u011bka, ale zvolen\u00e9 tahy byly v\u00fdrazn\u011b daleko od tradi\u010dn\u00edho ch\u00e1p\u00e1n\u00ed hry. Pokud hra imituje lidsk\u00e9ho protivn\u00edka, tento pocit by nem\u011bl existovat. Algoritmus mus\u00ed b\u00fdt upraven tak, aby p\u0159ijal v\u011brohodn\u00e1 rozhodnut\u00ed, a ne dokonal\u00e1.<\/li>\n<li>AI mus\u00ed fungovat v re\u00e1ln\u00e9m \u010dase. To znamen\u00e1, \u017ee algoritmus nem\u016f\u017ee monopolizovat vyu\u017eit\u00ed procesoru po dlouhou dobu pro rozhodov\u00e1n\u00ed. I 10 milisekund je p\u0159\u00edli\u0161 dlouho, proto\u017ee v\u011bt\u0161in\u011b her sta\u010d\u00ed mezi 16 a 33 milisekund, aby provedly ve\u0161ker\u00e9 zpracov\u00e1n\u00ed a p\u0159e\u0161ly na dal\u0161\u00ed sn\u00edmek grafiky.<\/li>\n<li>Ide\u00e1ln\u00ed je, pokud alespo\u0148 \u010d\u00e1st syst\u00e9mu je \u0159\u00edzena daty, aby \u201anekod\u00e9\u0159i\u2018 mohli prov\u00e1d\u011bt zm\u011bny, a aby \u00fapravy prob\u00edhaly rychleji.<\/li>\n<\/ul>\n<p>\nPod\u00edvejme se na p\u0159\u00edstupy AI, kter\u00e9 pokr\u00fdvaj\u00ed cel\u00fd cyklus Sense\/Think\/Act.<\/p>\n<h3>P\u0159ijet\u00ed z\u00e1kladn\u00edch rozhodnut\u00ed<\/h3>\n<p>\nZa\u010dn\u011bme s nejjednodu\u0161\u0161\u00ed hrou \u2014 Pong. C\u00edl: posunout platformu (paddle) tak, aby se m\u00ed\u010d odr\u00e1\u017eel od n\u00ed, a neprolet\u011bl kolem. Je to jako tenis, kde prohr\u00e1v\u00e1te, pokud m\u00ed\u010d neodraz\u00edte. Pro AI je zde relativn\u011b snadn\u00fd \u00fakol \u2014 rozhodnout, kter\u00fdm sm\u011brem posunout platformu.<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/e1935d657b9f090bf60c365c21e8f92b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Podm\u00ednkov\u00e9 oper\u00e1tory<\/h3>\n<p>\nPro AI v Pongu existuje nejviditeln\u011bj\u0161\u00ed \u0159e\u0161en\u00ed \u2014 v\u017edy se sna\u017eit um\u00edstit platformu pod m\u00ed\u010dem.<\/p>\n<p>Jednoduch\u00fd algoritmus pro to, napsan\u00fd v pseudok\u00f3du:<\/p>\n<p><i>ka\u017ed\u00fd sn\u00edmek\/aktualizace, zat\u00edmco hra b\u011b\u017e\u00ed:<br \/>\npokud je m\u00ed\u010d vlevo od platformy:<br \/>\n posunout platformu vlevo<br \/>\njinak pokud je m\u00ed\u010d vpravo od platformy:<br \/>\n posunout platformu vpravo<\/i><\/p>\n<p>Pokud se platforma pohybuje rychlost\u00ed m\u00ed\u010de, je to ide\u00e1ln\u00ed algoritmus pro AI v Pongu. Nen\u00ed t\u0159eba nic komplikovat, pokud nen\u00ed tolik dat a mo\u017en\u00fdch akc\u00ed pro agenta.<\/p>\n<p>Tento p\u0159\u00edstup je natolik jednoduch\u00fd, \u017ee cel\u00fd cyklus Sense\/Think\/Act je t\u00e9m\u011b\u0159 neviditeln\u00fd. Ale existuje:<\/p>\n<ul>\n<li>\u010c\u00e1st Sense je ve dvou podm\u00ednkov\u00fdch oper\u00e1torech if. Hra v\u00ed, kde je m\u00ed\u010d a kde je platforma, tak\u017ee AI se na ni obrac\u00ed pro tuto informaci. <\/li>\n<li>\u010c\u00e1st Think tak\u00e9 zahrnuje dva podm\u00ednkov\u00e9 oper\u00e1tory if. Ty p\u0159edstavuj\u00ed dv\u011b rozhodnut\u00ed, kter\u00e1 jsou v tomto p\u0159\u00edpad\u011b vz\u00e1jemn\u011b se vylu\u010duj\u00edc\u00ed. V d\u016fsledku toho se vybere jedna ze t\u0159\u00ed akc\u00ed \u2014 posunout platformu vlevo, posunout ji vpravo, nebo nic neud\u011blat, pokud je u\u017e spr\u00e1vn\u011b um\u00edst\u011bna.<\/li>\n<li>\u010c\u00e1st Act se nach\u00e1z\u00ed v oper\u00e1torech Move Paddle Left a Move Paddle Right. V z\u00e1vislosti na designu hry mohou tyto oper\u00e1tory posunout platformu okam\u017eit\u011b nebo s ur\u010ditou rychlost\u00ed. <\/li>\n<\/ul>\n<p>\nTakov\u00e9 p\u0159\u00edstupy se naz\u00fdvaj\u00ed reaktivn\u00ed \u2014 existuje jednoduch\u00e1 sada pravidel (v tomto p\u0159\u00edpad\u011b podm\u00ednkov\u00e9 oper\u00e1tory if v k\u00f3du), kter\u00e9 reaguj\u00ed na aktu\u00e1ln\u00ed stav sv\u011bta a jednaj\u00ed.<\/p>\n<h3>Rozhodovac\u00ed strom<\/h3>\n<p>\nP\u0159\u00edklad se hrou Pong vlastn\u011b odpov\u00edd\u00e1 form\u00e1ln\u00ed konceptu AI, zvan\u00e9mu rozhodovac\u00ed strom. Algoritmus j\u00edm proch\u00e1z\u00ed, aby dos\u00e1hl 'listu' \u2014 rozhodnut\u00ed, jakou akci podniknout.<\/p>\n<p>Vytvo\u0159\u00edme blokov\u00e9 sch\u00e9ma rozhodovac\u00edho stromu pro algoritmus na\u0161\u00ed platformy:<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/d3b7290ba93144967cd849416cd5eef3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKa\u017ed\u00e1 \u010d\u00e1st stromu se naz\u00fdv\u00e1 uzel (node) \u2014 AI pou\u017e\u00edv\u00e1 teorii graf\u016f k popisu takov\u00fdch struktur. Existuj\u00ed dva typy uzl\u016f:<\/p>\n<ul>\n<li>Uzly rozhodov\u00e1n\u00ed: v\u00fdb\u011br mezi dv\u011bma alternativami na z\u00e1klad\u011b kontroly ur\u010dit\u00e9 podm\u00ednky, kde ka\u017ed\u00e1 alternativa je p\u0159edstavena jako samostatn\u00fd uzel.<\/li>\n<li>Koncov\u00e9 uzly: akce k proveden\u00ed, p\u0159edstavuj\u00ed kone\u010dn\u00e9 rozhodnut\u00ed.<\/li>\n<\/ul>\n<p>\nAlgoritmus za\u010d\u00edn\u00e1 u prvn\u00edho uzlu (\u201eko\u0159ene\u201c stromu). Bu\u010f se rozhodne, do kter\u00e9ho poduzlu p\u0159ej\u00edt, nebo provede akci ulo\u017eenou v uzlu a kon\u010d\u00ed.<\/p>\n<p>Jak\u00fd je tedy p\u0159\u00ednos, kdy\u017e strom rozhodnut\u00ed vykon\u00e1v\u00e1 stejnou pr\u00e1ci jako if-ces na p\u0159edchoz\u00ed str\u00e1nce? Existuje zde obecn\u00fd syst\u00e9m, kde ka\u017ed\u00e9 rozhodnut\u00ed m\u00e1 pouze jednu podm\u00ednku a dva mo\u017en\u00e9 v\u00fdsledky. To umo\u017e\u0148uje v\u00fdvoj\u00e1\u0159i vytv\u00e1\u0159et AI z \u00fadaj\u016f p\u0159edstavuj\u00edc\u00edch rozhodnut\u00ed ve stromu, a t\u00edm se vyhnout jeho hardcodov\u00e1n\u00ed. P\u0159edstavme si to formou tabulky:<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/6875293a60ff9d0efa26fb5e1aa4b21c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa stran\u011b k\u00f3du dostanete syst\u00e9m pro \u010dten\u00ed \u0159et\u011bzc\u016f. Vytvo\u0159te uzel pro ka\u017ed\u00fd z nich, p\u0159ipojte rozhodovac\u00ed logiku na z\u00e1klad\u011b druh\u00e9ho sloupce a poduzly na z\u00e1klad\u011b t\u0159et\u00edho a \u010dtvrt\u00e9ho sloupce. St\u00e1le budete muset naprogramovat podm\u00ednky a akce, ale nyn\u00ed bude struktura hry slo\u017eit\u011bj\u0161\u00ed. P\u0159id\u00e1v\u00e1te dodate\u010dn\u00e1 rozhodnut\u00ed a akce, a pot\u00e9 m\u016f\u017eete nastavit cel\u00e9 AI jednodu\u0161e zm\u011bnou textov\u00e9ho souboru s definic\u00ed stromu. Pot\u00e9 p\u0159ed\u00e1te soubor hern\u00edmu design\u00e9rovi, kter\u00fd bude m\u00edt mo\u017enost m\u011bnit chov\u00e1n\u00ed bez p\u0159eprogramov\u00e1n\u00ed hry a zm\u011bny k\u00f3du.<\/p>\n<p>Stromy rozhodnut\u00ed jsou velmi u\u017eite\u010dn\u00e9, kdy\u017e jsou automaticky vytv\u00e1\u0159eny na z\u00e1klad\u011b velk\u00e9ho mno\u017estv\u00ed p\u0159\u00edklad\u016f (nap\u0159. pomoc\u00ed algoritmu ID3). To je \u010din\u00ed efektivn\u00edm a vysoce v\u00fdkonn\u00fdm n\u00e1strojem pro klasifikaci situac\u00ed na z\u00e1klad\u011b z\u00edskan\u00fdch dat. Nicm\u00e9n\u011b p\u0159ekra\u010dujeme r\u00e1mec jednoduch\u00e9ho syst\u00e9mu pro vyb\u00edr\u00e1n\u00ed akc\u00ed agenty.<\/p>\n<h3>Sc\u00e9n\u00e1\u0159e<\/h3>\n<p>\nProbrali jsme syst\u00e9m stromu rozhodnut\u00ed, kter\u00fd vyu\u017e\u00edval p\u0159edem vytvo\u0159en\u00e9 podm\u00ednky a akce. \u010clov\u011bk, kter\u00fd navrhuje AI, m\u016f\u017ee uspo\u0159\u00e1dat strom podle sv\u00e9ho uv\u00e1\u017een\u00ed, ale st\u00e1le se mus\u00ed spol\u00e9hat na program\u00e1tora, kter\u00fd to cel\u00e9 naprogramoval. Co kdybychom mohli poskytnout design\u00e9rovi n\u00e1stroje pro vytv\u00e1\u0159en\u00ed vlastn\u00edch podm\u00ednek nebo akc\u00ed?<\/p>\n<p>Aby program\u00e1tor nemusel ps\u00e1t k\u00f3d pro podm\u00ednky Is Ball Left Of Paddle a Is Ball Right Of Paddle, m\u016f\u017ee vytvo\u0159it syst\u00e9m, ve kter\u00e9m design\u00e9r zap\u00ed\u0161e podm\u00ednky pro kontrolu t\u011bchto hodnot. Pak budou data stromu rozhodnut\u00ed vypadat takto:<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/8e77f7c3410d097e8b7d8e1209355cc6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV podstat\u011b se jedn\u00e1 o to sam\u00e9, co v prvn\u00ed tabulce, ale \u0159e\u0161en\u00ed uvnit\u0159 maj\u00ed sv\u016fj vlastn\u00ed k\u00f3d, kter\u00fd je pon\u011bkud podobn\u00fd podm\u00ednkov\u00e9 \u010d\u00e1sti p\u0159\u00edkazu if. Na stran\u011b k\u00f3du by to bylo p\u0159e\u010dteno ve druh\u00e9m sloupci pro uzly rozhodovac\u00edho procesu, ale m\u00edsto hled\u00e1n\u00ed konkr\u00e9tn\u00ed podm\u00ednky k vykon\u00e1n\u00ed (Je m\u00ed\u010d vlevo od p\u00e1lky) vyhodnocuje podm\u00ednkov\u00fd v\u00fdraz a vrac\u00ed true nebo false podle pot\u0159eby. To se prov\u00e1d\u00ed pomoc\u00ed skriptovac\u00edho jazyka Lua nebo Angelscript. S jejich pomoc\u00ed m\u016f\u017ee v\u00fdvoj\u00e1\u0159 p\u0159ij\u00edmat objekty ve sv\u00e9 h\u0159e (m\u00ed\u010d a p\u00e1lku) a vytv\u00e1\u0159et prom\u011bnn\u00e9, kter\u00e9 budou dostupn\u00e9 ve skriptu (ball.position). Nav\u00edc je skriptovac\u00ed jazyk jednodu\u0161\u0161\u00ed ne\u017e C++. Nevy\u017eaduje plnou kompilaci, tak\u017ee je ide\u00e1ln\u00ed pro rychl\u00e9 \u00fapravy hern\u00ed logiky a umo\u017e\u0148uje \u201enekod\u00e9r\u016fm\u201c vytv\u00e1\u0159et pot\u0159ebn\u00e9 funkce samostatn\u011b.<\/p>\n<p>Ve zm\u00edn\u011bn\u00e9m p\u0159\u00edkladu se skriptovac\u00ed jazyk pou\u017e\u00edv\u00e1 pouze k vyhodnocen\u00ed podm\u00ednkov\u00e9ho v\u00fdrazu, ale m\u016f\u017ee se tak\u00e9 pou\u017e\u00edt k akc\u00edm. Nap\u0159\u00edklad p\u0159\u00edkaz Move Paddle Right m\u016f\u017ee b\u00fdt skriptovac\u00ed p\u0159\u00edkaz (ball.position.x += 10). Tak\u017ee akce m\u016f\u017ee b\u00fdt tak\u00e9 definov\u00e1na ve skriptu, ani\u017e by bylo nutn\u00e9 programovat Move Paddle Right.<\/p>\n<p>Je mo\u017en\u00e9 zaj\u00edt je\u0161t\u011b d\u00e1l a napsat cel\u00e9 rozhodovac\u00ed strom na skriptovac\u00edm jazyce. Bude to k\u00f3d ve form\u011b pevn\u011b naprogramovan\u00fdch (hardcoded) podm\u00ednkov\u00fdch p\u0159\u00edkaz\u016f, ale ty budou um\u00edst\u011bny v extern\u00edch skriptovac\u00edch souborech, co\u017e znamen\u00e1, \u017ee mohou b\u00fdt m\u011bn\u011bny bez nutnosti kompilace cel\u00e9 aplikace. \u010casto je mo\u017en\u00e9 zm\u011bnit skriptovac\u00ed soubor p\u0159\u00edmo b\u011bhem hry, abyste rychle testovali r\u016fzn\u00e9 reakce AI.<\/p>\n<h3>Reagov\u00e1n\u00ed na ud\u00e1losti<\/h3>\n<p>\nP\u0159\u00edklady v\u00fd\u0161e se skv\u011ble hod\u00ed pro Pong. Nep\u0159etr\u017eit\u011b spou\u0161t\u011bj\u00ed cyklus Sense\/Think\/Act a jednaj\u00ed na z\u00e1klad\u011b posledn\u00edho stavu sv\u011bta. Ale ve slo\u017eit\u011bj\u0161\u00edch hr\u00e1ch je t\u0159eba reagovat na jednotliv\u00e9 ud\u00e1losti, nikoli vyhodnocovat v\u0161e najednou. Pong u\u017e v tomhle p\u0159\u00edpad\u011b nen\u00ed nejlep\u0161\u00ed p\u0159\u00edklad. Zvolme jin\u00fd. <\/p>\n<p>P\u0159edstavte si st\u0159\u00edle\u010dku, kde jsou nep\u0159\u00e1tel\u00e9 nehybn\u00ed, dokud neodhal\u00ed hr\u00e1\u010de, pot\u00e9 jednaj\u00ed v z\u00e1vislosti na sv\u00e9 \u201especializaci\u201c: n\u011bkte\u0159\u00ed budou \u201erushovat\u201c, jin\u00ed budou \u00fato\u010dit z d\u00e1lky. To je st\u00e1le z\u00e1kladn\u00ed reaguj\u00edc\u00ed syst\u00e9m \u2014 \u201epokud je hr\u00e1\u010d spat\u0159en, ud\u011blejte n\u011bco\u201c \u2014 ale lze jej logicky rozd\u011blit na ud\u00e1lost Player Seen (hr\u00e1\u010d spat\u0159en) a reakci (vyberte odpov\u011b\u010f a vykonejte ji).<\/p>\n<p>Tohle n\u00e1s vrac\u00ed k cyklu Sense\/Think\/Act. M\u016f\u017eeme naprogramovat \u010d\u00e1st Sense, kter\u00e1 v ka\u017ed\u00e9m sn\u00edmku zkontroluje, zda AI vid\u00ed hr\u00e1\u010de. Pokud ne, ned\u011bje se nic, ale pokud ano, vytvo\u0159\u00ed se ud\u00e1lost Player Seen. K\u00f3d bude m\u00edt samostatnou sekci, kter\u00e1 \u0159\u00edk\u00e1: \u201ekdy\u017e dojde k ud\u00e1losti Player Seen, ud\u011blej\u201c, kde  je reakce, kterou pot\u0159ebujete pro vol\u00e1n\u00ed \u010d\u00e1st\u00ed Think a Act. T\u00edmto zp\u016fsobem nakonfigurujete reakce na ud\u00e1lost Player Seen: na \u201erushuj\u00edc\u00ed\u201c postavu \u2013 ChargeAndAttack, a na snipera \u2013 HideAndSnipe. Tyto vazby lze vytvo\u0159it v datov\u00e9m souboru pro rychl\u00e9 \u00fapravy bez nutnosti op\u011btovn\u011b kompilovat. A zde lze tak\u00e9 pou\u017e\u00edt skriptovac\u00ed jazyk.<\/p>\n<h2>P\u0159ij\u00edm\u00e1n\u00ed slo\u017eit\u00fdch rozhodnut\u00ed<\/h2>\n<p>\nI kdy\u017e jednoduch\u00e9 reak\u010dn\u00ed syst\u00e9my jsou velmi \u00fa\u010dinn\u00e9, existuje mnoho situac\u00ed, kdy nesta\u010d\u00ed. N\u011bkdy je t\u0159eba p\u0159ij\u00edmat r\u016fzn\u00e1 rozhodnut\u00ed zalo\u017een\u00e1 na tom, co agent d\u011bl\u00e1 v dan\u00e9m okam\u017eiku, ale p\u0159edstavit to jako podm\u00ednku je obt\u00ed\u017en\u00e9. N\u011bkdy existuje p\u0159\u00edli\u0161 mnoho podm\u00ednek na efektivn\u00ed vyj\u00e1d\u0159en\u00ed v rozhodovac\u00edm stromu nebo skriptu. N\u011bkdy je t\u0159eba dop\u0159edu posoudit, jak se situace zm\u011bn\u00ed, ne\u017e u\u010din\u00edte rozhodnut\u00ed o dal\u0161\u00edm kroku. K vy\u0159e\u0161en\u00ed t\u011bchto probl\u00e9m\u016f jsou pot\u0159eba slo\u017eit\u011bj\u0161\u00ed p\u0159\u00edstupy.<\/p>\n<h3>Kone\u010dn\u00fd automat (Finite State Machine)<\/h3>\n<p>\nKone\u010dn\u00fd automat neboli FSM (Finite State Machine) je zp\u016fsob, jak \u0159\u00edci, \u017ee n\u00e1\u0161 agent se v sou\u010dasnosti nach\u00e1z\u00ed v jednom z n\u011bkolika mo\u017en\u00fdch stav\u016f, a \u017ee se m\u016f\u017ee p\u0159ep\u00ednat z jednoho stavu do druh\u00e9ho. Takov\u00fdch stav\u016f je ur\u010dit\u00e9 mno\u017estv\u00ed \u2013 odtud n\u00e1zev. Nejlep\u0161\u00ed p\u0159\u00edklad z reality je semafor. Na r\u016fzn\u00fdch m\u00edstech jsou r\u016fzn\u00e9 sekvence sv\u011btel, ale princip je stejn\u00fd \u2013 ka\u017ed\u00fd stav p\u0159edstavuje n\u011bco (st\u016fj, jdi, atd.). Semafor se nach\u00e1z\u00ed pouze v jednom stavu v ka\u017ed\u00e9m okam\u017eiku a p\u0159ech\u00e1z\u00ed z jednoho stavu do druh\u00e9ho na z\u00e1klad\u011b jednoduch\u00fdch pravidel.<\/p>\n<p>S NPC ve hr\u00e1ch je to podobn\u00fd p\u0159\u00edb\u011bh. Pro p\u0159\u00edklad vezm\u011bme str\u00e1\u017en\u00e9ho s n\u00e1sleduj\u00edc\u00edmi stavy:<\/p>\n<ul>\n<li>Patrolling (Pohybuj\u00edc\u00ed se).<\/li>\n<li>Attacking (\u00dato\u010d\u00edc\u00ed).<\/li>\n<li>Fleeing (Ut\u00edkaj\u00edc\u00ed).<\/li>\n<\/ul>\n<p>\nA s t\u011bmito podm\u00ednkami pro zm\u011bnu jeho stavu:<\/p>\n<ul>\n<li>Pokud str\u00e1\u017en\u00fd vid\u00ed protivn\u00edka, za\u00fato\u010d\u00ed.<\/li>\n<li>Pokud str\u00e1\u017en\u00fd \u00fato\u010d\u00ed, ale u\u017e nevid\u00ed protivn\u00edka, vr\u00e1t\u00ed se k patrolov\u00e1n\u00ed.<\/li>\n<li>Pokud str\u00e1\u017en\u00fd \u00fato\u010d\u00ed, ale je v\u00e1\u017en\u011b zran\u011bn, ut\u00edk\u00e1.<\/li>\n<\/ul>\n<p>\nLze tak\u00e9 ps\u00e1t if-odes\u00edlac\u00ed bloky se stavovou prom\u011bnnou str\u00e1\u017ece a r\u016fzn\u00e9 kontroly: je v bl\u00edzkosti nep\u0159\u00edtel, jak\u00e1 je \u00farove\u0148 zdrav\u00ed NPC atd. P\u0159id\u00e1me n\u011bkolik dal\u0161\u00edch stav\u016f:<\/p>\n<ul>\n<li>Ne\u010dinnost (Idling) \u2014 mezi hl\u00eddkami.<\/li>\n<li>Hled\u00e1n\u00ed (Searching) \u2014 kdy\u017e se zjist\u00ed nep\u0159\u00edtel, kter\u00fd se skryl.<\/li>\n<li>\u017d\u00e1dat o pomoc (Finding Help) \u2014 kdy\u017e je nep\u0159\u00edtel zaznamen\u00e1n, ale je p\u0159\u00edli\u0161 siln\u00fd na to, aby s n\u00edm bylo mo\u017en\u00e9 bojovat osamocen\u011b.<\/li>\n<\/ul>\n<p>\nMo\u017enost pro ka\u017ed\u00e9ho z nich je omezen\u00e1 \u2014 nap\u0159\u00edklad str\u00e1\u017ece se nevyd\u00e1 hledat skryt\u00e9ho nep\u0159\u00edtele, pokud m\u00e1 n\u00edzk\u00e9 zdrav\u00ed.<\/p>\n<p>Nakonec m\u016f\u017ee b&yacute;t obrovsk&yacute; seznam &#039;pokud&#039; &lt;x \u0438 y, \u043d\u043e \u043d\u0435 z&gt;, pak &lt;p&gt;, p\u0159&iacute;li&scaron; rozs&aacute;hl&yacute;, a proto by m\u011blo b&yacute;t zformulov&aacute;no \u0159e&scaron;en&iacute;, kter&eacute; n&aacute;m umo\u017en&iacute; m&iacute;t na pam\u011bti stavy a p\u0159echody mezi nimi. Abyste toho dos&aacute;hli, zv&aacute;\u017e&iacute;me v&scaron;echny stavy a pod ka\u017ed&yacute;m stavem zap&iacute;&scaron;eme do seznamu v&scaron;echny p\u0159echody do jin&yacute;ch stav\u016f spolu se pot\u0159ebn&yacute;mi podm&iacute;nkami.<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/ba4c401aa20de3d22d2478cba5a4b1ec.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nToto je tabulka p\u0159echod\u016f stav\u016f \u2014 komplexn\u00ed zp\u016fsob p\u0159edstavov\u00e1n\u00ed FSM. Nakresl\u00edme diagram a z\u00edsk\u00e1me \u00fapln\u00fd p\u0159ehled o tom, jak se m\u011bn\u00ed chov\u00e1n\u00ed NPC.<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/b4182359983cf573872dacc575af13dc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDiagram odr\u00e1\u017e\u00ed podstatu rozhodov\u00e1n\u00ed tohoto agenta na z\u00e1klad\u011b aktu\u00e1ln\u00ed situace. Ka\u017ed\u00e1 \u0161ipka ukazuje p\u0159echod mezi stavy, pokud je podm\u00ednka vedle n\u00ed pravdiv\u00e1.<\/p>\n<p>P\u0159i ka\u017ed\u00e9 aktualizaci kontrolujeme aktu\u00e1ln\u00ed stav agenta, proch\u00e1z\u00edme seznam p\u0159echod\u016f a pokud jsou spln\u011bny podm\u00ednky pro p\u0159echod, p\u0159ejme do nov\u00e9ho stavu. Nap\u0159\u00edklad, p\u0159i ka\u017ed\u00e9m sn\u00edmku se kontroluje, jestli vypr\u0161el 10 sekundov\u00fd \u010dasova\u010d, a pokud ano, str\u00e1\u017ece p\u0159ech\u00e1z\u00ed ze stavu Ne\u010dinnosti (Idling) do stavu Hl\u00edd\u00e1n\u00ed (Patrolling). Stejn\u00fdm zp\u016fsobem, stav \u00dato\u010den\u00ed (Attacking) kontroluje zdrav\u00ed agenta \u2014 pokud je n\u00edzk\u00e9, p\u0159ech\u00e1z\u00ed do stavu \u00dat\u011bku (Fleeing).<\/p>\n<p>Toto je zpracov\u00e1n\u00ed p\u0159echod\u016f mezi stavy, ale co chov\u00e1n\u00ed spojen\u00e9 s t\u011bmito stavy? Pokud jde o realizaci skute\u010dn\u00e9ho chov\u00e1n\u00ed pro konkr\u00e9tn\u00ed stav, obvykle existuj\u00ed dva typy \u201eh\u00e1\u010dku\u201c, kde p\u0159i\u0159azujeme akce k FSM:<\/p>\n<ul>\n<li>Akce, kter\u00e9 periodicky vykon\u00e1v\u00e1me pro aktu\u00e1ln\u00ed stav.<\/li>\n<li>Akce, kter\u00e9 podnik\u00e1me p\u0159i p\u0159echodu z jednoho stavu do druh\u00e9ho.<\/li>\n<\/ul>\n<p>\nP\u0159\u00edklady pro prvn\u00ed typ. Stav Hl\u00edd\u00e1n\u00ed (Patrolling) ka\u017ed\u00fdm sn\u00edmkem posune agenta po trase hl\u00edd\u00e1n\u00ed. Stav \u00dato\u010den\u00ed (Attacking) ka\u017ed\u00fdm sn\u00edmkem se pokus\u00ed zah\u00e1jit \u00fatok nebo p\u0159ej\u00edt do stavu, kdy\u017e je to mo\u017en\u00e9.<\/p>\n<p>Pro druh\u00fd typ zva\u017eujeme p\u0159echod \u201epokud je nep\u0159\u00edtel viditeln\u00fd a nep\u0159\u00edtel je p\u0159\u00edli\u0161 siln\u00fd, pak p\u0159ej\u00edt do stavu Hled\u00e1n\u00ed Pomoci. Agent mus\u00ed vybrat, kam j\u00edt pro pomoc, a uchovat tuto informaci, aby stav Hled\u00e1n\u00ed Pomoci v\u011bd\u011bl, kam se obr\u00e1tit. Jakmile je pomoc nalezena, agent se vr\u00e1t\u00ed zp\u011bt do stavu \u00datoku. V tomto okam\u017eiku chce informovat spojence o hrozb\u011b, a proto m\u016f\u017ee vzniknout akce InformovatSpojenceOHrozb\u011b.<\/p>\n<p>Op\u011bt m\u016f\u017eeme na tento syst\u00e9m nahl\u00ed\u017eet skrze cyklus Vn\u00edmat\/P\u0159em\u00fd\u0161let\/Jednat. Vn\u00edmat je materializov\u00e1no v datech pou\u017e\u00edvan\u00fdch logikou p\u0159echodu. P\u0159em\u00fd\u0161let \u2014 to jsou p\u0159echody dostupn\u00e9 v ka\u017ed\u00e9m stavu. A Jednat se prov\u00e1d\u00ed akcemi, kter\u00e9 se periodicky vykon\u00e1vaj\u00ed uvnit\u0159 stavu nebo na p\u0159echodech mezi stavy.<\/p>\n<p>N\u011bkdy m\u016f\u017ee b\u00fdt kontinu\u00e1ln\u00ed dotazov\u00e1n\u00ed podm\u00ednek p\u0159echodu n\u00e1kladn\u00e9. Nap\u0159\u00edklad, pokud ka\u017ed\u00fd agent prov\u00e1d\u00ed slo\u017eit\u00e9 v\u00fdpo\u010dty ka\u017ed\u00fd sn\u00edmek, aby ur\u010dil, zda vid\u00ed nep\u0159\u00e1tele a zda je mo\u017en\u00e9 p\u0159ej\u00edt ze stavu Hl\u00edd\u00e1n\u00ed do \u00datoku \u2014 to zabere spoustu procesorov\u00e9ho \u010dasu. <\/p>\n<p>D\u016fle\u017eit\u00e9 zm\u011bny ve stavu sv\u011bta lze pova\u017eovat za ud\u00e1losti, kter\u00e9 budou zpracov\u00e1ny, jakmile nastanou. M\u00edsto toho, aby FSM kontrolovala podm\u00ednku p\u0159echodu \u201em\u016f\u017ee m\u016fj agent vid\u011bt hr\u00e1\u010de?\u201c ka\u017ed\u00fd sn\u00edmek, lze nastavit samostatn\u00fd syst\u00e9m, kter\u00fd prov\u00e1d\u00ed kontroly m\u00e9n\u011b \u010dasto (nap\u0159\u00edklad 5kr\u00e1t za sekundu). A v\u00fdsledkem je vyhl\u00e1\u0161en\u00ed Hr\u00e1\u010d Vid\u011bn, kdy\u017e kontrola projde. <\/p>\n<p>To se p\u0159ed\u00e1v\u00e1 do FSM, kter\u00e1 nyn\u00ed mus\u00ed p\u0159ej\u00edt na podm\u00ednku P\u0159ijata ud\u00e1lost Hr\u00e1\u010d Vid\u011bn a odpov\u00eddaj\u00edc\u00edm zp\u016fsobem reagovat. Kone\u010dn\u00e9 chov\u00e1n\u00ed je stejn\u00e9 s v\u00fdjimkou t\u00e9m\u011b\u0159 nepost\u0159ehnuteln\u00e9ho zpo\u017ed\u011bn\u00ed p\u0159ed odpov\u011bd\u00ed. Na opl\u00e1tku se v\u00fdkon zlep\u0161il odd\u011blen\u00edm \u010d\u00e1sti Vn\u00edmat do samostatn\u00e9 \u010d\u00e1sti programu.<\/p>\n<h3>Hierarchick\u00e1 kone\u010dn\u00e1 stavov\u00e1 automat<\/h3>\n<p>\nPr\u00e1ce s velk\u00fdmi FSM v\u0161ak nen\u00ed v\u017edy pohodln\u00e1. Pokud bychom cht\u011bli roz\u0161\u00ed\u0159it stav \u00fatoku, nahrazen\u00edm jej samostatn\u00fdmi Bl\u00edzk\u00fd\u00datok (melee) a D\u00e1lkov\u00fd\u00datok (ranged), budeme muset zm\u011bnit p\u0159echody ze v\u0161ech ostatn\u00edch stav\u016f, kter\u00e9 vedou do stavu \u00datoku (sou\u010dasn\u00e9 i budouc\u00ed).<\/p>\n<p>Ur\u010dit\u011b jste si v\u0161imli, \u017ee v na\u0161em p\u0159\u00edkladu je mnoho duplicitn\u00edch p\u0159echod\u016f. V\u011bt\u0161ina p\u0159echod\u016f ve stavu Idling je identick\u00e1 s p\u0159echody ve stavu Patrolling. Bylo by dobr\u00e9 se neopakovat, zejm\u00e9na pokud p\u0159id\u00e1me v\u00edce podobn\u00fdch stav\u016f. M\u00e1 smysl seskupit Idling a Patrolling pod spole\u010dn\u00fdm ozna\u010den\u00edm \u201enebojov\u00e9\u201c, kde existuje pouze jeden spole\u010dn\u00fd soubor p\u0159echod\u016f do bojov\u00fdch stav\u016f. Pokud si toto ozna\u010den\u00ed p\u0159edstav\u00edme jako stav, pak se Idling a Patrolling stanou podstavy. P\u0159\u00edklad pou\u017eit\u00ed samostatn\u00e9 tabulky p\u0159echod\u016f pro nov\u00fd nebojov\u00fd podstav:<\/p>\n<p><i>Hlavn\u00ed stavy:<\/i><br \/>\n<img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/d86dd918acbe81b9bf22c2fb34aecee3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<i>Stav mimo boj:<\/i><br \/>\n<img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/9d5bc2053010a32c5f68d7f0192c04ed.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA ve form\u011b diagramu:<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/0ccf95ecafa9ce2a6ea5b5b9833ddc4f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTo je stejn\u00fd syst\u00e9m, ale s nov\u00fdm nebojov\u00fdm stavem, kter\u00fd zahrnuje Idling a Patrolling. Ka\u017ed\u00fd stav obsahuj\u00edc\u00ed FSM s podstavami (a tyto podstavy, na druh\u00e9 stran\u011b, obsahuj\u00ed vlastn\u00ed FSM \u2013 a tak d\u00e1le, kolik pot\u0159ebujete), z\u00edsk\u00e1v\u00e1me Hierarchical Finite State Machine nebo HFSM (hierarchick\u00fd kone\u010dn\u00fd automat). Seskl\u00e1d\u00e1n\u00edm nebojov\u00e9ho stavu jsme odstranili spoustu nadbyte\u010dn\u00fdch p\u0159echod\u016f. Tot\u00e9\u017e m\u016f\u017eeme ud\u011blat pro jak\u00e9koli nov\u00e9 stavy se spole\u010dn\u00fdmi p\u0159echody. Nap\u0159\u00edklad pokud v budoucnu roz\u0161\u00ed\u0159\u00edme stav Attacking na stavy MeleeAttacking a MissileAttacking, stanou se podstavami, kter\u00e9 p\u0159ech\u00e1zej\u00ed mezi sebou na z\u00e1klad\u011b vzd\u00e1lenosti k nep\u0159\u00edteli a dostupnosti munice. V\u00fdsledkem jsou slo\u017eit\u00e9 modely chov\u00e1n\u00ed a podmodely chov\u00e1n\u00ed, kter\u00e9 lze p\u0159edstavit s minimem duplicitn\u00edch p\u0159echod\u016f.<\/p>\n<h3>Strom chov\u00e1n\u00ed<\/h3>\n<p>\nS HFSM se vytv\u00e1\u0159ej\u00ed slo\u017eit\u00e9 kombinace chov\u00e1n\u00ed jednoduch\u00fdm zp\u016fsobem. Nicm\u00e9n\u011b, existuje mal\u00e1 obt\u00ed\u017enost, \u017ee rozhodov\u00e1n\u00ed ve form\u011b pravidel p\u0159echodu je \u00fazce spojeno s aktu\u00e1ln\u00edm stavem. A v mnoha hr\u00e1ch je to p\u0159esn\u011b to, co je pot\u0159eba. Pe\u010dliv\u00e9 vyu\u017eit\u00ed hierarchie stav\u016f m\u016f\u017ee sn\u00ed\u017eit mno\u017estv\u00ed opakov\u00e1n\u00ed p\u0159i p\u0159echodu. Ale n\u011bkdy jsou pot\u0159eba pravidla, kter\u00e1 funguj\u00ed nez\u00e1visle na tom, v jak\u00e9m stavu se nach\u00e1z\u00edte, nebo kter\u00e1 se aplikuj\u00ed t\u00e9m\u011b\u0159 v jak\u00fdchkoli stavech. Nap\u0159\u00edklad, pokud zdrav\u00ed agenta klesne na 25 %, budete cht\u00edt, aby utekl bez ohledu na to, zda byl v boji, nic ned\u011blal nebo mluvil \u2013 to budete muset p\u0159id\u00e1vat do ka\u017ed\u00e9ho stavu. A pokud v\u00e1\u0161 designer pozd\u011bji chce zm\u011bnit pr\u00e1h n\u00edzk\u00e9ho zdrav\u00ed z 25 % na 10 %, pak se t\u00edm znovu budete muset zab\u00fdvat.<\/p>\n<p>Ide\u00e1ln\u011b by v t\u00e9to situaci m\u011bl b\u00fdt syst\u00e9m, kde jsou rozhodnut\u00ed o tom, \"v jak\u00e9m stavu by m\u011bl b\u00fdt\", mimo samotn\u00e9 stavy, aby bylo mo\u017en\u00e9 prov\u00e1d\u011bt zm\u011bny pouze na jednom m\u00edst\u011b a nedot\u00fdkat se podm\u00ednek p\u0159echodu. Zde p\u0159ich\u00e1zej\u00ed na sc\u00e9nu stromy chov\u00e1n\u00ed.<\/p>\n<p>Existuje n\u011bkolik zp\u016fsob\u016f jejich implementace, ale podstata je pro v\u0161echny p\u0159ibli\u017en\u011b stejn\u00e1 a podob\u00e1 se rozhodovac\u00edmu stromu: algoritmus za\u010d\u00edn\u00e1 \"ko\u0159enov\u00fdm\" uzlem a ve stromu se nach\u00e1zej\u00ed uzly p\u0159edstavuj\u00edc\u00ed bu\u010f rozhodnut\u00ed, nebo akce. Existuj\u00ed v\u0161ak n\u011bkolik kl\u00ed\u010dov\u00fdch rozd\u00edl\u016f:<\/p>\n<ul>\n<li>Nyn\u00ed uzly vracej\u00ed jednu ze t\u0159\u00ed hodnot: Succeeded (pokud byla pr\u00e1ce dokon\u010dena), Failed (pokud nelze zah\u00e1jit) nebo Running (pokud st\u00e1le prob\u00edh\u00e1 a nen\u00ed kone\u010dn\u00fd v\u00fdsledek).<\/li>\n<li>U\u017e neexistuj\u00ed uzly rozhodnut\u00ed pro v\u00fdb\u011br mezi dv\u011bma alternativami. M\u00edsto toho se pou\u017e\u00edvaj\u00ed uzly Decorator, kter\u00e9 maj\u00ed jeden pod\u0159\u00edzen\u00fd uzel. Pokud usp\u011bj\u00ed, vykonaj\u00ed sv\u016fj jedin\u00fd pod\u0159\u00edzen\u00fd uzel.<\/li>\n<li>Uzly vykon\u00e1vaj\u00edc\u00ed akce vracej\u00ed hodnotu Running pro reprezentaci prov\u00e1d\u011bn\u00fdch akc\u00ed.<\/li>\n<\/ul>\n<p>\nTento mal\u00fd soubor uzl\u016f m\u016f\u017ee b\u00fdt kombinov\u00e1n k vytvo\u0159en\u00ed velk\u00e9ho mno\u017estv\u00ed slo\u017eit\u00fdch model\u016f chov\u00e1n\u00ed. P\u0159edstavme si HFSM str\u00e1\u017ece z p\u0159edchoz\u00edho p\u0159\u00edkladu ve form\u011b chov\u00e1n\u00ed stromu:<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/5eaa5c725e4ada8285f16f95bb206d53.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS touto strukturou by nem\u011bl existovat p\u0159\u00edm\u00fd p\u0159echod mezi stavy Idling\/Patrolling a stavem Attacking nebo jak\u00fdmikoli jin\u00fdmi. Pokud je nep\u0159\u00edtel viditeln\u00fd a zdrav\u00ed postavy je n\u00edzk\u00e9, prov\u00e1d\u011bn\u00ed se zastav\u00ed na uzlu Fleeing, bez ohledu na to, kter\u00fd uzel d\u0159\u00edve vykon\u00e1val \u2014 Patrolling, Idling, Attacking nebo jak\u00fdkoli jin\u00fd.<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/e1c1dcc2055174aa7cfa846364b1709a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nStromy chov\u00e1n\u00ed jsou slo\u017eit\u00e9 \u2014 existuje mnoho zp\u016fsob\u016f, jak je sestavit, a tak\u00e9 nalezen\u00ed spr\u00e1vn\u00e9 kombinace dekor\u00e1tor\u016f a slo\u017een\u00fdch uzl\u016f m\u016f\u017ee b\u00fdt problematick\u00e9. Jsou zde tak\u00e9 ot\u00e1zky o tom, jak \u010dasto kontrolovat strom \u2014 chceme proj\u00edt ka\u017edou jeho \u010d\u00e1st, nebo pouze tehdy, kdy\u017e se jedno z podm\u00ednek zm\u011bnilo? Jak uchov\u00e1vat stav vztahuj\u00edc\u00ed se k uzl\u016fm \u2014 jak zjistit, kdy jsme byli ve stavu Idling po dobu 10 sekund, nebo jak zjistit, kter\u00e9 uzly byly prov\u00e1d\u011bny naposledy, abychom spr\u00e1vn\u011b zpracovali sekvenci?<\/p>\n<p>Pr\u00e1v\u011b proto existuje mnoho implementac\u00ed. Nap\u0159\u00edklad v n\u011bkter\u00fdch syst\u00e9mech byly uzly dekor\u00e1toru nahrazeny vestav\u011bn\u00fdmi dekor\u00e1tory. Ty znovu vyhodnocuj\u00ed strom p\u0159i zm\u011bn\u011b podm\u00ednek dekor\u00e1toru, pom\u00e1haj\u00ed p\u0159ipojit uzly a zaji\u0161\u0165uj\u00ed periodick\u00e9 aktualizace.<\/p>\n<h3>Syst\u00e9m zalo\u017een\u00fd na u\u017eite\u010dnosti<\/h3>\n<p>\nN\u011bkter\u00e9 hry maj\u00ed mnoho r\u016fzn\u00fdch mechanik. Je \u017e\u00e1douc\u00ed, aby m\u011bly v\u0161echny v\u00fdhody jednoduch\u00fdch a obecn\u00fdch pravidel p\u0159echodu, ale nemus\u00ed se nutn\u011b vyjad\u0159ovat jako pln\u00e9 chov\u00e1n\u00ed stromu. M\u00edsto toho, abychom m\u011bli jasnou sadu v\u00fdb\u011br\u016f nebo strom mo\u017en\u00fdch akc\u00ed, je snaz\u0161\u00ed studovat v\u0161echny akce a vybrat tu nejvhodn\u011bj\u0161\u00ed v dan\u00e9m okam\u017eiku.<\/p>\n<p>Syst\u00e9m zalo\u017een\u00fd na u\u017eite\u010dnosti pr\u00e1v\u011b v tom pom\u016f\u017ee. Je to syst\u00e9m, kde m\u00e1 agent k dispozici mnoho akc\u00ed a s\u00e1m si vyb\u00edr\u00e1, kterou vykonat, na z\u00e1klad\u011b relativn\u00ed u\u017eite\u010dnosti ka\u017ed\u00e9 z nich. Kde u\u017eite\u010dnost je libovoln\u00e1 m\u00edra toho, jak d\u016fle\u017eit\u00e9 nebo \u017e\u00e1douc\u00ed je vykon\u00e1n\u00ed t\u00e9to akce pro agenta. <\/p>\n<p>Spo\u010d\u00edtanou u\u017eite\u010dnost akce na z\u00e1klad\u011b aktu\u00e1ln\u00edho stavu a prost\u0159ed\u00ed m\u016f\u017ee agent zkontrolovat a kdykoliv vybrat nejvhodn\u011bj\u0161\u00ed dal\u0161\u00ed stav. Je to podobn\u00e9 jako FSM, s v\u00fdjimkou toho, \u017ee p\u0159echody jsou ur\u010deny hodnocen\u00edm pro ka\u017ed\u00fd potenci\u00e1ln\u00ed stav, v\u010detn\u011b aktu\u00e1ln\u00edho. V\u0161imn\u011bte si, \u017ee vyb\u00edr\u00e1me nejv\u00edce u\u017eite\u010dnou akci k p\u0159echodu (nebo z\u016fst\u00e1v\u00e1me, pokud jsme ji ji\u017e provedli). Pro v\u011bt\u0161\u00ed rozmanitost to m\u016f\u017ee b\u00fdt v\u00e1\u017een\u00fd, ale n\u00e1hodn\u00fd v\u00fdb\u011br z mal\u00e9ho seznamu.<\/p>\n<p>Syst\u00e9m p\u0159id\u011bluje libovoln\u00fd rozsah hodnot u\u017eite\u010dnosti \u2014 nap\u0159\u00edklad od 0 (zcela ne\u017e\u00e1douc\u00ed) do 100 (zcela \u017e\u00e1douc\u00ed). Ka\u017ed\u00e1 akce m\u00e1 \u0159adu parametr\u016f, kter\u00e9 ovliv\u0148uj\u00ed v\u00fdpo\u010det t\u00e9to hodnoty. N\u00e1vrat k na\u0161emu p\u0159\u00edkladu se str\u00e1\u017ecem:<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/085fb2c197bde93d78455d18e63c9c25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nP\u0159echody mezi akcemi nejsou jednozna\u010dn\u00e9 \u2014 jak\u00fdkoliv stav m\u016f\u017ee n\u00e1sledovat jak\u00fdkoliv jin\u00fd. Priorita akc\u00ed se ur\u010duje na z\u00e1klad\u011b vr\u00e1cen\u00fdch hodnot u\u017eite\u010dnosti. Pokud je nep\u0159\u00edtel viditeln\u00fd a je siln\u00fd, zat\u00edmco zdrav\u00ed postavy je n\u00edzk\u00e9, pak jak Fleeing, tak FindingHelp vr\u00e1t\u00ed vysok\u00e9 nenulov\u00e9 hodnoty. Av\u0161ak FindingHelp bude v\u017edy vy\u0161\u0161\u00ed. Podobn\u011b, nebojov\u00e9 akce nikdy nevrac\u00ed v\u00edce ne\u017e 50, a tak budou v\u017edy ni\u017e\u0161\u00ed ne\u017e bojov\u00e9. Je t\u0159eba to zohlednit p\u0159i vytv\u00e1\u0159en\u00ed akc\u00ed a v\u00fdpo\u010dtu jejich u\u017eite\u010dnosti.<\/p>\n<p>V na\u0161em p\u0159\u00edkladu akce vracej\u00ed bu\u010f fixn\u00ed hodnotu, nebo jednu ze dvou pevn\u00fdch hodnot. Realisti\u010dt\u011bj\u0161\u00ed syst\u00e9m by p\u0159edpokl\u00e1dal n\u00e1vrat hodnoty z kontinu\u00e1ln\u00edho rozmez\u00ed hodnot. Nap\u0159\u00edklad akce \u00dat\u011bk vrac\u00ed vy\u0161\u0161\u00ed hodnoty u\u017eite\u010dnosti, pokud je zdrav\u00ed agenta n\u00edzk\u00e9, zat\u00edmco akce \u00datok vrac\u00ed ni\u017e\u0161\u00ed hodnoty, kdy\u017e je nep\u0159\u00edtel p\u0159\u00edli\u0161 siln\u00fd. Z tohoto d\u016fvodu m\u00e1 akce \u00dat\u011bk v jak\u00e9koli situaci, kdy agent c\u00edt\u00ed, \u017ee nem\u00e1 dost zdrav\u00ed na v\u00edt\u011bzstv\u00ed nad protivn\u00edkem, p\u0159ednost p\u0159ed \u00datokem. To umo\u017e\u0148uje m\u011bnit priority akc\u00ed na z\u00e1klad\u011b r\u016fzn\u00fdch krit\u00e9ri\u00ed, co\u017e \u010din\u00ed tento p\u0159\u00edstup flexibiln\u011bj\u0161\u00edm a variabiln\u011bj\u0161\u00edm ne\u017e strom chov\u00e1n\u00ed nebo FSM.<\/p>\n<p>Ka\u017ed\u00e1 akce m\u00e1 mnoho podm\u00ednek pro v\u00fdpo\u010det programu. Ty lze napsat ve skriptovac\u00edm jazyce nebo ve form\u011b s\u00e9rie matematick\u00fdch vzorc\u016f. V The Sims, kter\u00e9 modeluje ka\u017edodenn\u00ed \u017eivot postavy, se p\u0159id\u00e1v\u00e1 dal\u0161\u00ed \u00farove\u0148 v\u00fdpo\u010dt\u016f \u2014 agent dost\u00e1v\u00e1 \u0159adu \u201emotivac\u00ed\u201c, kter\u00e9 ovliv\u0148uj\u00ed hodnocen\u00ed u\u017eite\u010dnosti. Pokud je postava hladov\u00e1, postupem \u010dasu bude hladov\u011bt je\u0161t\u011b v\u00edce, a v\u00fdsledek u\u017eite\u010dnosti akce J\u00edst j\u00eddlo poroste, dokud ji postava neprovede, \u010d\u00edm\u017e sn\u00ed\u017e\u00ed \u00farove\u0148 hladu a vr\u00e1t\u00ed hodnotu J\u00edst j\u00eddlo na nulu. <\/p>\n<p>My\u0161lenka v\u00fdb\u011bru akc\u00ed na z\u00e1klad\u011b syst\u00e9mu hodnocen\u00ed je docela jednoduch\u00e1, a proto lze syst\u00e9m zalo\u017een\u00fd na u\u017eite\u010dnosti pou\u017e\u00edvat jako sou\u010d\u00e1st proces\u016f rozhodov\u00e1n\u00ed AI, nikoli jako jejich \u00faplnou n\u00e1hradu. Rozhodovac\u00ed strom m\u016f\u017ee po\u017e\u00e1dat o hodnocen\u00ed u\u017eite\u010dnosti dvou dce\u0159in\u00fdch uzl\u016f a vybrat vy\u0161\u0161\u00ed z nich. Podobn\u011b m\u016f\u017ee m\u00edt strom chov\u00e1n\u00ed slo\u017een\u00fd uzel U\u017eite\u010dnost pro hodnocen\u00ed u\u017eite\u010dnosti akc\u00ed, aby se rozhodl, kter\u00fd dce\u0159in\u00fd prvek prov\u00e9st.<\/p>\n<h2>Pohyb a navigace<\/h2>\n<p>\nV p\u0159edchoz\u00edch p\u0159\u00edkladech jsme m\u011bli platformu, kterou jsme pohybovali vlevo nebo vpravo, a str\u00e1\u017en\u00e9ho, kter\u00fd patroloval nebo \u00fato\u010dil. Ale jak vlastn\u011b zpracov\u00e1v\u00e1me pohyb agenta po ur\u010dit\u00e9m \u010dasov\u00e9m obdob\u00ed? Jak nastavujeme rychlost, jak se vyh\u00fdb\u00e1me p\u0159ek\u00e1\u017ek\u00e1m a jak pl\u00e1nujeme trasu, pokud je d\u016fle\u017eit\u00e9 dostat se na c\u00edlov\u00e9 m\u00edsto slo\u017eit\u011bj\u0161\u00ed ne\u017e jen se pohybovat rovn\u011b? Poj\u010fme se na to pod\u00edvat.<\/p>\n<h3>Spr\u00e1va<\/h3>\n<p>\nV po\u010d\u00e1te\u010dn\u00ed f\u00e1zi budeme p\u0159edpokl\u00e1dat, \u017ee ka\u017ed\u00fd agent m\u00e1 hodnotu rychlosti, kter\u00e1 zahrnuje to, jak rychle se pohybuje a kter\u00fdm sm\u011brem. Ta m\u016f\u017ee b\u00fdt m\u011b\u0159ena v metrech za sekundu, kilometrech za hodinu, pixelech za sekundu atd. P\u0159i vzpom\u00edn\u00e1n\u00ed na cyklus Sense\/Think\/Act si m\u016f\u017eeme p\u0159edstavit, \u017ee \u010d\u00e1st Think vol\u00ed rychlost, zat\u00edmco \u010d\u00e1st Act tuto rychlost aplikuje na agenta. Obvykle ve hr\u00e1ch existuje fyzik\u00e1ln\u00ed syst\u00e9m, kter\u00fd tuto \u00falohu vykon\u00e1v\u00e1 za v\u00e1s, posuzuj\u00edc\u00ed hodnotu rychlosti ka\u017ed\u00e9ho objektu a upravuj\u00edc\u00ed ji. Proto m\u016f\u017ee b\u00fdt \u00fakol AI pouze rozhodnout, jakou rychlost by m\u011bl agent m\u00edt. Pokud je zn\u00e1mo, kde by se agent m\u011bl nach\u00e1zet, je t\u0159eba ho p\u0159esunout spr\u00e1vn\u00fdm sm\u011brem s nastavenou rychlost\u00ed. Velmi trivi\u00e1ln\u00ed rovnice:<\/p>\n<p><i>desired_travel = destination_position \u2013 agent_position<\/i><\/p>\n<p>P\u0159edstavte si 2D sv\u011bt. Agent se nach\u00e1z\u00ed v bod\u011b (-2,-2), c\u00edl je n\u011bkde na severov\u00fdchod\u011b v bod\u011b (30, 20), a pot\u0159ebn\u00e1 cesta pro agenta, aby se tam dostal, je (32, 22). P\u0159edpokl\u00e1dejme, \u017ee tyto pozice jsou m\u011b\u0159eny v metrech \u2014 pokud p\u0159ijmeme rychlost agenta jako 5 metr\u016f za sekundu, budeme \u0161k\u00e1lovat n\u00e1\u0161 vektor pohybu a dostaneme rychlost p\u0159ibli\u017en\u011b (4.12, 2.83). S t\u011bmito parametry by agent dorazil na m\u00edsto ur\u010den\u00ed skoro za 8 sekund.<\/p>\n<p>Hodnoty lze p\u0159epo\u010d\u00edtat kdykoli. Pokud byl agent na p\u016fli cesty k c\u00edli, jeho pohyb by byl polovinou d\u00e9lky, ale vzhledem k tomu, \u017ee maxim\u00e1ln\u00ed rychlost agenta je 5 m\/s (jak jsme se rozhodli v\u00fd\u0161e), rychlost z\u016fstane stejn\u00e1. To tak\u00e9 funguje pro se pohybuj\u00edc\u00ed c\u00edle, co\u017e agentovi umo\u017e\u0148uje prov\u00e1d\u011bt drobn\u00e9 \u00fapravy, jak se pohybuj\u00ed.<\/p>\n<p>Ale chceme v\u00edce variabilnosti \u2014 nap\u0159\u00edklad pomalu zvy\u0161ovat rychlost, aby se simulovala postava, kter\u00e1 se pohybuje ze stoj\u00edc\u00ed pozice a p\u0159ech\u00e1z\u00ed k b\u011bhu. Tot\u00e9\u017e lze ud\u011blat na konci p\u0159ed zastaven\u00edm. Tyto funkce jsou zn\u00e1my jako steering behaviours, z nich\u017e ka\u017ed\u00e1 m\u00e1 konkr\u00e9tn\u00ed n\u00e1zvy: Seek (hled\u00e1n\u00ed), Flee (\u00fat\u011bk), Arrival (p\u0159\u00edjezd) atd. My\u0161lenka spo\u010d\u00edv\u00e1 v tom, \u017ee s\u00edly zrychlen\u00ed mohou b\u00fdt aplikov\u00e1ny na rychlost agenta na z\u00e1klad\u011b porovn\u00e1n\u00ed polohy agenta a aktu\u00e1ln\u00ed rychlosti s c\u00edlov\u00fdm bodem, aby se vyu\u017eily r\u016fzn\u00e9 zp\u016fsoby pohybu k c\u00edli.<\/p>\n<p>Ka\u017ed\u00e9 chov\u00e1n\u00ed m\u00e1 trochu jin\u00fd c\u00edl. Seek a Arrival jsou zp\u016fsoby, jak p\u0159esunout agenta k c\u00edlov\u00e9mu bodu. Obstacle Avoidance (vyh\u00fdb\u00e1n\u00ed se p\u0159ek\u00e1\u017ek\u00e1m) a Separation (odd\u011blen\u00ed) koriguj\u00ed pohyb agenta, aby se vyh\u00fdbal p\u0159ek\u00e1\u017ek\u00e1m na cest\u011b k c\u00edli. Alignment (vyrovn\u00e1n\u00ed) a Cohesion (sbl\u00ed\u017een\u00ed) udr\u017euj\u00ed agenty pohromad\u011b p\u0159i jejich pohybu. Jak\u00e9koliv mno\u017estv\u00ed r\u016fzn\u00fdch steering behaviours m\u016f\u017ee b\u00fdt se\u010dteno a vytvo\u0159it jeden sm\u011br pohybu, kter\u00fd bere v \u00favahu v\u0161echny faktory. Agent pou\u017e\u00edvaj\u00edc\u00ed chov\u00e1n\u00ed Arrival, Separation a Obstacle Avoidance, aby se dr\u017eel d\u00e1l od zd\u00ed a dal\u0161\u00edch agent\u016f. Tento p\u0159\u00edstup funguje dob\u0159e na otev\u0159en\u00fdch m\u00edstech bez zbyte\u010dn\u00fdch detail\u016f. <\/p>\n<p>Ve slo\u017eit\u011bj\u0161\u00edch podm\u00ednk\u00e1ch v\u0161ak se\u010d\u00edt\u00e1n\u00ed r\u016fzn\u00fdch chov\u00e1n\u00ed funguje h\u016f\u0159e \u2014 nap\u0159\u00edklad agent se m\u016f\u017ee zaseknout ve zdi kv\u016fli konfliktu mezi Arrival a Obstacle Avoidance. Proto je t\u0159eba zva\u017eovat mo\u017enosti, kter\u00e9 jsou slo\u017eit\u011bj\u0161\u00ed ne\u017e pouh\u00e9 se\u010d\u00edt\u00e1n\u00ed v\u0161ech hodnot. Jedn\u00edm z p\u0159\u00edstup\u016f je: m\u00edsto se\u010d\u00edt\u00e1n\u00ed v\u00fdsledk\u016f ka\u017ed\u00e9ho chov\u00e1n\u00ed se mohou zva\u017eovat pohyby v r\u016fzn\u00fdch sm\u011brech a vybrat nejlep\u0161\u00ed mo\u017enost. <\/p>\n<p>Av\u0161ak ve slo\u017eit\u00e9m prost\u0159ed\u00ed s \u043a\u0159i\u017eovatkami a v\u00fdb\u011brem sm\u011bru se budete pot\u0159ebovat n\u011bco je\u0161t\u011b pokro\u010dilej\u0161\u00edho.<\/p>\n<h3>Hled\u00e1n\u00ed cesty<\/h3>\n<p>\nSteering behaviours skv\u011ble funguj\u00ed pro jednoduch\u00fd pohyb na otev\u0159en\u00e9m prostranstv\u00ed (fotbalov\u00e9 h\u0159i\u0161t\u011b nebo ar\u00e9na), kde cesta z A do B je p\u0159\u00edm\u00e1 s mal\u00fdmi odchylkami kolem p\u0159ek\u00e1\u017eek. Pro slo\u017eit\u011bj\u0161\u00ed trasy pot\u0159ebujeme pathfinding (hled\u00e1n\u00ed cesty), co\u017e je prost\u0159edek k prozkoum\u00e1n\u00ed sv\u011bta a rozhodov\u00e1n\u00ed o trase skrze n\u011bj.<\/p>\n<p>Nejjednodu\u0161\u0161\u00ed je p\u0159ekr\u00fdt ka\u017ed\u00e9 pol\u00ed\u010dko m\u0159\u00ed\u017ekou a vyhodnotit, v jak\u00fdch z nich je mo\u017en\u00e9 se pohybovat. Pokud je n\u011bjak\u00e9 z nich c\u00edlov\u00fdm m\u00edstem, pak sledujte z n\u011bj trasu zp\u011bt z ka\u017ed\u00e9ho pol\u00ed\u010dka do p\u0159edchoz\u00edho, dokud se nedostanete na za\u010d\u00e1tek. To je trasa. Jinak opakujte proces s nejbli\u017e\u0161\u00edmi dal\u0161\u00edmi pol\u00ed\u010dky, dokud nenajdete c\u00edlov\u00e9 m\u00edsto nebo se v\u00e1m nevy\u010derpaj\u00ed pol\u00ed\u010dka (to znamen\u00e1, \u017ee neexistuje mo\u017en\u00e1 trasa). To, co je form\u00e1ln\u011b zn\u00e1m\u00e9 jako prohled\u00e1v\u00e1n\u00ed do \u0161\u00ed\u0159ky, nebo BFS (Breadth-First Search). P\u0159i ka\u017ed\u00e9m kroku se d\u00edv\u00e1 v\u0161emi sm\u011bry (proto \u0161\u00ed\u0159ka). Prostor pro vyhled\u00e1v\u00e1n\u00ed se chov\u00e1 jako vlnov\u00fd front, kter\u00fd se pohybuje, dokud nedos\u00e1hne hledan\u00e9ho m\u00edsta \u2014 oblast vyhled\u00e1v\u00e1n\u00ed se roz\u0161i\u0159uje v ka\u017ed\u00e9m kroku, dokud nezachyt\u00ed c\u00edlov\u00fd bod, po kter\u00e9m lze sledovat cestu zp\u011bt na za\u010d\u00e1tek.<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/d367e62bc53033b05388538649853a41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJako v\u00fdsledek z\u00edsk\u00e1te seznam pol\u00ed\u010dek, podle kter\u00fdch se sestav\u00ed pot\u0159ebn\u00e1 trasa. To je cesta (odtud nach\u00e1zen\u00ed cesty) \u2014 seznam m\u00edst, kter\u00e1 agent nav\u0161t\u00edv\u00ed, kdy\u017e jde za c\u00edlem.<\/p>\n<p>Vzhledem k tomu, \u017ee zn\u00e1me polohu ka\u017ed\u00e9ho pol\u00ed\u010dka ve sv\u011bt\u011b, m\u016f\u017eeme pou\u017e\u00edt steering behaviours k pohybu po cest\u011b \u2014 od uzlu 1 k uzlu 2, pot\u00e9 od uzlu 2 k uzlu 3 a tak d\u00e1le. Nejjednodu\u0161\u0161\u00ed varianta je zam\u00ed\u0159it do st\u0159edu n\u00e1sleduj\u00edc\u00edho pol\u00ed\u010dka, ale je\u0161t\u011b lep\u0161\u00ed je zastavit se uprost\u0159ed hrany mezi aktu\u00e1ln\u00edm pol\u00ed\u010dkem a dal\u0161\u00edm. To umo\u017en\u00ed agentovi zkr\u00e1tit zat\u00e1\u010dky v ostr\u00fdch oblouc\u00edch.<\/p>\n<p>Algoritmus BFS m\u00e1 tak\u00e9 nev\u00fdhody \u2014 prozkoum\u00e1 tolik pol\u00ed\u010dek v \"nespr\u00e1vn\u00e9m\" sm\u011bru, kolik v \"spr\u00e1vn\u00e9m\". Zde p\u0159ich\u00e1z\u00ed slo\u017eit\u011bj\u0161\u00ed algoritmus nazvan\u00fd A* (A star). Funguje to podobn\u011b, ale m\u00edsto slep\u00e9ho prozkoum\u00e1v\u00e1n\u00ed sousedn\u00edch pol\u00ed\u010dek (pot\u00e9 soused\u016f soused\u016f, pot\u00e9 soused\u016f soused\u016f soused\u016f atd.) shroma\u017e\u010fuje uzly do seznamu a t\u0159\u00edd\u00ed je tak, \u017ee dal\u0161\u00ed prozkoum\u00e1van\u00fd uzel je v\u017edy ten, kter\u00fd povede k nejkrat\u0161\u00ed trase. Uzly jsou t\u0159\u00edd\u011bny na z\u00e1klad\u011b heuristiky, kter\u00e1 zohled\u0148uje dv\u011b v\u011bci \u2014 \"n\u00e1klady\" hypotetick\u00e9 trasy k po\u017eadovan\u00e9mu pol\u00ed\u010dku (v\u010detn\u011b jak\u00fdchkoli n\u00e1klad\u016f na pohyb) a odhad vzd\u00e1lenosti tohoto pol\u00ed\u010dka od c\u00edle (posunuj\u00edc\u00ed vyhled\u00e1v\u00e1n\u00ed spr\u00e1vn\u00fdm sm\u011brem).<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/1cab4f53fa5af6b31d352c7bcf453d7e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV tomto p\u0159\u00edkladu agent prozkoum\u00e1v\u00e1 jedno \u010dtverce po druh\u00e9m, v\u017edy vyb\u00edr\u00e1 sousedn\u00ed, kter\u00fd je nejperspektivn\u011bj\u0161\u00ed. Z\u00edskan\u00e1 cesta je stejn\u00e1 jako p\u0159i BFS, ale b\u011bhem procesu bylo zkoum\u00e1no m\u00e9n\u011b \u010dtverc\u016f \u2014 co\u017e m\u00e1 velk\u00fd v\u00fdznam pro v\u00fdkon hry.<\/p>\n<h3>Pohyb bez m\u0159\u00ed\u017eky<\/h3>\n<p>\nV\u011bt\u0161ina her v\u0161ak nen\u00ed postavena na m\u0159\u00ed\u017ece a \u010dasto je nemo\u017en\u00e9 ji vytvo\u0159it, ani\u017e by do\u0161lo k po\u0161kozen\u00ed realismu. Je pot\u0159eba ud\u011blat kompromisy. Jak velk\u00e9 by m\u011bly b\u00fdt \u010dtverce? P\u0159\u00edli\u0161 velk\u00e9 \u2014 a nebudou schopny spr\u00e1vn\u011b reprezentovat \u00fazk\u00e9 chodby nebo zat\u00e1\u010dky, p\u0159\u00edli\u0161 mal\u00e9 \u2014 bude p\u0159\u00edli\u0161 mnoho \u010dtverc\u016f k prohled\u00e1n\u00ed, co\u017e zabere spoustu \u010dasu.<\/p>\n<p>Prvn\u00ed v\u011bc, kterou je t\u0159eba pochopit \u2014 m\u0159\u00ed\u017eka n\u00e1m d\u00e1v\u00e1 graf propojen\u00fdch uzl\u016f. Algoritmy A* a BFS vlastn\u011b pracuj\u00ed na grafech a v\u016fbec se nestaraj\u00ed o na\u0161i m\u0159\u00ed\u017eku. Mohli bychom um\u00edstit uzly kdekoli ve hern\u00edm sv\u011bt\u011b: pokud bude mezi jak\u00fdmikoli dv\u011bma propojen\u00fdmi uzly spojen\u00ed, v\u010detn\u011b po\u010d\u00e1te\u010dn\u00ed a koncov\u00e9 bodu a alespo\u0148 jednoho z uzl\u016f \u2014 algoritmus bude fungovat stejn\u011b dob\u0159e jako d\u0159\u00edve. \u010casto se tomu \u0159\u00edk\u00e1 syst\u00e9m waypoint\u016f, proto\u017ee ka\u017ed\u00fd uzel p\u0159edstavuje v\u00fdznamnou pozici ve sv\u011bt\u011b, kter\u00e1 m\u016f\u017ee b\u00fdt sou\u010d\u00e1st\u00ed jak\u00e9hokoli po\u010dtu hypotetick\u00fdch cest.<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/d87e9d4bb2a2fc713d32abc158506eaa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>P\u0159\u00edklad 1: uzel v ka\u017ed\u00e9m \u010dtverci. Hled\u00e1n\u00ed za\u010d\u00edn\u00e1 z uzlu, ve kter\u00e9m se nach\u00e1z\u00ed agent, a kon\u010d\u00ed v uzlu po\u017eadovan\u00e9ho \u010dtverce.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/b535a5db805efdc427d7c5724b866982.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>P\u0159\u00edklad 2: men\u0161\u00ed sada uzl\u016f (waypoint\u016f). Hled\u00e1n\u00ed za\u010d\u00edn\u00e1 v \u010dtverci s agentem, proch\u00e1z\u00ed pot\u0159ebn\u00fdm po\u010dtem uzl\u016f a pot\u00e9 pokra\u010duje k c\u00edlov\u00e9mu bodu.<\/i><\/p>\n<p>To je pom\u011brn\u011b flexibiln\u00ed a mocn\u00fd syst\u00e9m. Ale je pot\u0159eba b\u00fdt opatrn\u00fd p\u0159i rozhodov\u00e1n\u00ed, kde a jak um\u00edstit waypoint, jinak agenti jednodu\u0161e neuvid\u00ed nejbli\u017e\u0161\u00ed bod a nebudou schopni zah\u00e1jit cestu. Bylo by jednodu\u0161\u0161\u00ed, kdybychom mohli automaticky um\u00edstit waypointy na z\u00e1klad\u011b geometrie sv\u011bta.<\/p>\n<p>Zde p\u0159ich\u00e1z\u00ed na \u0159adu navigation mesh neboli navmesh (naviga\u010dn\u00ed s\u00ed\u0165). To je obvykle 2D s\u00ed\u0165 troj\u00faheln\u00edk\u016f, kter\u00e1 se p\u0159ekr\u00fdv\u00e1 s geometri\u00ed sv\u011bta \u2014 v\u0161ude, kde je agentovi povoleno chodit. Ka\u017ed\u00fd z troj\u00faheln\u00edk\u016f v s\u00edti se st\u00e1v\u00e1 uzlem v grafu a m\u00e1 a\u017e t\u0159i sousedn\u00ed troj\u00faheln\u00edky, kter\u00e9 se st\u00e1vaj\u00ed sousedn\u00edmi uzly v grafu. <\/p>\n<p>Tento obr\u00e1zek je p\u0159\u00edkladem z enginu Unity \u2014 analyzoval geometrii ve sv\u011bt\u011b a vytvo\u0159il navmesh (na screenshotu sv\u011btle modrou barvou). Ka\u017ed\u00fd polygon v navmesh je oblast, na kter\u00e9 m\u016f\u017ee agent st\u00e1t nebo se p\u0159esunout z jednoho polygonu do druh\u00e9ho. V tomto p\u0159\u00edkladu jsou polygony men\u0161\u00ed ne\u017e patra, na kter\u00fdch se nach\u00e1z\u00ed \u2014 bylo to ud\u011bl\u00e1no, aby se zohlednily rozm\u011bry agenta, kter\u00fd p\u0159esahuje jeho nomin\u00e1ln\u00ed polohu.<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/845705ba7b9a9d469203aedf7942da41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nM\u016f\u017eeme hledat trasu p\u0159es tuto s\u00ed\u0165, op\u011bt pomoc\u00ed algoritmu A*. To n\u00e1m poskytne prakticky ide\u00e1ln\u00ed trasu ve sv\u011bt\u011b, kter\u00e1 zohled\u0148uje celou geometrii a p\u0159itom nevy\u017eaduje nadbyte\u010dn\u00e9 uzly a vytv\u00e1\u0159en\u00ed kontroln\u00edch bod\u016f.<\/p>\n<p>Pathfinding je p\u0159\u00edli\u0161 obs\u00e1hl\u00e9 t\u00e9ma, kter\u00e9 se nevejde do jedn\u00e9 sekce \u010dl\u00e1nku. Pokud chcete studovat toto t\u00e9ma podrobn\u011bji, pom\u016f\u017ee v\u00e1m to <noindex><a rel=\"nofollow\" href=\"https:\/\/www.redblobgames.com\/pathfinding\/a-star\/introduction.html\">web Amita Patela<\/a><\/noindex>.<\/p>\n<h2>Pl\u00e1nov\u00e1n\u00ed<\/h2>\n<p>\nUjistili jsme se u pathfindingu, \u017ee n\u011bkdy nesta\u010d\u00ed jen vybrat sm\u011br a pohybovat se \u2014 mus\u00edme vybrat trasu a ud\u011blat n\u011bkolik zat\u00e1\u010dek, abychom se dostali na spr\u00e1vn\u00e9 m\u00edsto. Tuto my\u0161lenku m\u016f\u017eeme shrnout: dos\u00e1hnout c\u00edle nen\u00ed jen dal\u0161\u00ed krok, ale cel\u00e1 sekvence, kde n\u011bkdy mus\u00edme pohl\u00e9dnout dop\u0159edu na p\u00e1r krok\u016f, abychom zjistili, jak\u00fd by m\u011bl b\u00fdt prvn\u00ed. Tomu se \u0159\u00edk\u00e1 pl\u00e1nov\u00e1n\u00ed. Pathfinding lze pova\u017eovat za jeden z n\u011bkolika dopl\u0148k\u016f pl\u00e1nov\u00e1n\u00ed. Z hlediska na\u0161eho cyklu Sense\/Think\/Act je to m\u00edsto, kde \u010d\u00e1st Think pl\u00e1nuje n\u011bkolik \u010d\u00e1st\u00ed Act do budoucna.<\/p>\n<p>Pod\u00edvejme se na p\u0159\u00edklad deskov\u00e9 hry Magic: The Gathering. Aktu\u00e1ln\u011b hrajeme prvn\u00ed s n\u00e1sleduj\u00edc\u00edm souborem karet:<\/p>\n<ul>\n<li>Swamp \u2014 d\u00e1v\u00e1 1 \u010dernou manu (karta zem\u011b).<\/li>\n<li>Forest \u2014 d\u00e1v\u00e1 1 zelenou manu (karta zem\u011b).<\/li>\n<li>Fugitive Wizard \u2014 vy\u017eaduje 1 modrou manu k vyvol\u00e1n\u00ed.<\/li>\n<li>Elvish Mystic \u2014 vy\u017eaduje 1 zelenou manu k vyvol\u00e1n\u00ed.<\/li>\n<\/ul>\n<p>\nZbyl\u00e9 t\u0159i karty ignorujeme, aby to bylo jednodu\u0161\u0161\u00ed. Podle pravidel m\u00e1 hr\u00e1\u010d povoleno zahr\u00e1t 1 kartu zem\u011b za kolo, m\u016f\u017ee tuto kartu \u201etapnout\u201c, aby z\u00edskal manu, a pot\u00e9 pou\u017e\u00edt kouzla (v\u010detn\u011b vyvol\u00e1n\u00ed tvora) podle mno\u017estv\u00ed many. V t\u00e9to situaci v\u00ed hr\u00e1\u010d-\u010dlov\u011bk, \u017ee by m\u011bl zahr\u00e1t Forest, \u201etapnout\u201c 1 zelenou manu a pot\u00e9 vyvolat Elvish Mystic. Ale jak to m\u00e1 odhadnout hern\u00ed AI?<\/p>\n<h3>Jednoduch\u00e9 pl\u00e1nov\u00e1n\u00ed<\/h3>\n<p>\nTrivi\u00e1ln\u00ed p\u0159\u00edstup \u2014 vyzkou\u0161et ka\u017edou akci postupn\u011b, dokud nez\u016fstanou \u017e\u00e1dn\u00e9 vhodn\u00e9. Kdy\u017e se d\u00edv\u00e1 na karty, AI vid\u00ed, \u017ee m\u016f\u017ee zahr\u00e1t Swamp. A tak ho zahraje. Z\u016fstaly na tomto tahu je\u0161t\u011b dal\u0161\u00ed akce? Nem\u016f\u017ee vyvolat ani Elvish Mystic, ani Fugitive Wizard, proto\u017ee k jejich vyvol\u00e1n\u00ed je pot\u0159eba zelen\u00e1 a modr\u00e1 mana a Swamp d\u00e1v\u00e1 pouze \u010dernou manu. A ji\u017e nebude moci zahr\u00e1t Forest, proto\u017ee ji\u017e hr\u00e1l Swamp. Tak\u017ee hern\u00ed AI hr\u00e1lo podle pravidel, ale ud\u011blalo to \u0161patn\u011b. Lze to zlep\u0161it.<\/p>\n<p>Pl\u00e1nov\u00e1n\u00ed m\u016f\u017ee naj\u00edt seznam akc\u00ed, kter\u00e9 p\u0159iv\u00e1d\u011bj\u00ed hru do po\u017eadovan\u00e9ho stavu. Stejn\u011b jako ka\u017ed\u00fd \u010dtverec na cest\u011b m\u011bl sousedy (v pathfindingu), ka\u017ed\u00e1 akce v pl\u00e1nu tak\u00e9 m\u00e1 sousedy nebo n\u00e1sledovn\u00edky. M\u016f\u017eeme hledat tyto akce a n\u00e1sleduj\u00edc\u00ed akce, dokud nedos\u00e1hneme po\u017eadovan\u00e9ho stavu.<\/p>\n<p>V na\u0161em p\u0159\u00edkladu je po\u017eadovan\u00fd v\u00fdsledek \u201evyvolat bytost, pokud je to mo\u017en\u00e9\u201c. Na za\u010d\u00e1tku tahu vid\u00edme pouze dv\u011b mo\u017en\u00e9 akce povolen\u00e9 pravidly hry:<\/p>\n<p><i>1. Zahr\u00e1t Swamp (v\u00fdsledek: Swamp ve h\u0159e)<br \/>\n2. Zahr\u00e1t Forest (v\u00fdsledek: Forest ve h\u0159e)<\/i><\/p>\n<p>Ka\u017ed\u00e1 p\u0159ijat\u00e1 akce m\u016f\u017ee v\u00e9st k dal\u0161\u00edm akc\u00edm a uzav\u0159\u00edt jin\u00e9, op\u011bt v z\u00e1vislosti na pravidlech hry. P\u0159edstavte si, \u017ee jsme zahr\u00e1li Swamp \u2014 to odstran\u00ed Swamp jako dal\u0161\u00ed krok (u\u017e jsme ho zahr\u00e1li), tak\u00e9 to odstran\u00ed Forest (proto\u017ee podle pravidel lze zahr\u00e1t pouze jednu zemn\u00ed kartu za tah). Pot\u00e9 AI p\u0159id\u00e1 jako dal\u0161\u00ed krok \u2014 z\u00edsk\u00e1n\u00ed 1 \u010dern\u00e9 many, proto\u017ee nejsou \u017e\u00e1dn\u00e9 dal\u0161\u00ed mo\u017enosti. Pokud p\u016fjde d\u00e1l a vybere Tap the Swamp, z\u00edsk\u00e1 1 jednotku \u010dern\u00e9 many a nic s n\u00ed nebude moci ud\u011blat.<\/p>\n<p><i>1. Zahr\u00e1t Swamp (v\u00fdsledek: Swamp ve h\u0159e)<br \/>\n 1.1 \u201eTapnout\u201c Swamp (v\u00fdsledek: Swamp \u201etapnut\u00e1\u201c, +1 jednotka \u010dern\u00e9 many)<br \/>\n Nen\u00ed dostupn\u00e1 \u017e\u00e1dn\u00e1 akce \u2013 KONEC<br \/>\n2. Zahr\u00e1t Forest (v\u00fdsledek: Forest ve h\u0159e)<\/i><\/p>\n<p>Seznam akc\u00ed se uk\u00e1zal jako kr\u00e1tk\u00fd, dostali jsme se do slep\u00e9 uli\u010dky. Opakujeme proces pro dal\u0161\u00ed akci. Hrajeme Forest, otev\u00edr\u00e1me akci \u201ez\u00edskat 1 zelenou manu\u201c, kter\u00e1 zase otev\u0159e t\u0159et\u00ed akci \u2014 vyvol\u00e1n\u00ed Elvish Mystic.<\/p>\n<p><i>1. Zahr\u00e1t Swamp (v\u00fdsledek: Swamp ve h\u0159e)<br \/>\n 1.1 \u201eTapnout\u201c Swamp (v\u00fdsledek: Swamp \u201etapnut\u00e1\u201c, +1 jednotka \u010dern\u00e9 many)<br \/>\n Nen\u00ed dostupn\u00e1 \u017e\u00e1dn\u00e1 akce \u2013 KONEC<br \/>\n2. Zahr\u00e1t Forest (v\u00fdsledek: Forest ve h\u0159e)<br \/>\n 2.1 \u201eTapnout\u201c Forest (v\u00fdsledek: Forest \u201etapnut\u00e1\u201c, +1 jednotka zelen\u00e9 many)<br \/>\n 2.1.1 Vyvolat Elvish Mystic (v\u00fdsledek: Elvish Mystic ve h\u0159e, -1 jednotka zelen\u00e9 many)<br \/>\n Nen\u00ed dostupn\u00e1 \u017e\u00e1dn\u00e1 akce \u2013 KONEC<\/i><\/p>\n<p>Nakonec jsme prozkoumali v\u0161echny mo\u017en\u00e9 akce a na\u0161li pl\u00e1n, kter\u00fd vyvol\u00e1v\u00e1 bytost.<\/p>\n<p>Toto je velmi zjednodu\u0161en\u00fd p\u0159\u00edklad. Je lep\u0161\u00ed zvolit nejlep\u0161\u00ed mo\u017en\u00fd pl\u00e1n, ne\u017e jen jak\u00fdkoli, kter\u00fd spl\u0148uje n\u011bjak\u00e1 krit\u00e9ria. Obecn\u011b lze potenci\u00e1ln\u00ed pl\u00e1ny posoudit na z\u00e1klad\u011b kone\u010dn\u00e9ho v\u00fdsledku nebo celkov\u00e9ho prosp\u011bchu z jejich proveden\u00ed. M\u016f\u017eete si p\u0159ipsat 1 bod za zahr\u00e1n\u00ed zem\u011b a 3 body za vyvol\u00e1n\u00ed bytosti. Zahr\u00e1t Swamp by znamenalo z\u00edskat 1 bod. A zahr\u00e1t Forest \u2192 Tap the Forest \u2192 vyvolat Elvish Mystic \u2014 to by hned dalo 4 body. <\/p>\n<p>Takto funguje pl\u00e1nov\u00e1n\u00ed v Magic: The Gathering, ale stejn\u00e1 logika se pou\u017e\u00edv\u00e1 i v dal\u0161\u00edch situac\u00edch. Nap\u0159\u00edklad posunout p\u011b\u0161ce, aby se uvolnilo m\u00edsto pro tah st\u0159elce v \u0161achu. Nebo se schovat za zd\u00ed, abyste bezpe\u010dn\u011b st\u0159\u00edleli v XCOM. Celkov\u011b, pochopili jste podstatu.<\/p>\n<h3>Vylep\u0161en\u00e9 pl\u00e1nov\u00e1n\u00ed<\/h3>\n<p>\nN\u011bkdy je p\u0159\u00edli\u0161 mnoho potenci\u00e1ln\u00edch akc\u00ed, ne\u017e abyste zva\u017eovali ka\u017edou mo\u017enou variantu. Vr\u00e1t\u00edme-li se k p\u0159\u00edkladu z Magic: The Gathering: p\u0159edpokl\u00e1dejme, \u017ee m\u00e1te ve h\u0159e v ruce n\u011bkolik karet zem\u011b a bytost\u00ed \u2014 po\u010det mo\u017en\u00fdch kombinac\u00ed tah\u016f se m\u016f\u017ee po\u010d\u00edtat na des\u00edtky. Existuje n\u011bkolik \u0159e\u0161en\u00ed probl\u00e9mu.<\/p>\n<p>Prvn\u00ed zp\u016fsob \u2014 backward chaining (zp\u011btn\u00e9 \u0159et\u011bzen\u00ed). M\u00edsto proch\u00e1zen\u00ed v\u0161ech kombinac\u00ed, je lep\u0161\u00ed za\u010d\u00edt s kone\u010dn\u00fdm v\u00fdsledkem a pokusit se naj\u00edt p\u0159\u00edmou cestu. M\u00edsto cesty od ko\u0159ene stromu k ur\u010dit\u00e9mu listu se pohybujeme opa\u010dn\u00fdm sm\u011brem \u2014 od listu k ko\u0159eni. Tento zp\u016fsob je jednodu\u0161\u0161\u00ed a rychlej\u0161\u00ed.<\/p>\n<p>Pokud m\u00e1 protivn\u00edk 1 bod zdrav\u00ed, m\u016f\u017eete nal\u00e9zt pl\u00e1n \u201ezp\u016fsobit 1 nebo v\u00edce bod\u016f po\u0161kozen\u00ed\u201c. Abyste toho dos\u00e1hli, mus\u00edte splnit \u0159adu podm\u00ednek: <\/p>\n<p>1. Po\u0161kozen\u00ed m\u016f\u017ee zp\u016fsobit kouzlo \u2014 to mus\u00ed b\u00fdt v ruce.<br \/>\n2. Aby bylo mo\u017en\u00e9 zahr\u00e1t kouzlo \u2014 pot\u0159ebujete manu.<br \/>\n3. Abyste z\u00edskali manu \u2014 mus\u00edte zahr\u00e1t kartu zem\u011b.<br \/>\n4. Abyste zahr\u00e1li kartu zem\u011b \u2014 mus\u00edte ji m\u00edt v ruce.<\/p>\n<p>Dal\u0161\u00ed zp\u016fsob \u2014 best-first search (nejlep\u0161\u00ed prvn\u00ed vyhled\u00e1v\u00e1n\u00ed). M\u00edsto proch\u00e1zen\u00ed v\u0161ech cest vyb\u00edr\u00e1me tu nejvhodn\u011bj\u0161\u00ed. Tento zp\u016fsob obvykle poskytuje optim\u00e1ln\u00ed pl\u00e1n bez zbyte\u010dn\u00fdch n\u00e1klad\u016f na vyhled\u00e1v\u00e1n\u00ed. A* je formou nejlep\u0161\u00edho prvn\u00edho vyhled\u00e1v\u00e1n\u00ed \u2014 zkoum\u00e1n\u00edm nejperspektivn\u011bj\u0161\u00edch tras od sam\u00e9ho za\u010d\u00e1tku m\u016f\u017ee naj\u00edt nejlep\u0161\u00ed cestu, ani\u017e by bylo nutn\u00e9 kontrolovat ostatn\u00ed varianty.<\/p>\n<p>Zaj\u00edmavou a st\u00e1le popul\u00e1rn\u011bj\u0161\u00ed variantou best-first search je Monte Carlo Tree Search. M\u00edsto h\u00e1d\u00e1n\u00ed, kter\u00e9 pl\u00e1ny jsou lep\u0161\u00ed ne\u017e jin\u00e9 p\u0159i v\u00fdb\u011bru ka\u017ed\u00e9 n\u00e1sleduj\u00edc\u00ed akce, algoritmus na ka\u017ed\u00e9m kroku vol\u00ed n\u00e1hodn\u00e9 n\u00e1sledovn\u00edky, dokud nedos\u00e1hne konce (kdy pl\u00e1n vedl k v\u00edt\u011bzstv\u00ed nebo por\u00e1\u017ece). Pot\u00e9 se kone\u010dn\u00fd v\u00fdsledek pou\u017e\u00edv\u00e1 ke zv\u00fd\u0161en\u00ed nebo sn\u00ed\u017een\u00ed hodnocen\u00ed \"v\u00e1hy\" p\u0159edchoz\u00edch mo\u017enost\u00ed. Opakov\u00e1n\u00edm tohoto procesu n\u011bkolikr\u00e1t za sebou algoritmus poskytuje dobr\u00e9 hodnocen\u00ed toho, jak\u00fd dal\u0161\u00ed krok je nejlep\u0161\u00ed, i kdy\u017e se situace zm\u011bn\u00ed (pokud se protivn\u00edk sna\u017e\u00ed hr\u00e1\u010de zablokovat). <\/p>\n<p>V p\u0159\u00edb\u011bhu o pl\u00e1nov\u00e1n\u00ed ve hr\u00e1ch nelze opomenout Goal-Oriented Action Planning neboli GOAP (c\u00edlen\u00e9 pl\u00e1nov\u00e1n\u00ed akc\u00ed). Toto je \u0161iroce pou\u017e\u00edvan\u00e1 a diskutovan\u00e1 metoda, ale krom\u011b n\u011bkolika charakteristick\u00fdch detail\u016f je to v podstat\u011b metoda backwards chaining, o kter\u00e9 jsme hovo\u0159ili d\u0159\u00edve. Pokud \u00fakol byl \u201ezni\u010dit hr\u00e1\u010de\u201c, a hr\u00e1\u010d je za kryt\u00edm, pl\u00e1n m\u016f\u017ee b\u00fdt n\u00e1sleduj\u00edc\u00ed: zni\u010d gran\u00e1t, vezmi ho, ho\u010f.<\/p>\n<p>Obvykle existuje n\u011bkolik c\u00edl\u016f, ka\u017ed\u00fd s vlastn\u00edm prioritou. Pokud nelze splnit c\u00edl s nejvy\u0161\u0161\u00ed prioritou (\u017e\u00e1dn\u00e1 kombinace akc\u00ed nevytv\u00e1\u0159\u00ed pl\u00e1n \u201ezni\u010dit hr\u00e1\u010de\u201c, proto\u017ee hr\u00e1\u010d nen\u00ed vid\u011bt), AI se vr\u00e1t\u00ed k c\u00edl\u016fm s ni\u017e\u0161\u00ed prioritou.<\/p>\n<h2>U\u010den\u00ed a adaptace<\/h2>\n<p>\nJi\u017e jsme zm\u00ednili, \u017ee hern\u00ed AI obvykle nepou\u017e\u00edv\u00e1 strojov\u00e9 u\u010den\u00ed, proto\u017ee to nen\u00ed vhodn\u00e9 pro \u0159\u00edzen\u00ed agent\u016f v re\u00e1ln\u00e9m \u010dase. Ale to neznamen\u00e1, \u017ee se z t\u00e9to oblasti ned\u00e1 nic p\u0159evz\u00edt. Chceme nep\u0159\u00edtele ve st\u0159\u00edle\u010dce, od kter\u00e9ho se m\u016f\u017eeme n\u011bco nau\u010dit. Nap\u0159\u00edklad zjistit o nejlep\u0161\u00edch pozic\u00edch na map\u011b. Nebo protivn\u00edka ve fightingu, kter\u00fd by blokoval \u010dasto pou\u017e\u00edvan\u00e9 kombo-techniky hr\u00e1\u010de, \u010d\u00edm\u017e by ho motivoval pou\u017e\u00edvat jin\u00e9. Strojov\u00e9 u\u010den\u00ed v takov\u00fdch situac\u00edch m\u016f\u017ee b\u00fdt velmi u\u017eite\u010dn\u00e9.<\/p>\n<h3>Statistika a pravd\u011bpodobnosti<\/h3>\n<p>\nNe\u017e p\u0159ejdeme ke slo\u017eit\u011bj\u0161\u00edm p\u0159\u00edklad\u016fm, pod\u00edvejme se, jak daleko se m\u016f\u017eeme dostat, kdy\u017e provedeme n\u011bkolik jednoduch\u00fdch m\u011b\u0159en\u00ed a pou\u017eijeme je k rozhodov\u00e1n\u00ed. Nap\u0159\u00edklad, strategie v re\u00e1ln\u00e9m \u010dase \u2013 jak ur\u010d\u00edme, zda hr\u00e1\u010d m\u016f\u017ee za\u010d\u00edt \u00fatok v prvn\u00edch n\u011bkolika minut\u00e1ch hry a jakou obranu proti tomu p\u0159ipravit? M\u016f\u017eeme prozkoumat minulou zku\u0161enost hr\u00e1\u010de, abychom pochopili, jak\u00e1 m\u016f\u017ee b\u00fdt jeho budouc\u00ed reakce. Za\u010dn\u011bme t\u00edm, \u017ee nem\u00e1me takov\u00e1 v\u00fdchoz\u00ed data, ale m\u016f\u017eeme je shrom\u00e1\u017edit \u2013 poka\u017ed\u00e9, kdy\u017e AI hraje proti \u010dlov\u011bku, m\u016f\u017ee zaznamen\u00e1vat \u010das prvn\u00edho \u00fatoku. Po n\u011bkolika sezen\u00edch z\u00edsk\u00e1me pr\u016fm\u011brnou hodnotu \u010dasu, po kter\u00e9m hr\u00e1\u010d za\u00fato\u010d\u00ed v budoucnu.<\/p>\n<p>Pr\u016fm\u011brn\u00e9 hodnoty maj\u00ed tak\u00e9 probl\u00e9m: pokud hr\u00e1\u010d 20kr\u00e1t \u201erushoval\u201c a 20kr\u00e1t hr\u00e1l pomalu, pot\u0159ebn\u00e9 hodnoty budou kdesi uprost\u0159ed, co\u017e n\u00e1m neposkytne nic u\u017eite\u010dn\u00e9ho. Jedno z \u0159e\u0161en\u00ed je omezit vstupn\u00ed data \u2013 m\u016f\u017eeme vz\u00edt v \u00favahu posledn\u00edch 20 z nich.<\/p>\n<p>Podobn\u00fd p\u0159\u00edstup se pou\u017e\u00edv\u00e1 p\u0159i hodnocen\u00ed pravd\u011bpodobnosti ur\u010dit\u00fdch akc\u00ed, p\u0159edpokl\u00e1daj\u00edc, \u017ee minul\u00e9 preference hr\u00e1\u010de budou v budoucnu podobn\u00e9. Pokud n\u00e1s hr\u00e1\u010d p\u011btkr\u00e1t za\u00fato\u010d\u00ed kouzlem ohniv\u00e9ho bal\u00f3nu, dvakr\u00e1t bleskem a jednou v t\u011bsn\u00e9m boji, je jasn\u00e9, \u017ee preferuje ohniv\u00fd bal\u00f3n. Extrapolujeme a vid\u00edme pravd\u011bpodobnost pou\u017eit\u00ed r\u016fzn\u00fdch zbran\u00ed: ohniv\u00fd bal\u00f3n = 62,5 %, blesk = 25 % a t\u011bsn\u00fd boj = 12,5 %. Na\u0161emu hern\u00edmu AI se mus\u00ed p\u0159ipravit na obranu p\u0159ed ohn\u011bm.<\/p>\n<p>Dal\u0161\u00ed zaj\u00edmavou metodou je pou\u017eit\u00ed Naivn\u00edho Bayesova klasifik\u00e1toru k prozkoum\u00e1n\u00ed velk\u00fdch objem\u016f vstupn\u00edch dat a klasifikaci situace, aby AI reagovalo spr\u00e1vn\u00fdm zp\u016fsobem. Bayesovy klasifik\u00e1tory jsou nejzn\u00e1m\u011bj\u0161\u00ed za pou\u017eit\u00ed ve filtrech spamu e-mailu. Zkoum\u00e1 slova, porovn\u00e1v\u00e1 je s t\u00edm, kde se tato slova objevila d\u0159\u00edve (ve spamu \u010di nikoliv), a d\u011bl\u00e1 z\u00e1v\u011bry o p\u0159\u00edchoz\u00edch e-mailech. M\u016f\u017eeme ud\u011blat to sam\u00e9 i s men\u0161\u00edm mno\u017estv\u00edm vstupn\u00edch dat. Na z\u00e1klad\u011b v\u0161ech u\u017eite\u010dn\u00fdch informac\u00ed, kter\u00e9 AI vid\u00ed (nap\u0159\u00edklad, jak\u00e9 nep\u0159\u00e1telsk\u00e9 jednotky byly vytvo\u0159eny, jak\u00e1 kouzla pou\u017e\u00edvaj\u00ed nebo jak\u00e9 technologie zkoumali) a kone\u010dn\u00e9ho v\u00fdsledku (v\u00e1lka nebo m\u00edr, \u201erushovat\u201c nebo br\u00e1nit se atd.) \u2013 vybereme po\u017eadovan\u00e9 chov\u00e1n\u00ed AI.<\/p>\n<p>V\u0161echny tyto metody u\u010den\u00ed jsou dostate\u010dn\u00e9, ale bylo by vhodn\u00e9 je pou\u017e\u00edvat na z\u00e1klad\u011b dat z testov\u00e1n\u00ed. AI se nau\u010d\u00ed p\u0159izp\u016fsobovat r\u016fzn\u00fdm strategi\u00edm, kter\u00e9 pou\u017e\u00edvali va\u0161i playteste\u0159i. AI, kter\u00e1 se p\u0159izp\u016fsobuje hr\u00e1\u010di po vyd\u00e1n\u00ed, se m\u016f\u017ee st\u00e1t p\u0159\u00edli\u0161 p\u0159edv\u00eddatelnou nebo naopak p\u0159\u00edli\u0161 slo\u017eitou na pora\u017een\u00ed.<\/p>\n<h3>P\u0159izp\u016fsoben\u00ed na z\u00e1klad\u011b hodnot<\/h3>\n<p>\nVzhledem k obsahu na\u0161eho hern\u00edho sv\u011bta a pravidel m\u016f\u017eeme zm\u011bnit soubor hodnot, kter\u00e9 ovliv\u0148uj\u00ed rozhodov\u00e1n\u00ed, a ne jen pou\u017e\u00edvat vstupn\u00ed data. D\u011bl\u00e1me to takto:<\/p>\n<ul>\n<li>Nechme AI shroma\u017e\u010fovat data o stavu sv\u011bta a kl\u00ed\u010dov\u00fdch ud\u00e1lostech b\u011bhem hry (jak bylo uvedeno v\u00fd\u0161e).<\/li>\n<li>Zm\u011bn\u00edme n\u011bkolik d\u016fle\u017eit\u00fdch hodnot (value) na z\u00e1klad\u011b t\u011bchto dat.<\/li>\n<li>Realizujeme sv\u00e1 rozhodnut\u00ed, kter\u00e1 vych\u00e1z\u00ed z anal\u00fdzy nebo hodnocen\u00ed t\u011bchto hodnot.<\/li>\n<\/ul>\n<p>\nNap\u0159\u00edklad agent m\u00e1 na v\u00fdb\u011br n\u011bkolik m\u00edstnost\u00ed na map\u011b st\u0159\u00edle\u010dky z pohledu prvn\u00ed osoby. Ka\u017ed\u00e1 m\u00edstnost m\u00e1 svou hodnotu, kter\u00e1 ur\u010duje, jak \u017e\u00e1dan\u00e1 je k n\u00e1v\u0161t\u011bv\u011b. AI n\u00e1hodn\u011b vyb\u00edr\u00e1, do kter\u00e9 m\u00edstnosti p\u016fjde, na z\u00e1klad\u011b hodnoty. Pot\u00e9 si agent zapamatuje, v kter\u00e9 m\u00edstnosti byl zabit, a jej\u00ed hodnotu sn\u00ed\u017e\u00ed (pravd\u011bpodobnost, \u017ee se tam vr\u00e1t\u00ed). Podobn\u011b je to v opa\u010dn\u00e9 situaci - pokud agent zlikviduje mnoho protivn\u00edk\u016f, hodnota m\u00edstnosti se zv\u00fd\u0161\u00ed.<\/p>\n<h3>Markov\u016fv model<\/h3>\n<p>\nCo kdybychom pou\u017eili shrom\u00e1\u017ed\u011bn\u00e1 data k predikci? Pokud si zapamatujeme ka\u017edou m\u00edstnost, ve kter\u00e9 jsme hr\u00e1\u010de vid\u011bli po ur\u010dit\u00e9 obdob\u00ed, budeme schopni p\u0159edpov\u011bd\u011bt, do kter\u00e9 m\u00edstnosti hr\u00e1\u010d m\u016f\u017ee p\u0159ej\u00edt. Sledov\u00e1n\u00edm a zaznamen\u00e1v\u00e1n\u00edm pohyb\u016f hr\u00e1\u010de mezi m\u00edstnostmi (values) m\u016f\u017eeme predikovat jejich chov\u00e1n\u00ed.<\/p>\n<p>Vezm\u011bme t\u0159i m\u00edstnosti: \u010dervenou, zelenou a modrou. A tak\u00e9 pozorov\u00e1n\u00ed, kter\u00e1 jsme zaznamenali p\u0159i sledov\u00e1n\u00ed hern\u00ed relace:<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/6e90a365b72a176c36c9a14213baaafc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nPo\u010det pozorov\u00e1n\u00ed ka\u017ed\u00e9 m\u00edstnosti je t\u00e9m\u011b\u0159 stejn\u00fd - zat\u00edm nev\u00edme, kde ud\u011blat dobr\u00e9 m\u00edsto pro l\u00e9\u010dku. Sb\u011br statistik tak\u00e9 komplikuje respawn hr\u00e1\u010d\u016f, kte\u0159\u00ed se objevuj\u00ed rovnom\u011brn\u011b po cel\u00e9 map\u011b. Ale data o dal\u0161\u00ed m\u00edstnosti, do kter\u00e9 vstoup\u00ed po respawnu - u\u017e jsou u\u017eite\u010dn\u00e1.<\/p>\n<p>Je z\u0159ejm\u00e9, \u017ee zelen\u00e1 m\u00edstnost vyhovuje hr\u00e1\u010d\u016fm \u2014 v\u011bt\u0161ina lid\u00ed z \u010derven\u00e9 p\u0159ech\u00e1z\u00ed do n\u00ed, p\u0159i\u010dem\u017e 50 % z\u016fst\u00e1v\u00e1 i nad\u00e1le. Modr\u00e1 m\u00edstnost naopak nen\u00ed popul\u00e1rn\u00ed, t\u00e9m\u011b\u0159 se do n\u00ed nechod\u00ed, a pokud ano, tak se tam dlouho nezdr\u017euj\u00ed. <\/p>\n<p>Ale data n\u00e1m \u0159\u00edkaj\u00ed n\u011bco d\u016fle\u017eit\u011bj\u0161\u00edho \u2014 kdy\u017e je hr\u00e1\u010d v modr\u00e9 m\u00edstnosti, je pravd\u011bpodobn\u00e9, \u017ee se dal\u0161\u00ed m\u00edstnost, ve kter\u00e9 ho uvid\u00edme, bude \u010derven\u00e1, a ne zelen\u00e1. I kdy\u017e je zelen\u00e1 m\u00edstnost popul\u00e1rn\u011bj\u0161\u00ed ne\u017e \u010derven\u00e1, situace se m\u011bn\u00ed, pokud je hr\u00e1\u010d v modr\u00e9. Dal\u0161\u00ed stav (to znamen\u00e1 m\u00edstnost, do kter\u00e9 hr\u00e1\u010d p\u0159ejde) z\u00e1vis\u00ed na p\u0159edchoz\u00edm stavu (to znamen\u00e1 m\u00edstnosti, ve kter\u00e9 hr\u00e1\u010d pr\u00e1v\u011b je). D\u00edky v\u00fdzkumu z\u00e1vislost\u00ed budeme moci prov\u00e1d\u011bt p\u0159edpov\u011bdi p\u0159esn\u011bji, ne\u017e kdybychom jen po\u010d\u00edtali pozorov\u00e1n\u00ed nez\u00e1visle na sob\u011b.<\/p>\n<p>P\u0159edpov\u00edd\u00e1n\u00ed budouc\u00edho stavu na z\u00e1klad\u011b dat z minul\u00e9ho stavu se naz\u00fdv\u00e1 Markov\u016fv model (Markov model), a takov\u00e9 p\u0159\u00edklady (s m\u00edstnostmi) se naz\u00fdvaj\u00ed Markovsk\u00e9 \u0159et\u011bzce. Jeliko\u017e modely p\u0159edstavuj\u00ed pravd\u011bpodobnosti zm\u011bn mezi po sob\u011b jdouc\u00edmi stavy, vizu\u00e1ln\u011b jsou zn\u00e1zor\u0148ov\u00e1ny jako FSM s pravd\u011bpodobnost\u00ed u ka\u017ed\u00e9ho p\u0159echodu. D\u0159\u00edve jsme pou\u017e\u00edvali FSM k reprezentaci behavior\u00e1ln\u00edho stavu, v n\u011bm\u017e se agent nach\u00e1zel, ale tento koncept se vztahuje na jak\u00fdkoli stav, bez ohledu na to, zda je spojen s agentem. V tomto p\u0159\u00edpad\u011b stavy p\u0159edstavuj\u00ed m\u00edstnost, kterou agent obsazuje:<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/edb32dff7a3298b19c3fa4d66f48e9f4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTo je jednoduch\u00e1 varianta reprezentace relativn\u00ed pravd\u011bpodobnosti zm\u011bn stav\u016f, kter\u00e1 d\u00e1v\u00e1 AI ur\u010ditou schopnost p\u0159edpov\u00eddat dal\u0161\u00ed stav. M\u016f\u017eeme p\u0159edv\u00eddat n\u011bkolik krok\u016f dop\u0159edu.<\/p>\n<p>Pokud je hr\u00e1\u010d v zelen\u00e9 m\u00edstnosti, je pravd\u011bpodobnost, \u017ee tam z\u016fstane p\u0159i dal\u0161\u00edm pozorov\u00e1n\u00ed, 50 %. Ale jak\u00e1 je pravd\u011bpodobnost, \u017ee tam bude i pozd\u011bji? Existuje nejen \u0161ance, \u017ee hr\u00e1\u010d z\u016fstal v zelen\u00e9 m\u00edstnosti po dvou pozorov\u00e1n\u00edch, ale tak\u00e9 \u0161ance, \u017ee ode\u0161el a vr\u00e1til se. Zde je nov\u00e1 tabulka, kter\u00e1 zohled\u0148uje nov\u00e1 data:<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/f87afff68b066a879661e37f68654ae2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nZ n\u00ed vypl\u00fdv\u00e1, \u017ee \u0161ance vid\u011bt hr\u00e1\u010de v zelen\u00e9 m\u00edstnosti po dvou pozorov\u00e1n\u00edch bude 51 % \u2014 21 %, \u017ee p\u0159ejde z \u010derven\u00e9 m\u00edstnosti, 5 %, \u017ee nav\u0161t\u00edv\u00ed modrou m\u00edstnost mezi nimi, a 25 %, \u017ee hr\u00e1\u010d v\u016fbec neopust\u00ed zelenou m\u00edstnost.<\/p>\n<p>Tabulka je jednodu\u0161e vizu\u00e1ln\u00edm n\u00e1strojem \u2013 postup vy\u017eaduje pouze n\u00e1soben\u00ed pravd\u011bpodobnost\u00ed na ka\u017ed\u00e9m kroku. To znamen\u00e1, \u017ee se m\u016f\u017eete d\u00edvat daleko do budoucnosti s jednou v\u00fdhradou: p\u0159edpokl\u00e1d\u00e1me, \u017ee \u0161ance vstoupit do m\u00edstnosti zcela z\u00e1vis\u00ed na aktu\u00e1ln\u00ed m\u00edstnosti. To se naz\u00fdv\u00e1 Markovsk\u00fdm vlastnictv\u00edm (Markov Property) \u2013 budouc\u00ed stav z\u00e1vis\u00ed pouze na p\u0159\u00edtomn\u00e9m. Ale nen\u00ed to stoprocentn\u011b p\u0159esn\u00e9. Hr\u00e1\u010di mohou m\u011bnit rozhodnut\u00ed v z\u00e1vislosti na dal\u0161\u00edch faktorech: \u00farove\u0148 zdrav\u00ed nebo mno\u017estv\u00ed munice. Proto\u017ee tyto hodnoty neza\u0159azujeme, na\u0161e p\u0159edpov\u011bdi budou m\u00e9n\u011b p\u0159esn\u00e9.<\/p>\n<h3>N-Gramy<\/h3>\n<p>\nA co takov\u00fd p\u0159\u00edklad s bojem a p\u0159edpov\u011bd\u00ed komba \u00fader\u016f hr\u00e1\u010de? Stejn\u00e9! Ale m\u00edsto jednoho stavu nebo ud\u00e1losti budeme zkoumat cel\u00e9 sekvence, kter\u00e9 tvo\u0159\u00ed kombina\u010dn\u00ed \u00fader.<\/p>\n<p>Jedn\u00edm ze zp\u016fsob\u016f, jak to ud\u011blat, je uchov\u00e1vat ka\u017ed\u00fd vstup (nap\u0159\u00edklad Kick, Punch nebo Block) v bufferu a zaznamenat cel\u00fd buffer jako ud\u00e1lost. Tak\u017ee hr\u00e1\u010d opakovan\u011b stiskne Kick, Kick, Punch, aby pou\u017eil \u00fatok SuperDeathFist, syst\u00e9m AI uchov\u00e1v\u00e1 v\u0161echny vstupy v bufferu a pamatuje si posledn\u00ed t\u0159i, kter\u00e9 byly pou\u017eity na ka\u017ed\u00e9m kroku.<\/p>\n<p><img decoding=\"async\" alt=\"Jak vytvo\u0159it hern\u00ed AI: p\u0159\u00edru\u010dka pro za\u010d\u00e1te\u010dn\u00edky\" src=\"\/wp-content\/uploads\/2019\/11\/9a95226ae155dca5e45a66d4440f3cd4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Tu\u010dn\u011b zv\u00fdrazn\u011bny jsou \u0159\u00e1dky, kdy hr\u00e1\u010d spou\u0161t\u00ed \u00fatok SuperDeathFist.)<\/p>\n<p>AI uvid\u00ed v\u0161echny mo\u017enosti, kdy hr\u00e1\u010d zvolil Kick, n\u00e1sledovan\u00e9 dal\u0161\u00edm Kick, a pak si v\u0161imne, \u017ee dal\u0161\u00ed vstup je v\u017edy Punch. To umo\u017en\u00ed agentovi p\u0159edpov\u011bd\u011bt kombina\u010dn\u00ed \u00fader SuperDeathFist a zablokovat ho, pokud to bude mo\u017en\u00e9.<\/p>\n<p>Tyto sekvence ud\u00e1lost\u00ed se naz\u00fdvaj\u00ed N-gramy (N-grams), kde N je po\u010det uchov\u00e1van\u00fdch prvk\u016f. V p\u0159edchoz\u00edm p\u0159\u00edkladu to byla 3-grama (trigram), co\u017e znamen\u00e1: prvn\u00ed dv\u011b polo\u017eky se pou\u017e\u00edvaj\u00ed k p\u0159edpov\u011bdi t\u0159et\u00ed. Odpov\u00eddaj\u00edc\u00edm zp\u016fsobem v 5-gram\u011b prvn\u00ed \u010dty\u0159i polo\u017eky p\u0159edpov\u00eddaj\u00ed p\u00e1tou a tak d\u00e1le.<\/p>\n<p>V\u00fdvoj\u00e1\u0159 mus\u00ed pe\u010dliv\u011b vyb\u00edrat velikost N-gram\u016f. Men\u0161\u00ed \u010d\u00edslo N vy\u017eaduje m\u00e9n\u011b pam\u011bti, ale tak\u00e9 uchov\u00e1v\u00e1 m\u00e9n\u011b historie. Nap\u0159\u00edklad 2-grama (bigram) by zaznamen\u00e1vala Kick, Kick nebo Kick, Punch, ale nemohla by uchov\u00e1vat Kick, Kick, Punch, tak\u017ee AI by na kombinaci SuperDeathFist nereagovalo.<\/p>\n<p>Na druhou stranu, v\u011bt\u0161\u00ed \u010d\u00edsla vy\u017eaduj\u00ed v\u00edce pam\u011bti a AI se bude slo\u017eit\u011bji u\u010dit, proto\u017ee se objev\u00ed mnohem v\u00edce mo\u017en\u00fdch variant. Pokud m\u00e1te t\u0159i mo\u017en\u00e9 vstupy Kick, Punch nebo Block, a pou\u017eili jsme 10-gramu, vyjde to na p\u0159ibli\u017en\u011b 60 tis\u00edc r\u016fzn\u00fdch variant.<\/p>\n<p>Model bigramu je jednoduch\u00fd Markov\u016fv \u0159et\u011bzec \u2014 ka\u017ed\u00e1 dvojice \u201eminul\u00fd stav \/ sou\u010dasn\u00fd stav\u201c je bigram, a na z\u00e1klad\u011b prvn\u00edho m\u016f\u017eete p\u0159edpov\u011bd\u011bt druh\u00fd stav. 3-gramy a v\u011bt\u0161\u00ed N-gramy lze tak\u00e9 pova\u017eovat za Markovy \u0159et\u011bzce, kde v\u0161echny prvky (krom\u011b posledn\u00edho v N-gramu) dohromady tvo\u0159\u00ed prvn\u00ed stav, a posledn\u00ed prvek je druh\u00fd. P\u0159\u00edklad s bojem ukazuje \u0161anci p\u0159echodu ze stavu Kick a Kick do stavu Kick a Punch. Pokud postupujeme tak, \u017ee n\u011bkolik z\u00e1znam\u016f o vstupn\u00ed historii pova\u017eujeme za jednu jednotku, v podstat\u011b p\u0159ev\u00e1d\u00edme vstupn\u00ed sekvenci na \u010d\u00e1st celku. To n\u00e1m d\u00e1v\u00e1 Markovskou vlastnost, kter\u00e1 umo\u017e\u0148uje pou\u017e\u00edvat Markovy \u0159et\u011bzce k p\u0159edpov\u011bdi n\u00e1sleduj\u00edc\u00edho vstupu a uh\u00e1dnout, kter\u00fd combo pohyb bude n\u00e1sleduj\u00edc\u00ed.<\/p>\n<h2>Z\u00e1v\u011br<\/h2>\n<p>\nHovo\u0159ili jsme o nejb\u011b\u017en\u011bj\u0161\u00edch n\u00e1stroj\u00edch a p\u0159\u00edstupech v oblasti um\u011bl\u00e9 inteligence. Tak\u00e9 jsme probrali situace, ve kter\u00fdch je t\u0159eba je aplikovat, a kde jsou zvl\u00e1\u0161\u0165 u\u017eite\u010dn\u00e9. <\/p>\n<p>To by m\u011blo sta\u010dit k pochopen\u00ed z\u00e1kladn\u00edch aspekt\u016f hern\u00ed AI. Ale samoz\u0159ejm\u011b to nen\u00ed zdaleka v\u0161echno. Mezi m\u00e9n\u011b popul\u00e1rn\u00ed, ale stejn\u011b \u00fa\u010dinn\u00e9 metody pat\u0159\u00ed:<\/p>\n<ul>\n<li>algoritmy optimalizace, v\u010detn\u011b stoup\u00e1n\u00ed po kopc\u00edch, gradientn\u00edho sestupu a genetick\u00fdch algoritm\u016f<\/li>\n<li>sout\u011b\u017en\u00ed vyhled\u00e1vac\u00ed\/pl\u00e1novac\u00ed algoritmy (minimax a alpha-beta pruning)<\/li>\n<li>metody klasifikace (perceptrony, neuronov\u00e9 s\u00edt\u011b a stroje podp\u016frn\u00fdch vektor\u016f)<\/li>\n<li>syst\u00e9my pro zpracov\u00e1n\u00ed vn\u00edm\u00e1n\u00ed a pam\u011bti agent\u016f<\/li>\n<li>architektonick\u00e9 p\u0159\u00edstupy k AI (hybridn\u00ed syst\u00e9my, podmno\u017einy architektur a dal\u0161\u00ed zp\u016fsoby p\u0159ekr\u00fdv\u00e1n\u00ed AI syst\u00e9m\u016f)<\/li>\n<li>n\u00e1stroje pro animaci (pl\u00e1nov\u00e1n\u00ed a synchronizace pohybu)<\/li>\n<li>faktory v\u00fdkonu (\u00farove\u0148 detailu, algoritmy anytime a timeslicing)<\/li>\n<\/ul>\n<p>\nInternetov\u00e9 zdroje na toto t\u00e9ma:<\/p>\n<p>1. Na GameDev.net je <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gamedev.net\/articles\/programming\/artificial-intelligence\/\">sekce s \u010dl\u00e1nky a tutori\u00e1ly o AI<\/a><\/noindex>, a tak\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gamedev.net\/forums\/forum\/6-artificial-intelligence\/\">forum<\/a><\/noindex>.<br \/>\n2. <noindex><a rel=\"nofollow\" href=\"http:\/\/aigamedev.com\/\">AiGameDev.com<\/a><\/noindex> obsahuje mnoho prezentac\u00ed a \u010dl\u00e1nk\u016f o \u0161irok\u00e9m spektru souvisej\u00edc\u00edch s v\u00fdvojem hern\u00ed AI.<br \/>\n3. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gdcvault.com\/\">The GDC Vault<\/a><\/noindex> obsahuje t\u00e9mata ze summitu GDC AI, z nich\u017e mnoh\u00e9 jsou k dispozici zdarma.<br \/>\n4. U\u017eite\u010dn\u00e9 materi\u00e1ly lze tak\u00e9 naj\u00edt na webu <noindex><a rel=\"nofollow\" href=\"http:\/\/gameai.com\/\">AI Game Programmers Guild<\/a><\/noindex>.<br \/>\n5. Tommy Thompson, v\u00fdzkumn\u00edk AI a v\u00fdvoj\u00e1\u0159 her, zve\u0159ej\u0148uje videa na YouTube kan\u00e1lu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/user\/tthompso\">AI and Games<\/a><\/noindex> s vysv\u011btlen\u00edm a zkoum\u00e1n\u00edm AI v komer\u010dn\u00edch hr\u00e1ch.<\/p>\n<p>Knihy na toto t\u00e9ma:<\/p>\n<p>1. S\u00e9rie knih Game AI Pro p\u0159edstavuje sborn\u00edky kr\u00e1tk\u00fdch \u010dl\u00e1nk\u016f, kter\u00e9 vysv\u011btluj\u00ed, jak implementovat konkr\u00e9tn\u00ed funkce nebo jak \u0159e\u0161it specifick\u00e9 probl\u00e9my.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/go.gamedev.net\/?id=13722X707581&amp;xs=1&amp;isjs=1&amp;url=https%3A%2F%2Famzn.to%2F2KGoB8n&amp;xguid=f8ad586e5984991508efff4754027dbd&amp;xuuid=305451ecead59d76ca830fded0aab276&amp;xsessid=6ccb8b9fa3f10b478b65f7ed703a447b&amp;xcreo=0&amp;xed=0&amp;sref=https%3A%2F%2Fwww.gamedev.net%2Farticles%2Fprogramming%2Fartificial-intelligence%2Fthe-total-beginners-guide-to-game-ai-r4942%2F%3Fdo%3Dedit%26d%3D1%26id%3D4942%26csrfKey%3D7015c6d2c5c643e87baa74f8e5d2c094&amp;pref=https%3A%2F%2Fwww.gamedev.net%2Farticles%2Fprogramming%2Fartificial-intelligence%2Fthe-total-beginners-guide-to-game-ai-r4942%2F&amp;xtz=420&amp;jv=13.7.1&amp;bv=2.5.1\">Game AI Pro: Sesb\u00edran\u00e1 moudrost profesion\u00e1l\u016f v oblasti hern\u00ed AI<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"http:\/\/go.gamedev.net\/?id=13722X707581&amp;xs=1&amp;isjs=1&amp;url=https%3A%2F%2Famzn.to%2F2KFKyoe&amp;xguid=f8ad586e5984991508efff4754027dbd&amp;xuuid=305451ecead59d76ca830fded0aab276&amp;xsessid=6ccb8b9fa3f10b478b65f7ed703a447b&amp;xcreo=0&amp;xed=0&amp;sref=https%3A%2F%2Fwww.gamedev.net%2Farticles%2Fprogramming%2Fartificial-intelligence%2Fthe-total-beginners-guide-to-game-ai-r4942%2F%3Fdo%3Dedit%26d%3D1%26id%3D4942%26csrfKey%3D7015c6d2c5c643e87baa74f8e5d2c094&amp;pref=https%3A%2F%2Fwww.gamedev.net%2Farticles%2Fprogramming%2Fartificial-intelligence%2Fthe-total-beginners-guide-to-game-ai-r4942%2F&amp;xtz=420&amp;jv=13.7.1&amp;bv=2.5.1\">Game AI Pro 2: Sesb\u00edran\u00e1 moudrost profesion\u00e1l\u016f v oblasti hern\u00ed AI<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2KF4irS\">Game AI Pro 3: Sesb\u00edran\u00e1 moudrost profesion\u00e1l\u016f v oblasti hern\u00ed AI<\/a><\/noindex><\/p>\n<p>2. S\u00e9rie AI Game Programming Wisdom \u2014 p\u0159edch\u016fdce s\u00e9rie Game AI Pro. Obsahuje star\u0161\u00ed metody, ale v\u011bt\u0161ina z nich je i dnes relevantn\u00edch.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2ARFhKx\">AI Game Programming Wisdom 1<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2Mkv4eh\">AI Game Programming Wisdom 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2nnuYEh\">AI Game Programming Wisdom 3<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2ARFEEV\">AI Game Programming Wisdom 4<\/a><\/noindex><\/p>\n<p>3. <noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2AWKuRh\">Um\u011bl\u00e1 inteligence: Modern\u00ed p\u0159\u00edstup<\/a><\/noindex> \u2014 to je jedna z kl\u00ed\u010dov\u00fdch knih pro v\u0161echny, kte\u0159\u00ed cht\u011bj\u00ed porozum\u011bt obecn\u00e9 oblasti um\u011bl\u00e9 inteligence. Tato kniha nen\u00ed o hern\u00edm v\u00fdvoji \u2014 u\u010d\u00ed z\u00e1kladn\u00ed principy AI.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/pixonic\/blog\/428892\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e\u0431 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0435 \u0432 \u0438\u0433\u0440\u0430\u0445. \u0421 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 \u043f\u0440\u043e \u0418\u0418 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445, \u0430 \u0435\u0449\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0435\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041a\u0430\u043a, \u0433\u0434\u0435 \u0438 \u043a\u043e\u0433\u0434\u0430 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u2014 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f. \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c 35 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-52118","post","type-post","status-publish","format-standard","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e\u0431.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0418\u0418: \u0433\u0430\u0439\u0434 \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e\u0431.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T10:59:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Jak vytvo\u0159it hern\u00ed AI: pr\u016fvodce pro za\u010d\u00e1te\u010dn\u00edky | ProHoster","description":"Narazil jsem na zaj\u00edmav\u00fd materi\u00e1l o.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0418\u0418: \u0433\u0430\u0439\u0434 \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 | ProHoster","og:description":"\u041d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e\u0431.","og:url":"https:\/\/prohoster.info\/cs\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T21:00:00+00:00","article:modified_time":"2020-02-18T10:59:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52118","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 02:32:21","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:49:49","updated":"2026-01-24 02:32:21","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/52118","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=52118"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/52118\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=52118"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=52118"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=52118"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}