{"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\/et\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","title":{"rendered":"Kuidas luua m\u00e4ngu AI: algajate juhend","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/9e57175b233a104e0df98383b374eded.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSattusin huvitavale materjalile kunstlikust intelligentsist m\u00e4ngudes. Seal on selgitatud p\u00f5hiasju AI-st lihtsate n\u00e4idete abil, samuti on sees palju kasulikke t\u00f6\u00f6riistu ja meetodeid selle mugavaks arendamiseks ja projekteerimiseks. Kuidas, kus ja millal neid kasutada \u2014 ka see on olemas.<\/p>\n<p>Enamik n\u00e4iteid on kirjutatud pseudokoodis, seega ei ole s\u00fcgavad programmeerimisoskused vajalikud. Allpool on 35 lehek\u00fclge teksti koos piltide ja GIF-idega, nii et olge valmis.<\/p>\n<p>UPD. Vabandan, kuid oma t\u00f5lget sellest artiklist olen juba teinud Habras. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/PatientZero\/\">PatientZero<\/a><\/noindex>. Tema variandi lugemine on v\u00f5imalik. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/420219\/\">siin<\/a><\/noindex>, kuid mingi p\u00f5hjusel j\u00e4i artikkel minust m\u00f6\u00f6da (kasutasin otsingut, kuid midagi l\u00e4ks valesti). Kuna kirjutan m\u00e4nguarendusele p\u00fchendatud blogisse, otsustasin jagada oma t\u00f5lkevarianti j\u00e4lgijatele (m\u00f5ned kohad on mul vormistatud teisiti, m\u00f5ned \u2014 tahtlikult vahele j\u00e4etud arendajate soovitusel).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Mis on AI?<\/h2>\n<p>\nM\u00e4ngu AI keskendub sellele, milliseid toiminguid objekt peaks tegema, tuginedes olukorrale, milles see viibib. Seda nimetatakse sageli \u00abintelligentsete agentide\u00bb juhtimiseks, kus agent on m\u00e4ngu isik, transport, bot v\u00f5i m\u00f5nikord midagi veel abstraktsemat: terve r\u00fchm olendeid v\u00f5i isegi tsivilisatsioon. Igal juhul on see asi, mis peab n\u00e4gema oma keskkonda, v\u00f5tma selle p\u00f5hjal vastu otsuseid ja tegutsema vastavalt sellele. Seda nimetatakse Sense\/Think\/Act (Tunne\/M\u00f5tle\/Toimi) ts\u00fckliks:<\/p>\n<ul>\n<li>Tunne: agent leiab v\u00f5i saab teavet keskkonna asjade kohta, mis v\u00f5ivad m\u00f5jutada tema k\u00e4itumist (l\u00e4heduses olevad ohud, kogutavad esemed, huvitavad kohad uurimiseks).<\/li>\n<li>M\u00f5tle: agent otsustab, kuidas reageerida (kaalub, kas on piisavalt ohutu esemeid koguda v\u00f5i peaks ta enne v\u00f5itlema\/peituma).<\/li>\n<li>Toimi: agent t\u00e4idab eelneva otsuse teostamiseks tegevusi (alustab liikumist vaenlase v\u00f5i eseme suunas).<\/li>\n<li>\u2026n\u00fc\u00fcd on olukord muutunud tegelaste tegevuste t\u00f5ttu, seega kordub ts\u00fckkel uute andmete alusel.<\/li>\n<\/ul>\n<p>\nTehisintellekt keskendub enamasti Sense-etapile. N\u00e4iteks ises\u00f5itvad autod teevad teest pilte, \u00fchendavad need radaritelt ja lidaritelt saadud andmetega ning t\u00f5lgendavad neid. Selle tavaliselt teeb masin \u00f5pe, mis t\u00f6\u00f6tleb sisendandmeid ja annab neile t\u00e4henduse, tuues v\u00e4lja semantilist teavet, nagu n\u00e4iteks \"teie ees on veel \u00fcks auto 20 jala kaugusel\". Need on nii nimetatud klassifitseerimise probleemid.<\/p>\n<p>M\u00e4ngud ei vaja keerulist s\u00fcsteemi teabe v\u00e4ljav\u00f5tmiseks, kuna enamik andmeid on juba nende lahutamatu osa. Pole vajadust k\u00e4ivitada pildituvastusalgoritme, et tuvastada, kas vaenlane on ette tulles \u2014 m\u00e4ng teab seda juba ja edastab teavet otsuste tegemise protsessis. Seet\u00f5ttu on Sense-etapi osa sageli palju lihtsam kui Think ja Act.<\/p>\n<h2>M\u00e4ngu AI piirangud<\/h2>\n<p>\nTehisintellektil on m\u00f5ned piirangud, mida tuleb j\u00e4rgida:<\/p>\n<ul>\n<li>Tehisintellekti ei pea eelnevalt treenima nagu masin\u00f5ppe algoritmi. Pole m\u00f5tet kirjutada n\u00e4rviv\u00f5rgustikku arendamise ajal, et j\u00e4lgida k\u00fcmneid tuhandeid m\u00e4ngijaid ja \u00f5ppida parimat viisi nende vastu m\u00e4ngimiseks. Miks? Sest m\u00e4ng ei ole veel v\u00e4lja antud ja m\u00e4ngijaid pole.<\/li>\n<li>M\u00e4ng peab olema l\u00f5bus ja v\u00e4ljakutseid pakkuv, seega ei tohiks agentide leida parimat l\u00e4henemist inimeste vastu.<\/li>\n<li>Agendid peavad v\u00e4lja n\u00e4gema realistlikud, et m\u00e4ngijad tunneksid, nagu m\u00e4ngiks nad t\u00f5eliste inimeste vastu. Programm AlphaGo \u00fcletas inimese, kuid valitud sammud olid kaugel traditsioonilisest m\u00e4ngu m\u00f5istmisest. Kui m\u00e4ng kopeerib inimvastast, ei tohi seda tunnet olla. Algoritmi tuleb muuta, et see teeks usutavaid otsuseid, mitte ideaalseid.<\/li>\n<li>Tehisintellekt peab t\u00f6\u00f6tama reaalajas. See t\u00e4hendab, et algoritm ei saa pikka aega monopoliseerida protsessorit otsuste tegemiseks. Isegi 10 millisekundit selleks on liiga kaua, sest enamikule m\u00e4ngudest piisab, et t\u00e4ita kogu t\u00f6\u00f6tlemine ja minna j\u00e4rgmisele graafikakaadrile ajavahemikus 16 kuni 33 millisekundit.<\/li>\n<li>Ideaalne oleks, kui v\u00e4hemalt osa s\u00fcsteemist juhitaks andmete abil, et \"mitte-kodeerijad\" saaksid muudatusi teha ja et parandused toimuksid kiiremini.<\/li>\n<\/ul>\n<p>\nK\u00e4ime l\u00e4bi AI l\u00e4henemised, mis katavad kogu Sense\/Think\/Act ts\u00fcklit.<\/p>\n<h3>Aluste otsuste tegemine<\/h3>\n<p>\nAlustame k\u00f5ige lihtsamast m\u00e4ngust \u2014 Pong. Eesm\u00e4rk: liikuda platvormiga (paddle) nii, et pall p\u00f5rkuks sellelt tagasi, mitte ei lendaks m\u00f6\u00f6da. See on nagu tennis, kus kaotate, kui ei suuda palli tagasi l\u00fc\u00fca. Siin on AI-l suhteliselt kerge \u00fclesanne \u2014 otsustada, millises suunas platvormi liikuda.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/e1935d657b9f090bf60c365c21e8f92b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Tingimuslikud operaatorid<\/h3>\n<p>\nAI jaoks Pongis on k\u00f5ige ilmsem lahendus \u2014 p\u00fc\u00fcda alati platvormi palli alla paigutada.<\/p>\n<p>Lihtne algoritm selle jaoks, kirjutatud pseudokoodis:<\/p>\n<p><i>iga kaader\/uuendus, kui m\u00e4ng on k\u00e4imas:<br \/>\nkui pall on platvormi vasakul:<br \/>\n liikuda platform vasakule<br \/>\nkui pall on platvormi paremal:<br \/>\n liikuda platform paremale<\/i><\/p>\n<p>Kui platvorm liigub sama kiiresti kui pall, siis on see ideaalne algoritm AI jaoks Pongis. Ei ole vaja asju keerulisemaks ajada, kui andmeid ja v\u00f5imalikke tegevusi agendi jaoks pole liig palju.<\/p>\n<p>See l\u00e4henemine on nii lihtne, et kogu Sense\/Think\/Act ts\u00fckkel on vaevu tuntav. Kuid see on olemas:<\/p>\n<ul>\n<li>Sense'i osa sisaldub kahes tingimuslikus operaatoris. M\u00e4ng teab, kus pall ja platvorm asuvad, seega p\u00f6\u00f6rdub AI selle teabe saamiseks m\u00e4ngu poole. <\/li>\n<li>Think'i osa kuulub samuti kahte tingimuslikku operaatorisse. Need sisaldavad kahte lahendust, mis antud juhul on omavahel v\u00e4listavad. Tulemuseks valitakse \u00fcks kolmest tegevusest \u2014 liikuda platvormiga vasakule, liikuda paremale v\u00f5i mitte midagi teha, kui see on juba \u00f5igesti paigutatud.<\/li>\n<li>Act'i osa sisaldub operaatorites Move Paddle Left ja Move Paddle Right. S\u00f5ltuvalt m\u00e4ngu disainist v\u00f5ivad need liikuda platvormi kohe v\u00f5i teatud kiirusel. <\/li>\n<\/ul>\n<p>\nSelliseid l\u00e4henemisi kutsutakse reageerivateks \u2014 olemas on lihtne reeglite kogum (antud juhul koodis olevad tingimuslikud operaatorid), mis reageerivad maailma hetkeseisule ja tegutsevad.<\/p>\n<h3>Otsustuspuu<\/h3>\n<p>\nN\u00e4ide m\u00e4ngust Pong on tegelikult vormiline AI kontseptsioon, mida nimetatakse otsustuspuuks. Algoritm l\u00e4bib selle, et j\u00f5uda \u00ableht\u00bb \u2014 otsus selle kohta, milline tegevus ette v\u00f5tta.<\/p>\n<p>Tehkem otsustuspuu algoritmi grafika jaoks plokkskeem:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/d3b7290ba93144967cd849416cd5eef3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIga puu osa nimetatakse node (s\u00f5lm) \u2014 AI kasutab graafiteooriat selliste struktuuride kirjeldamiseks. On kaks t\u00fc\u00fcpi s\u00f5lmi:<\/p>\n<ul>\n<li>Otsustuss\u00f5lmed: valik kahe alternatiivi vahel, mis p\u00f5hineb mingi tingimuse kontrollimisel, kus iga alternatiiv on esitatud eraldi s\u00f5lmena.<\/li>\n<li>L\u00f5pp-s\u00f5lmed: tegevus, mida on vaja teostada, esindades l\u00f5plikku otsust.<\/li>\n<\/ul>\n<p>\nAlgoritm algab puu esimese s\u00f5lmega (\u201ejuurega\u201c). Ta kas teeb otsuse, millisesse alam\u00f5lgu liikuda, v\u00f5i t\u00e4idab s\u00f5lmes sisalduva tegevuse ning l\u00f5petab selle.<\/p>\n<p>Mis on siis eeliseid, kui otsuste puu teeb sama t\u00f6\u00f6d, mis if-lause eelnevas osas? Siin on \u00fchine s\u00fcsteem, kus igal otsusel on \u00fcksainus tingimus ja kaks v\u00f5imalikku tulemust. See v\u00f5imaldab arendajal luua AI andmete p\u00f5hjal, mis esindavad otsuseid puus, v\u00e4ltides selle k\u00f5vaketastamist. Kujutame seda tabelina:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/6875293a60ff9d0efa26fb5e1aa4b21c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKoodipoolest saate s\u00fcsteemi stringide lugemiseks. Looge iga\u00fche jaoks s\u00f5lm, \u00fchendage otsustusloogika teise veeru alusel ja alam\u00f5lged kolmanda ja neljanda veeru alusel. Teil on endiselt vaja programmeerida tingimused ja tegevused, kuid n\u00fc\u00fcd on m\u00e4ngu struktuur keerukam. Siin lisate t\u00e4iendavaid otsuseid ja tegevusi ning seej\u00e4rel konfigureerite kogu AI, lihtsalt muutes puu m\u00e4\u00e4ratluse tekstifaili. Edasi andsite faili m\u00e4ngudisainerile, kes suudab k\u00e4itumist muuta ilma m\u00e4ngu uuesti kompileerimata ja koodi muutmata.<\/p>\n<p>Otsuste puud on v\u00e4ga kasulikud, kui need konstrueeritakse automaatselt suure n\u00e4idiste kogumi p\u00f5hjal (n\u00e4iteks kasutades ID3 algoritmi). See teeb neist t\u00f5husad ja k\u00f5rge j\u00f5udlusega t\u00f6\u00f6riistad olukordade klassifitseerimiseks saadud andmete p\u00f5hjal. Siiski \u00fcletame lihtsa s\u00fcsteemi agentide tegevuste valimiseks.<\/p>\n<h3>Skenaariumid<\/h3>\n<p>\nOlemesime otsuste puu s\u00fcsteemi, mis kasutas ettevalmistatud tingimusi ja tegevusi. Inimesel, kes disainib AI-d, on v\u00f5imalik puu korraldada, nagu soovib, kuid ta peab endiselt toetuma koodijale, kes k\u00f5ik selle programmeeris. Mis siis, kui me v\u00f5iksime anda disainerile t\u00f6\u00f6riistad oma tingimuste v\u00f5i tegevuste loomiseks?<\/p>\n<p>Et programmeerijal ei oleks vaja kirjutada koodi tingimuste Is Ball Left Of Paddle ja Is Ball Right Of Paddle jaoks, saab ta luua s\u00fcsteemi, kus disainer kirjutab tingimused nende v\u00e4\u00e4rtuste kontrollimiseks. Siis n\u00e4evad otsuste puu andmed v\u00e4lja nii:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/8e77f7c3410d097e8b7d8e1209355cc6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00f5him\u00f5tteliselt on see sama, mis esimeses tabelis, kuid lahendustes on oma kood, mis on veidi sarnane if-lause tingimuslikule osale. Koodipoolest loetaks seda teises veerus otsuste s\u00f5lmpunktide jaoks, kuid selle asemel, et otsida konkreetset tingimust t\u00e4itmiseks (Kas pall on paddlest vasakul), hindab see tingimuslikku avaldist ja tagastab vastavalt true v\u00f5i false. See toimub skriptikeele Lua v\u00f5i Angelscript abil. Nende abil saab arendaja m\u00e4ngus olevaid objekte (pall ja paddle) v\u00f5tta ning luua muutujaid, mis on skriptis kasutatavad (ball.position). Lisaks on skriptikeel lihtsam kui C++. See ei n\u00f5ua t\u00e4ielikku kompilatsioonifaasi, seega sobib see ideaalselt m\u00e4ngu loogika kiireks kohandamiseks ja v\u00f5imaldab \"koodita\" inimestel ise vajalikke funktsioone luua.<\/p>\n<p>Antud n\u00e4ites kasutatakse skriptikeelt ainult tingimuslike avalduste hindamiseks, kuid seda saab kasutada ka tegevuste jaoks. N\u00e4iteks andmed Move Paddle Right v\u00f5ivad muutuda skriptitegevuseks (ball.position.x += 10). Seega m\u00e4\u00e4ratakse tegevus ka skripti kaudu, ilma et oleks vaja programmeerida Move Paddle Right.<\/p>\n<p>V\u00f5ib minna veel kaugemale ja kirjutada kogu otsustuspuu skriptikeeles. See oleks kood, mis koosneb rangelt programmeeritud (hardcoded) tingimuslikest operaatoritest, kuid nad asuvad v\u00e4listes skriptifailides, mis t\u00e4hendab, et neid saab muuta ilma terve programmi \u00fcmberkompileerimiseta. Sageli on v\u00f5imalik skriptifaili muuta otse m\u00e4ngu ajal, et kiiresti testida erinevaid tehisintellekti reaktsioone.<\/p>\n<h3>S\u00fcndmustele reageerimine<\/h3>\n<p>\n\u00dclaltoodud n\u00e4ited sobivad ideaalselt Pongile. Need k\u00e4ivitavad pidevalt ts\u00fckli Sense\/Think\/Act ja tegutsevad viimase maailma oleku p\u00f5hjal. Kuid keerulisemates m\u00e4ngudes peab reageerima eraldi s\u00fcndmustele, mitte hindama k\u00f5ike korraga. Pong on sellisel juhul juba halb n\u00e4ide. Valime teise. <\/p>\n<p>Kujutage ette tulistamism\u00e4ngu, kus vaenlased on j\u00f5hkrad, kuni m\u00e4rkavad m\u00e4ngijat, p\u00e4rast mida tegutsevad s\u00f5ltuvalt oma \"spetsialiseerumusest\": m\u00f5ned jooksevad \"r\u00fcndama\", teised r\u00fcndavad kaugelt. See on endiselt p\u00f5hjalik reageerimiss\u00fcsteem \u2014 \"kui m\u00e4ngija on n\u00e4htud, siis tee midagi\" \u2014 kuid seda saab loogiliselt jagada s\u00fcndmuseks Player Seen (m\u00e4ngija n\u00e4htud) ja reaktsiooniks (vali vastus ja teosta see).<\/p>\n<p>See on tagasi meie Sense\/Think\/Act ts\u00fcklisse. Me saame kodeerida Sense-osa, mis iga kaadri l\u00f5ikes kontrollib, kas AI n\u00e4eb m\u00e4ngijat. Kui ei \u2014 siis ei juhtu midagi, aga kui n\u00e4eb, siis luuakse s\u00fcndmus Player Seen. Koodil on eraldi sektsioon, kus on \u00f6eldud: \u201ekui s\u00fcndmus Player Seen toimub, tee \u201c, kus  \u2014 on vastus, mis on vajalik osadele Think ja Act viitamiseks. Nii seadistate reageerimised s\u00fcndmusele Player Seen: \u201er\u00fcnnaku\u201c tegelase puhul \u2014 ChargeAndAttack, ja snaiperi puhul \u2014 HideAndSnipe. Need seosed saab luua andmefailis kiireks redigeerimiseks ilma vajaduseta uuesti kompileerida. Siin v\u00f5ib samuti kasutada skriptikeelt.<\/p>\n<h2>K\u00f6itvate otsuste vastuv\u00f5tmine<\/h2>\n<p>\nKuigi lihtsad reaktsioonis\u00fcsteemid on v\u00e4ga t\u00f5husad, on palju olukordi, kus neid on liiga v\u00e4he. M\u00f5nikord tuleb teha erinevaid otsuseid, mis p\u00f5hinevad sellel, mida agent sel hetkel teeb, kuid seda esitada tingimusena on keeruline. M\u00f5nikord on liiga palju tingimusi, et neid t\u00f5husalt esitada otsuste puus v\u00f5i skriptis. M\u00f5nikord tuleb olukorra muutust eelnevalt hinnata, enne kui j\u00e4rgmise sammu otsustamiseks otsus tehakse. Nende probleemide lahendamiseks on vajalikud keerukamad l\u00e4henemisviisid.<\/p>\n<h3>L\u00f5ppfaasi masin<\/h3>\n<p>\nL\u00f5ppfaasi masin ehk FSM (l\u00f5plik automaat) on viis \u00f6elda, et meie agent asub praegu \u00fches v\u00f5imalikus seisundis ning et ta saab \u00fchest seisundist teise liikuda. Selliseid seisundeid on piiratult \u2014 seet\u00f5ttu nimi. Parim n\u00e4ide igap\u00e4evaelust on liiklusvalgud. Erinevates kohtades on erinevad valgustusj\u00e4rjekorrad, kuid p\u00f5him\u00f5te on sama \u2014 iga seisund esindab midagi (seisa, mine jne). Telesaam on alati vaid \u00fches seisundis igal hetkel ja liigub \u00fchest teiseni lihtsate reeglite alusel.<\/p>\n<p>NPC-dega m\u00e4ngudes on sarnane lugu. N\u00e4iteks v\u00f5tame vahti, kellel on sellised seisundid:<\/p>\n<ul>\n<li>Patrullimine (Patrolling).<\/li>\n<li>R\u00fcnnak (Attacking).<\/li>\n<li>P\u00f5genemine (Fleeing).<\/li>\n<\/ul>\n<p>\nJa sellised tingimused, mille alusel tema seisund muutub:<\/p>\n<ul>\n<li>Kui vaht n\u00e4eb vaenlast, r\u00fcndab ta.<\/li>\n<li>Kui vaht r\u00fcndab, aga ei n\u00e4e vaenlast enam, naaseb ta patrullimisele.<\/li>\n<li>Kui vaht r\u00fcndab, aga on t\u00f5siselt haavata saanud, p\u00f5geneb ta.<\/li>\n<\/ul>\n<p>\nSamuti saab kirjutada if-operat\u00f6\u00f6ri seisundimuutuja valvuri jaoks ja erinevaid kontrolle: kas l\u00e4heduses on vaenlane, milline on NPC elutase jne. Lisame veel m\u00f5ned seisundid:<\/p>\n<ul>\n<li>T\u00f6\u00f6tus (Idling) \u2014 patrullide vahel.<\/li>\n<li>Otsimine (Searching) \u2014 kui m\u00e4rgatud vaenlane on varjunud.<\/li>\n<li>Abi palumine (Finding Help) \u2014 kui vaenlane on m\u00e4rgatud, kuid liiga tugev, et temaga \u00fcksi v\u00f5idelda.<\/li>\n<\/ul>\n<p>\nIga\u00fche valik on piiratud \u2014 n\u00e4iteks valvur ei l\u00e4he otsima varjunud vaenlast, kui tal on madal tervis.<\/p>\n<p>L&otilde;ppkokkuv&otilde;ttes v&otilde;ib tohutu &quot;kui&quot;-list olla liiga t&uuml;likas, seet&otilde;ttu tuleks formaliseerida meetod, mis v&otilde;imaldab meil meeles pidada olekuid ja &uuml;leminekuid olekute vahel. &lt;x \u0438 y, \u043d\u043e \u043d\u0435 z&gt;, siis &lt;p&gt;Selleks arvestame k&otilde;ikide olekute ja iga oleku all loetleme k&otilde;ik &uuml;leminekud teistesse olekutesse koos nende jaoks vajalike tingimustega.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/ba4c401aa20de3d22d2478cba5a4b1ec.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on olekute \u00fcleminekutabel \u2014 kompleksne viis FSM-i esitlemiseks. Joonistame diagrammi ja saame \u00fclevaate sellest, kuidas NPC k\u00e4itumine muutub.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/b4182359983cf573872dacc575af13dc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDiagramm peegeldab selle agendi otsuste tegemise olemust oleva olukorra p\u00f5hjal. Lisaks n\u00e4itab iga nooleke \u00fcleminekut olekute vahel, kui tingimus, mille k\u00f5rval see asub, on t\u00f5ene.<\/p>\n<p>Iga v\u00e4rskenduse korral kontrollime agendi praegust olekut, vaatame \u00fcleminekutel nimekirja ja kui \u00fclemineku tingimused on t\u00e4idetud, omandab ta uue oleku. N\u00e4iteks kontrollitakse iga kaadriga, kas 10-sekundiline taimer on aegunud, ja kui jah, siis liigub valvur olekust Idling olekusse Patrolling. Samamoodi kontrollib olek Attacking agendi tervist \u2014 kui see on madal, siis liigub ta olekusse Fleeing.<\/p>\n<p>See on \u00fcleminekute t\u00f6\u00f6tlemine olekute vahel, kuid kuidas on lood k\u00e4itumisega, mis on seotud konkreetsete olekute endiga? Mis puudutab k\u00e4itumise tegelikku rakendamist konkreetse oleku jaoks, siis tavaliselt on olemas kaks t\u00fc\u00fcpi \"kronk\":<\/p>\n<ul>\n<li>Tegevused, mida me perioodiliselt teostame praeguses olekus.<\/li>\n<li>Tegevused, mida me teeme, kui liigume \u00fchest olekust teise.<\/li>\n<\/ul>\n<p>\nN\u00e4ited esimese t\u00fc\u00fcbi jaoks. Oleku Patrolling ajal liigub agent iga kaadriga patrullimise marsruudil. Oleku Attacking ajal p\u00fc\u00fcab ta iga kaadriga alustada r\u00fcnnakut v\u00f5i minna olekusse, kui see on v\u00f5imalik.<\/p>\n<p>Teise t\u00fc\u00fcbi puhul vaatame \u00fcleminekut: \"kui vaenlane on n\u00e4htav ja vaenlane on liiga tugev, siis minna olekusse Finding Help. Agent peab valima, kuhu minna abi saama, ja salvestama selle teabe, et olek Findings Help teaks, kuhu p\u00f6\u00f6rduda. Kui abi on leitud, naaseb agent tagasi olekusse Attacking. Selle hetkeni tahab ta teavitada liitlast ohust, mist\u00f5ttu v\u00f5ib tekkida tegevus NotifyFriendOfThreat.<\/p>\n<p>Ja j\u00e4lle saame sellele s\u00fcsteemile l\u00e4heneda Sensori\/M\u00f5tle\/K\u00e4itu ts\u00fckli kaudu. Sense v\u00e4ljendub andmetes, mida kasutatakse \u00fclemineku loogikas. Think - \u00fcleminekutes, mis on igas olekus saadaval. Ja Act toimub tegevustega, mis toimuvad perioodiliselt oleku sees v\u00f5i \u00fcleminekute vahel.<\/p>\n<p>M\u00f5nikord v\u00f5ib \u00fcleminekutingimuste pidev k\u00fcsitlemine olla kulukas. N\u00e4iteks, kui iga agent teeb igas kaadris keerulisi arvutusi, et m\u00e4\u00e4rata, kas nad n\u00e4evad vaenlasi ja m\u00f5ista, kas on v\u00f5imalik liikuda olekust Patrolling olekusse Attacking \u2014 kulutab see palju protsessori aega. <\/p>\n<p>Olulisi maailma olekumuutusi saab k\u00e4sitleda s\u00fcndmustena, mida t\u00f6\u00f6deldakse nende ilmumise hetkel. Selle asemel, et FSM kontrolliks iga kaader \u00fclemineku tingimust, \"kas mu agent n\u00e4eb m\u00e4ngijat?\", saab seadistada eraldi s\u00fcsteemi, et teostada kontrolle v\u00e4hem tihti (n\u00e4iteks 5 korda sekundis). Tulemuseks on Player Seen, kui kontroll l\u00e4heb l\u00e4bi. <\/p>\n<p>See edastatakse FSM-ile, mis peab n\u00fc\u00fcd liikuma olekusse Player Seen s\u00fcndmus on saadud ja reageerima vastavalt. L\u00f5plik k\u00e4itumine on sama, v\u00e4lja arvatud peaaegu m\u00e4rkamatuna viivituse enne vastust. Kuid j\u00f5udlus on paranenud, sest osa Sense'ist on eraldatud eraldi programmiosasse.<\/p>\n<h3>Hierarhiline l\u00f5ppolekumasin<\/h3>\n<p>\nSiiski ei ole suurte FSM-ide k\u00e4sitlemine alati mugav. Kui soovime r\u00fcnnaku olekut laiendada, asendades selle eraldi MeleeAttacking (l\u00e4hi\u1ec1u) ja RangedAttacking (kaugtegevus), peame muutma \u00fcleminekud k\u00f5igist teistest olukordadest, mis viivad olekusse Attacking (praegused ja tulevased).<\/p>\n<p>Olete kindlasti m\u00e4rganud, et meie n\u00e4ites on palju dubleeritud \u00fcleminekuid. Enamik \u00fcleminekuid Idling (ootere\u017eiim) ja Patrolling (patrullimine) olekute vahel on identsed. Oleks hea mitte korduda, eriti kui lisame rohkem sarnaseid olekuid. On m\u00f5istlik grupeerida Idling ja Patrolling \u00fchise sildiga \u201emittes\u00f5jaline\u201d, kus on ainult \u00fcks \u00fchine \u00fcleminekute komplekt s\u00f5jaliste seisundite juurde. Kui esitame selle sildi olekuna, siis muutuvad Idling ja Patrolling alamolekuteks. N\u00e4ide eraldi \u00fcleminekute tabeli kasutamisest uue mittes\u00f5jalise alamoleku jaoks:<\/p>\n<p><i>P\u00f5hiolekud:<\/i><br \/>\n<img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/d86dd918acbe81b9bf22c2fb34aecee3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<i>M\u00f5lemad olekud on lahinguv\u00e4ljast v\u00e4ljas:<\/i><br \/>\n<img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/9d5bc2053010a32c5f68d7f0192c04ed.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa diagrammi kujul:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/0ccf95ecafa9ce2a6ea5b5b9833ddc4f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on sama s\u00fcsteem, kuid uue mittes\u00f5jalise olekuga, mis sisaldab Idling ja Patrolling olekuid. Iga olek, millel on alamolekudega FSM (l\u00f5ppautomaat), (ja need alamolekud sisaldavad omakorda oma FSM-e \u2014 ja nii edasi, kui palju vaja), loob meile Hierarchical Finite State Machine ehk HFSM (hierarhiline l\u00f5ppautomaat). Mittes\u00f5jalise oleku grupeerimise kaudu l\u00f5ikame me v\u00e4lja hulga \u00fcleliigseid \u00fcleminekuid. Sama saame teha mistahes uute olekute puhul, millel on \u00fchised \u00fcleminekud. N\u00e4iteks, kui tulevikus laiendame r\u00fcndamise olekut MeleeAttacking (l\u00e4hedalt r\u00fcndamine) ja MissileAttacking (projektilli r\u00fcndamine) olekute juurde, siis need muutuvad alamolekuteks, mis \u00fcksteise vahel \u00fcleminevad s\u00f5ltuvalt vahemaa kaugusest vaenlase juurde ja laskemoona olemasolust. L\u00f5ppkokkuv\u00f5ttes saab keerulisi k\u00e4itumismudeleid ja allmudeleid esitada minimaalse dubleerimisega.<\/p>\n<h3>K\u00e4itumiste puu<\/h3>\n<p>\nHFSM-i kaudu luuakse keerulisi k\u00e4itumiste kombinatsioone lihtsalt. Siiski on \u00fcks v\u00e4ike raskus, et \u00fclemisreeglite n\u00e4ol on otsuste tegemine tihedalt seotud praeguse olekuga. Paljudes m\u00e4ngudes on see just see, mida vajate. Ja olekute hierarhia hoolikas kasutamine v\u00f5ib v\u00e4hendada \u00fcleminekute kordusi. Kuid m\u00f5nikord on vaja reegleid, mis t\u00f6\u00f6tavad s\u00f5ltumatult olekust, milles te olete, v\u00f5i mis kehtivad peaaegu igas olekus. N\u00e4iteks, kui agendi tervis langeb 25%-ni, tahate, et ta jooksuks, olenemata sellest, kas ta on lahingus, tegutseb v\u00f5i vestleb \u2014 peate seda tingimust lisama igasse olekusse. Kui teie disainer hiljem soovib madala tervise piiri muuta 25%-lt 10%-le, tuleb sellega taas tegeleda.<\/p>\n<p>Ideaalis on vajalik s\u00fcsteem, kus otsuseid \"millises olekus olla\" tehakse v\u00e4ljaspool neid olekuid, et muuta vaid \u00fches kohas ja mitte puutuda \u00fcleminekutingimusi. Siin tulevad m\u00e4ngu k\u00e4itumispuud.<\/p>\n<p>On mitu v\u00f5imalust nende rakendamiseks, kuid nende p\u00f5hiolemus on umbes sama ja sarnaneb otsuste puudega: algoritm algab \"juure\" s\u00f5lmest, kus puud on s\u00f5lmed, mis esindavad kas otsuseid v\u00f5i tegevusi. T\u00f5si, siin on m\u00f5ned peamised erinevused:<\/p>\n<ul>\n<li>N\u00fc\u00fcd s\u00f5lmed tagastavad \u00fche kolmest v\u00e4\u00e4rtusest: Succeeded (kui t\u00f6\u00f6 on l\u00f5petatud), Failed (kui seda ei saa k\u00e4ivitada) v\u00f5i Running (kui see on endiselt k\u00e4imas ja l\u00f5plikku tulemust pole).<\/li>\n<li>Otsuse s\u00f5lmi pole enam kahe alternatiivi vahel valimiseks. Nende asemel on Decorator s\u00f5lmed, millel on \u00fcks t\u00fctars\u00f5lm. Kui nad Succeed, siis teevad nad oma ainukese t\u00fctars\u00f5lme.<\/li>\n<li>Tegevusi t\u00e4itvad s\u00f5lmed tagastavad v\u00e4\u00e4rtuse Running, et esindada k\u00e4imasolevaid tegevusi.<\/li>\n<\/ul>\n<p>\nSeda v\u00e4ikest s\u00f5lmede kogumit saab kombineerida, et luua palju keerukaid k\u00e4itumismudeleid. Kujutame ette HFSM valvurit eelnevas n\u00e4ites k\u00e4itumispuu kujul:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/5eaa5c725e4ada8285f16f95bb206d53.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelle struktuuriga ei tohiks olla selget \u00fcleminekut Idling\/Patrolling olekust r\u00fcndamise v\u00f5i m\u00f5ne muu oleku juurde. Kui vaenlane on n\u00e4htav ja tegelase elu on madal, peatub t\u00e4itmine Fleeing s\u00f5lmel, s\u00f5ltumata sellest, millisest s\u00f5lmest ta varem t\u00e4itis \u2014 Patrolling, Idling, Attacking v\u00f5i m\u00f5ni muu.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/e1c1dcc2055174aa7cfa846364b1709a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00e4itumispuud on keerulised \u2014 on palju viise nende koostamiseks, ja \u00f5ige kombinatsiooni leidmine dekoratoritest ja komposiit-s\u00f5lmest v\u00f5ib olla keeruline. Samuti on k\u00fcsimusi, kui tihti puud kontrollida \u2014 kas tahame l\u00e4bida seda iga osa v\u00f5i ainult siis, kui m\u00f5ni tingimus on muutunud? Kuidas hoida s\u00f5lmedega seotud olekut \u2014 kuidas teada, kas oleme olnud Idling olekus 10 sekundit v\u00f5i kuidas teada, millised s\u00f5lmed viimasel korral t\u00e4ideti, et \u00f5iget j\u00e4rjestust \u00f5igesti t\u00f6\u00f6delda?<\/p>\n<p>Sel p\u00f5hjusel on olemas palju rakendusi. N\u00e4iteks m\u00f5nes s\u00fcsteemis asendavad dekoratori s\u00f5lmed sisseehitatud dekoratoreid. Need hindavad puud uuesti dekoratori tingimuste muutumisel, aitavad liituda s\u00f5lmedega ja tagavad perioodilised v\u00e4rskendused.<\/p>\n<h3>Kasumip\u00f5hine s\u00fcsteem<\/h3>\n<p>\nM\u00f5nedel m\u00e4ngudel on palju erinevaid mehhanisme. Soovitav on, et need saaksid k\u00f5ik kasu lihtsatest ja \u00fcldistest \u00fcleminekureeglitest, kuid mitte tingimata t\u00e4ieliku k\u00e4itumispuu kujul. Selle asemel, et omada selget valikute kogumit v\u00f5i v\u00f5imalike tegevuste puu, on lihtsam \u00f5ppida k\u00f5ik tegevused ja valida hetkel sobivaim.<\/p>\n<p>Kasulikku p\u00f5hine s\u00fcsteem aitab siin. See on s\u00fcsteem, kus agendil on palju tegevusi ja ta valib ise, milline neist teostada, tuginedes iga\u00fche suhtelisele kasulikkusele. Kus kasulikkus on meelevaldne m\u00f5\u00f5t, kui oluline v\u00f5i soovitav on selle tegevuse teostamine agendi jaoks. <\/p>\n<p>K\u00e4itumise kasulikkust, mis p\u00f5hineb hetke olekul ja keskkonnal, saab agent igal ajal kontrollida ja valida sobivama teise oleku. See sarnaneb FSM-iga, v\u00e4lja arvatud sellega, et \u00fcleminekud m\u00e4\u00e4ratakse iga potentsiaalse oleku hindamise kaudu, sealhulgas praeguse. Pange t\u00e4hele, et valime \u00fclemineku jaoks k\u00f5ige kasulikuma tegevuse (v\u00f5i j\u00e4\u00e4me paigale, kui oleme selle juba teinud). Suurema mitmekesisuse nimel v\u00f5ib see olla kaalutud, kuid juhuslik valik v\u00e4ikese nimekirja hulgast.<\/p>\n<p>S\u00fcsteem m\u00e4\u00e4rab juhuslikud kasulikkuse v\u00e4\u00e4rtuste vahemikud - n\u00e4iteks, alates 0 (t\u00e4iesti soovimatu) kuni 100 (t\u00e4ielikult soovitav). Igal tegevusel on mitmed parameetrid, mis m\u00f5jutavad selle v\u00e4\u00e4rtuse arvutamist. Tagasi tulles meie n\u00e4ite juurde valvekoerast:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/085fb2c197bde93d78455d18e63c9c25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u00dcleminekud tegevuste vahel on ebamugavad - iga olek v\u00f5ib j\u00e4rgida mis tahes muud. Tegevuste prioriteedid on tagastatud kasulikkuse v\u00e4\u00e4rtustes. Kui vaenlane on n\u00e4htav ja see vaenlane on tugev, samas kui tegelase elu on madal, siis nii P\u00f5genemine kui ka Abiotsimine tagastavad k\u00f5rged mitte-null v\u00e4\u00e4rtused. Sellega arvestades on Abiotsimine alati k\u00f5rgem. Samuti ei tagasta mitte-s\u00f5jalised tegevused kunagi rohkem kui 50, seega on nad alati madalamad kui s\u00f5jalised. Seda tuleb arvestada tegevuste loomisel ja nende kasulikkuse arvutamisel.<\/p>\n<p>Meie n\u00e4ites tagastavad toimingud kas fikseeritud konstantsed v\u00e4\u00e4rtused v\u00f5i \u00fche kahest fikseeritud v\u00e4\u00e4rtusest. Realistlikum s\u00fcsteem eeldab, et tagastatakse hinnang pidevast v\u00e4\u00e4rtuste vahemikust. N\u00e4iteks toiming Fleeing tagastab k\u00f5rgemaid utiliteedi v\u00e4\u00e4rtusi, kui agendi tervis on madal, samas kui toiming Attacking tagastab madalamaid v\u00e4\u00e4rtusi, kui vaenlane on liiga tugev. Seet\u00f5ttu on toimingul Fleeing alati prioriteet toimingu Attacking ees olukordades, kus agent tunneb, et tal ei ole piisavalt tervist, et vastasega v\u00f5idelda. See v\u00f5imaldab muuta tegevuste prioriteete, tuginedes mis tahes hulgale kriteeriumidele, muutes sellise l\u00e4henemise paindlikumaks ja varieeruvamaks kui tegevuste puu v\u00f5i FSM.<\/p>\n<p>Igal toimingul on palju tingimusi programmi arvutamiseks. Need v\u00f5ib kirjutada skriptikeeles v\u00f5i seeria matemaatilisi valemeid. The Sims'is, mis modelleerib karakteri igap\u00e4evast rutiini, lisatakse t\u00e4iendav arvutustasand \u2014 agent saab rea 'motivatsioone', mis m\u00f5jutavad utiliteedi hindamisi. Kui karakter on n\u00e4ljane, siis aja jooksul muutub ta veelgi n\u00e4ljasemaks ja toime EatFood utiliteedi tulemus kasvab, kuni karakter t\u00e4idab selle, v\u00e4hendades oma n\u00e4lga ja tuues EatFood v\u00e4\u00e4rtuse tagasi nulli. <\/p>\n<p>Tegevuste valimise idee hindamiss\u00fcsteemi p\u00f5hjal on \u00fcsna lihtne, seet\u00f5ttu saab Utility-based s\u00fcsteemi kasutada osana AI otsustusprotsessidest, mitte nende t\u00e4ielikuks asendamiseks. Otsustuspuu v\u00f5ib k\u00fcsida kahe t\u00fctarn\u00f5lva utiliteedi hindamist ja valida k\u00f5rgema. Samamoodi v\u00f5ib k\u00e4itumispuul olla koostisosa s\u00f5lm Utility, et hinnata tegevuste utiliteeti, et otsustada, millist t\u00fctar\u00fcksust t\u00e4ita.<\/p>\n<h2>Liikumine ja navigeerimine<\/h2>\n<p>\nEelnevates n\u00e4idetes oli meil platvorm, mida liikusime vasakule v\u00f5i paremale, ja valve, kes patrullis v\u00f5i r\u00fcndas. Kuid kuidas me t\u00e4pselt t\u00f6\u00f6tame agendi liikumise \u00fcle teatud aja jooksul? Kuidas me m\u00e4\u00e4rame kiirus, kuidas me v\u00e4ldime takistusi, ja kuidas me plaanime marsruuti, kui sihtkohta j\u00f5udmine on keerulisem kui lihtsalt sirgjoonelise liikumisega? Vaatame seda l\u00e4hemalt.<\/p>\n<h3>Haldamine<\/h3>\n<p>\nAlguses oletame, et igal agendil on kiirus, mis sisaldab tema liikumise kiirus ja suund. Seda saab m\u00f5\u00f5ta meetrites sekundis, kilomeetrites tunnis, pikslites sekundis jne. Tuletades meelde sensoorsete\/m\u00f5tlemise\/tegevuse ts\u00fcklit, v\u00f5ime ette kujutada, et osa m\u00f5ttetegevusest valib kiirus ja osa tegevusest rakendab seda kiirus agenti. T\u00fc\u00fcpiliselt m\u00e4ngudes on f\u00fc\u00fcsikas\u00fcsteem, mis teeb selle t\u00f6\u00f6 teie eest, uurides iga objekti kiirus ja reguleerides seda. Seet\u00f5ttu v\u00f5ib tehisintellekti j\u00e4tta \u00fche \u00fclesande \u2014 otsustada, kui kiiresti agent peaks liikuma. Kui on teada, kuhu agent peab j\u00f5udma, tuleb ta liikuda \u00f5iges suunas seatud kiirusel. V\u00e4ga lihtne v\u00f5rrand:<\/p>\n<p><i>desired_travel = sihtkoha_asukoht \u2013 agendi_asukoht<\/i><\/p>\n<p>Kujutage ette 2D maailma. Agent asub punktis (-2,-2), sihtkoht kusagil kirdes punktis (30, 20), ja vajalik tee, et agent sinna j\u00f5uaks, on (32, 22). Oletame, et need positsioonid on m\u00f5\u00f5detud meetrites \u2014 kui v\u00f5tame agendi kiirusena 5 meetrit sekundis, siis me skaleerime oma liikumisvektori ja saame kiirusena umbes (4.12, 2.83). Nende parameetritega j\u00f5uaks agent sihtpunkti peaaegu 8 sekundiga.<\/p>\n<p>V\u00e4\u00e4rtusi saab igal ajal \u00fcmber arvutada. Kui agent oli poolel teel sihtkohta, oleks liikumine olnud poole pikkusest, kuid kuna agendi maksimaalne kiirus on 5 m\/s (nagu me eespool otsustasime), j\u00e4\u00e4b kiirus samaks. See t\u00f6\u00f6tab ka liikuvate sihtm\u00e4rkide puhul, v\u00f5imaldades agentidel teha v\u00e4ikeseid kohandusi nende liikudes.<\/p>\n<p>Aga me tahame rohkem variatiivsust \u2014 n\u00e4iteks aeglaselt suurendada kiirus, et simuleerida tegelast, kes liigub seismisest jooksmiseks. Sama saab teha ka enne peatamist. Need funktsioonid on tuntud kui steering behaviours, iga\u00fchel neist on spetsiifilised nimed: Seek (otsimine), Flee (p\u00f5genemine), Arrival (saabumine) jne. Idee on selline, et kiirusese kiirusel saab rakendada kiirusj\u00f5ude, tuginedes agendi asukoha ja hetke kiiruse ning sihtkoha v\u00f5rdlemisele, et kasutada erinevaid liikumismeetodeid sihtkohta j\u00f5udmiseks.<\/p>\n<p>Iga k\u00e4itumine on veidi erineva eesm\u00e4rgiga. Seek ja Arrival on viisid, kuidas suunata agent sihtkohta. Obstacle Avoidance (takistuste v\u00e4ltimine) ja Separation (eraldi hoidmine) kohandavad agendi liikumist, et m\u00f6\u00f6da minna takistustest sihtkoha poole. Alignment (koosk\u00f5lastamine) ja Cohesion (sidusus) hoiavad agendid liikumas koos. Erinevaid steering behaviors (suunamisv\u00f5tteid) saab summida \u00fcheks teepunktiks, arvesse v\u00f5ttes k\u00f5iki tegureid. Agent kasutab Arrival, Separation ja Obstacle Avoidance k\u00e4itumisi, et hoida eemale seintest ja teistest agentidest. See l\u00e4henemine t\u00f6\u00f6tab h\u00e4sti avatud linnades, kus pole liigseid detaile. <\/p>\n<p>Raskemates tingimustes t\u00f6\u00f6tab erinevate k\u00e4itumiste kokku liitmine kehvemini \u2014 n\u00e4iteks v\u00f5ib agent j\u00e4\u00e4da seina kinni Arrival ja Obstacle Avoidance konfliktide t\u00f5ttu. Seet\u00f5ttu tuleb kaaluda keerulisemaid variante kui lihtsalt k\u00f5igi v\u00e4\u00e4rtuste kokku liitmine. \u00dcks viis on: mitte liita iga k\u00e4itumise tulemusi, vaid uurida liikuvusi erinevates suundades ja valida parim variant. <\/p>\n<p>Kuid keerulises keskkonnas, kus on ummikud ja suunad valida, vajame midagi veelgi arenenumat.<\/p>\n<h3>Teepunktide leidmine<\/h3>\n<p>\nSteering behaviours sobivad suurep\u00e4raselt lihtsaks liikumiseks avatud aladel (jalgpalliv\u00e4ljak v\u00f5i areen), kus sihtpunkti A kuni B j\u00f5udmine on sirge tee v\u00e4heste k\u00f5rvalekaldumisega takistustest m\u00f6\u00f6da. Keerukamate marsruutide jaoks vajame pathfinding'ut (teepunktide leidmine), mis on viis maailma uurimiseks ja selle kaudu marsruudi valimiseks.<\/p>\n<p>Lihtsaim viis on panna igasse ruutu, mis asub agendi k\u00f5rval, v\u00f5rk ja hinnata, millistes neist on lubatud liikuda. Kui m\u00f5ni neist on sihtkoht, j\u00e4rgige sealt teed, liikudes igast ruudust tagasi eelmisse, kuni j\u00f5uate alguspunkti. Just see on marsruut. Vastasel juhul korrake protsessi l\u00e4himates teiste ruutide puhul, kuni leiate sihtkoha v\u00f5i ruudud saavad otsa (see t\u00e4hendab, et pole v\u00f5imalikku teed). Seda tuntakse ametlikult kui laieesm\u00e4rgi otsingu (Breadth-First Search ehk BFS) algoritmina. Igal sammul vaatab see igas suunas (seet\u00f5ttu \u201elaius\u201d). Otsinguruum sarnaneb lainefrontiga, mis liigub kuni j\u00f5uab soovitud kohta \u2014 otsingu valdkond laieneb igal sammul, kuni see h\u00f5lmab l\u00f5pp-punkti, p\u00e4rast mida saab j\u00e4lgida teed algusesse.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/d367e62bc53033b05388538649853a41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTulemuseks on ruutide loetelu, mille kaudu formaalitakse vajalik marsruut. See on tee (siit tuleb ka termin pathfinding) \u2014 loetelu kohtadest, mida agent k\u00fclastab, liikudes sihtpunkti suunas.<\/p>\n<p>Arvestades, et me teame iga ruudu asukohta maailmas, saame kasutada juhtimisprotseduure (steering behaviours), et liikuda m\u00f6\u00f6da teed \u2014 s\u00f5lmedelt 1 s\u00f5lmesse 2, seej\u00e4rel s\u00f5lmedelt 2 s\u00f5lmesse 3 ja nii edasi. Lihtsaim variant on suunduda j\u00e4rgmise ruudu keskpunkti, kuid veel parem on peatuda praeguse ruudu ja j\u00e4rgmise vahepeal. Nii saab agent teravaid p\u00f6\u00f6rdeid sujuvamalt l\u00e4bida.<\/p>\n<p>BFS-algoritmil on ka puudused \u2014 see uurib sama palju ruute \u201evale\u201d suunas kui \u201e\u00f5ige\u201d suunas. Siin tuleb m\u00e4ngu keerulisem algoritm nimega A* (A star). See t\u00f6\u00f6tab sarnaselt, kuid selle asemel, et pimesi uurida naaberruute (j\u00e4relnaabrite, seej\u00e4rel naabrite naabrite jne), kogub see s\u00f5lmed loendisse ja sorteerib need nii, et j\u00e4rgmine uuritav s\u00f5lm on alati see, mis viib l\u00fchima marsruudini. S\u00f5lmed sorteeritakse h\u00fcpoteetilise marsruudi \u201ekulude\u201d p\u00f5hjal, et j\u00f5uda soovitud ruutu (kaasa arvatud k\u00f5ik liikumise kulud) ja hinnstatusse, kui kaugel see ruut on sihtkohast (suunates otsingu \u00f5iges suunas).<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/1cab4f53fa5af6b31d352c7bcf453d7e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelles n\u00e4ites uurib agent \u00fchte ruutu korraga, valides iga kord naabruse, mis tundub k\u00f5ige rohkem lootustandev. Saadud tee on sama, mis BFS-il, kuid protsessi k\u00e4igus on arvestatud v\u00e4hemate ruutudega \u2014 see on m\u00e4ngu j\u00f5udluse jaoks m\u00e4rkimisv\u00e4\u00e4rne.<\/p>\n<h3>Liikumine ilma ruudustikuta<\/h3>\n<p>\nKuid enamik m\u00e4nge ei ole ruudustikus, ja sageli ei saa seda realistlikkuse kahjustamata luua. Kompromisse on vajalikud. Kui suured peaksid ruudud olema? Liialt suured \u2014 ja nad ei suuda korralikult kujutada v\u00e4ikseid koridore v\u00f5i p\u00f6\u00f6rdeid, liiga v\u00e4ikesed \u2014 ruute on otsimiseks liiga palju, mis l\u00f5puks v\u00f5tab palju aega.<\/p>\n<p>Esimene asi, mida m\u00f5ista \u2014 ruudustik annab meile seotud s\u00f5lmede graafiku. A* ja BFS algoritmid t\u00f6\u00f6tavad tegelikult graafikutel ja ei hooli meie ruudustikust. Me v\u00f5iksime paigutada s\u00f5lmed igal pool m\u00e4ngumaailmas: kui kahe \u00fchendatud s\u00f5lme vahel on side, samuti algus- ja l\u00f5pupunkti vahel ning v\u00e4hemalt \u00fche s\u00f5lmega \u2014 t\u00f6\u00f6tab algoritm endiselt sama h\u00e4sti kui varem. Seda nimetatakse sageli teepunktide s\u00fcsteemiks, kuna iga s\u00f5lm esindab t\u00e4henduslikku positsiooni maailmas, mis v\u00f5ib olla osa paljusid h\u00fcpoteetilisi teevariatsioone.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/d87e9d4bb2a2fc713d32abc158506eaa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>N\u00e4ide 1: s\u00f5lm igas ruudis. Otsing algab s\u00f5lmest, kus agent asub, ja l\u00f5ppeb vajaliku ruudu s\u00f5lmes.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/b535a5db805efdc427d7c5724b866982.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>N\u00e4ide 2: v\u00e4iksem s\u00f5lmede komplekt (teepunktid). Otsing algab ruudust, kus agent asub, liigub l\u00e4bi vajalike s\u00f5lmede ja j\u00e4tkub siis sihtkohta.<\/i><\/p>\n<p>See on \u00fcsna paindlik ja v\u00f5imas s\u00fcsteem. Kuid teepunktide asukohtade otsimisel on ettevaatlikkust, muidu ei pruugi agenid lihtsalt l\u00e4hima punkti n\u00e4ha ja ei saa oma teed alustada. Oleks lihtsam, kui saaksime automaatselt teepunkte paigutada maailmaga seotud geomeetria p\u00f5hjal.<\/p>\n<p>Siia tuleb navigeerimisv\u00f5rk v\u00f5i navmesh (navigeerimissegu). See on tavaliselt 2D- v\u00f5rk kolmnurgadest, mis asetatakse maailma geomeetriale \u2014 igal pool, kus agent v\u00f5ib liikuda. Iga kolmnurk v\u00f5rgus muutub graafikus s\u00f5lmeks ja tal on kuni kolm k\u00fclgnevat kolmnurka, mis muutuvad graafikus naabruss\u00f5lmedeks. <\/p>\n<p>See pilt on n\u00e4ide Unity mootorist \u2014 see anal\u00fc\u00fcsis maailma geomeetriat ja l\u00f5i navmesh'i (ekraanipildil helesinise v\u00e4rviga). Iga pol\u00fcgoon navmesh'is on ala, millel agent v\u00f5ib seista v\u00f5i liikuda \u00fchest pol\u00fcgoonist teise. Antud n\u00e4ites on pol\u00fcgoonid v\u00e4iksemad kui korrused, mille peal nad asuvad \u2014 see on tehtud agendi suuruste arvestamiseks, mis ulatuvad tema nominaalsest asukohast v\u00e4lja.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/845705ba7b9a9d469203aedf7942da41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSaame otsida marsruuti l\u00e4bi selle v\u00f5rgu, kasutades j\u00e4lle A* algoritmi. See annab meile praktiliselt ideaalse marsruudi maailmas, mis arvestab kogu geomeetriat ning ei vaja liigseid s\u00f5lmi ja teet\u00e4ppet\u00e4hti.<\/p>\n<p>Pathfinding on liiga ulatuslik teema, millest ei piisa \u00fchest artikli jaost. Kui soovite seda p\u00f5hjalikumalt uurida, aitab see <noindex><a rel=\"nofollow\" href=\"https:\/\/www.redblobgames.com\/pathfinding\/a-star\/introduction.html\">Amit Patel'i veebisait<\/a><\/noindex>.<\/p>\n<h2>Planeerimine<\/h2>\n<p>\nOleme pathfinding'uga veendunud, et m\u00f5nikord ei piisa lihtsalt suuna valimisest ja liikumisest \u2014 me peame valima marsruudi ja tegema mitu p\u00f6\u00f6rdet, et j\u00f5uda sihtkohta. Saame selle idee kokku v\u00f5tta: eesm\u00e4rgi saavutamine ei ole lihtsalt j\u00e4rgmine samm, vaid pigem tervikj\u00e4rjekord, kus m\u00f5nikord peame ette vaatama paar sammu, et teada, kuidas esimene samm peaks olema. Seda nimetatakse planeerimiseks. Pathfinding'ut v\u00f5ib pidada \u00fcheks mitmest planeerimise t\u00e4ienduseks. Meie Sense\/Think\/Act ts\u00fckli vaatenurgast on see koht, kus osa Think planeerib tulevikus mitmeid osi Act.<\/p>\n<p>Vaatame n\u00e4idet kaardim\u00e4ngust Magic: The Gathering. Me liigume esimesena selliste kaartidega k\u00e4es:<\/p>\n<ul>\n<li>Swamp \u2014 annab 1 musta mannat (maa kaart).<\/li>\n<li>Forest \u2014 annab 1 roheline mannat (maa kaart).<\/li>\n<li>Fugitive Wizard \u2014 n\u00f5uab 1 sinist mannat, et seda v\u00f5tta.<\/li>\n<li>Elvish Mystic \u2014 n\u00f5uab 1 roheline mannat, et seda v\u00f5tta.<\/li>\n<\/ul>\n<p>\nJ\u00e4tame \u00fclej\u00e4\u00e4nud kolm kaarti k\u00f5rvale, et oleks lihtsam. Reeglite kohaselt on m\u00e4ngijal lubatud m\u00e4ngida 1 maa kaart iga k\u00e4igu ajal, ta v\u00f5ib selle kaardi \"tapada\", et saada mannat ning seej\u00e4rel kasutada loitsu (sealhulgas olendi toomist) saadud mana koguse alusel. Antud olukorras teab inim m\u00e4ngija, et peab m\u00e4ngima Forest'i, \"tapama\" 1 roheline mannat ja seej\u00e4rel kutsuma Elvish Mystic'i. Kuid kuidas sellest teada saada m\u00e4ngu AI-le?<\/p>\n<h3>Lihtne planeerimine<\/h3>\n<p>\nTriviaalne l\u00e4henemine on proovida iga tegevust j\u00e4rjest, kuni enam sobivaid ei j\u00e4\u00e4. Kaardile vaadates n\u00e4eb tehisintellekt, et ta saab m\u00e4ngida Swampi. Ja ta m\u00e4ngib selle. Kas selle k\u00e4igu jooksul on teisi tegevusi? Ta ei saa kutsuda ei Elvish Mysticit ega Fugitive Wizardit, kuna nende m\u00e4ngimiseks on vajalik vastavalt roheline ja sinine mana, aga Swamp toob ainult musta mana. Ja ta ei saa juba m\u00e4ngida Forestit, kuna on juba m\u00e4nginud Swampi. Seega m\u00e4ngib m\u00e4ngu tehisintellekt reeglite j\u00e4rgi, kuid teeb seda halvasti. Seda oleks v\u00f5imalik parandada.<\/p>\n<p>Planeerimine v\u00f5ib leida tegevuste loendi, mis viivad m\u00e4ngu soovitud olekusse. Nii nagu iga ruut teel omas naabreid (pathfinding'e puhul), on igal plaanis tegevusel samuti naabrid v\u00f5i j\u00e4rglased. Saame otsida neid tegevusi ja edasisi tegevusi, kuni saavutame soovitud oleku.<\/p>\n<p>Meie n\u00e4ites on soovitud tulemus \u201ekutset teha, kui see on v\u00f5imalik\u201c. K\u00e4igu alguses n\u00e4eme ainult kahte v\u00f5imalikku tegevust, mis on m\u00e4ngureeglite poolt lubatud:<\/p>\n<p><i>1. M\u00e4ngi Swamp (tulemus: Swamp m\u00e4ngus)<br \/>\n2. M\u00e4ngi Forest (tulemus: Forest m\u00e4ngus)<\/i><\/p>\n<p>Iga vastuv\u00f5etud tegevus v\u00f5ib viia edasi uute tegevusteni ja sulgeda teisi, j\u00e4lle m\u00e4ngureeglitest l\u00e4htuvalt. Kujutage ette, et me m\u00e4ngisime Swampi \u2013 see eemaldab Swampi j\u00e4rgmiseks sammuks (oleme selle juba m\u00e4nginud), see eemaldab ka Foresti (sest reeglite j\u00e4rgi v\u00f5ib \u00fche ringi jooksul m\u00e4ngida vaid \u00fche maakaardi). P\u00e4rast seda lisab tehisintellekt j\u00e4rgmiseks sammuks \u2013 1 musta mana saamine, kuna muid v\u00f5imalusi pole. Kui ta edasi l\u00e4heb ja valib Tap the Swamp, siis saab ta 1 musta mana ja ei saa sellega midagi teha.<\/p>\n<p><i>1. M\u00e4ngi Swamp (tulemus: Swamp m\u00e4ngus)<br \/>\n 1.1 \u201eT\u00e4pida\u201c Swamp (tulemus: Swamp on \u201et\u00e4pitud\u201c, +1 musta mana)<br \/>\n Ei ole saadaval tegevusi \u2013 L\u00d5PP<br \/>\n2. M\u00e4ngi Forest (tulemus: Forest m\u00e4ngus)<\/i><\/p>\n<p>Tegevuste loend on liiga l\u00fchike, oleme ummikus. Korrake protsessi j\u00e4rgmise tegevuse jaoks. M\u00e4ngime Foresti, avame tegevuse \u201esaada 1 roheline mana\u201c, mis omakorda avab kolmanda tegevuse \u2013 Elvish Mystici kutse.<\/p>\n<p><i>1. M\u00e4ngi Swamp (tulemus: Swamp m\u00e4ngus)<br \/>\n 1.1 \u201eT\u00e4pida\u201c Swamp (tulemus: Swamp on \u201et\u00e4pitud\u201c, +1 musta mana)<br \/>\n Ei ole saadaval tegevusi \u2013 L\u00d5PP<br \/>\n2. M\u00e4ngi Forest (tulemus: Forest m\u00e4ngus)<br \/>\n 2.1 \u201eT\u00e4pida\u201c Forest (tulemus: Forest on \u201et\u00e4pitud\u201c, +1 roheline mana)<br \/>\n 2.1.1 Kutsuda Elvish Mystic (tulemus: Elvish Mystic m\u00e4ngus, -1 roheline mana)<br \/>\n Ei ole saadaval tegevusi \u2013 L\u00d5PP<\/i><\/p>\n<p>L\u00f5puks oleme uurinud k\u00f5iki v\u00f5imalikke tegevusi ja leidnud plaani, mis kutsub esile olendi.<\/p>\n<p>See on v\u00e4ga lihtsustatud n\u00e4ide. Soovitav on valida parim v\u00f5imalik plaan, mitte lihtsalt selline, mis vastab mingitele kriteeriumitele. \u00dcldiselt saab potentsiaalseid plaane hinnata l\u00f5pptulemuse v\u00f5i nende t\u00e4itmise koguhinna alusel. M\u00e4ngides maakaardiga saab koguda 1 punkti ning looma kutsumisega 3 punkti. Swampi m\u00e4ngimine oleks plaan, mis annab 1 punkti. Foresti m\u00e4ngimine \u2192 Foresti sissel\u00fclitamine \u2192 Elvish Mystici kutsumine annab aga kohe 4 punkti. <\/p>\n<p>Nii t\u00f6\u00f6tab planeerimine Magic: The Gathering'is, kuid sama loogikat rakendatakse ka muudesse olukordadesse. N\u00e4iteks, nii saate liikuda nupuga, et teha ruumi elevandi k\u00e4iguks \u0161ahhis. V\u00f5i peituda seina taha, et XCOM-is ohutult tulistada. \u00dches\u00f5naga, saad aru.<\/p>\n<h3>Parandatud planeerimine<\/h3>\n<p>\nM\u00f5nikord on liiga palju potentsiaalseid tegusid, et kaaluda iga v\u00f5imalikke variante. Naaseme Magic: The Gathering'i n\u00e4ite juurde: oletame, et m\u00e4ngus on teil mitmeid maakaarte ja olendeid \u2013 v\u00f5imalike k\u00e4ikude arv v\u00f5ib ulatuda k\u00fcmnete kaupa. Probleemi lahendamiseks on mitu meetodit.<\/p>\n<p>Esimene viis on backwards chaining (tagasiulatuv ahel). Selle asemel, et k\u00f5iki kombinatsioone l\u00e4bi vaadata, on parem alustada l\u00f5pptulemusest ja proovida leida otsetee. Selle asemel, et liikuda puu juurest kindla leheni, liigume vastassuunas \u2013 lehest juure juurde. See meetod on lihtsam ja kiirem.<\/p>\n<p>Kui vastasel on 1 elupunkt, saab leida plaani \u201eteha 1 v\u00f5i rohkem kahju\u201c. Selle saavutamiseks tuleb t\u00e4ita mitmeid tingimusi: <\/p>\n<p>1. Kahju v\u00f5ib teha loits \u2013 see peab olema k\u00e4es.<br \/>\n2. Loitsu m\u00e4ngimiseks on vajalik mana.<br \/>\n3. Mana saamiseks tuleb m\u00e4ngida maakaart.<br \/>\n4. Maakaardi m\u00e4ngimiseks peab see olema k\u00e4es.<\/p>\n<p>Teine v\u00f5imalus on best-first search (parim esimene otsing). Selle asemel, et k\u00f5iki teid uurida, valime k\u00f5ige sobivama. Sageli annab see meetod optimaalse plaani, ilma et peaksite otsinguteks \u00fclem\u00e4\u00e4raselt vaeva n\u00e4gema. A* on parima esimese otsingu vorm \u2013 uurides k\u00f5ige lootustandvamaid marsruute alates algusest, suudab see juba leida parima tee, ilma et peaks kontrollima teisi variante.<\/p>\n<p>Huvitav ja aina populaarsem variant parima esmaklassilise otsingu jaoks on Monte Carlo puuotsing. Selle asemel, et \u00e4ra arvata, millised plaanid on paremad iga j\u00e4rgmise tegevuse valimisel, valib algoritm iga sammu korral juhuslikke j\u00e4rgijaid, kuni j\u00f5uab l\u00f5puni (kui plaan viib v\u00f5iduni v\u00f5i kaotusele). Seej\u00e4rel kasutatakse l\u00f5pptulemust selleks, et t\u00f5sta v\u00f5i langetada varasemaid valikute \"kaalu\" hindamisi. Korrates seda protsessi mitu korda j\u00e4rjest, annab algoritm hea hinnangu, milline j\u00e4rgmine samm on parem, isegi kui olukord muutub (kui vastane astub samme, et m\u00e4ngijat takistada). <\/p>\n<p>M\u00e4ngude planeerimisest r\u00e4\u00e4kides ei saa me m\u00f6\u00f6da minna sihitud tegevuste planeerimist ehk GOAP (Goal-Oriented Action Planning). See on laialdaselt kasutatav ja arutletud meetod, kuid peale m\u00f5nede eristavate detailide on see sisuliselt tagasip\u00f6\u00f6rdumise ahela meetod, millest me varem r\u00e4\u00e4kisime. Kui \u00fclesanne on \"m\u00e4ngija h\u00e4vitamine\" ja m\u00e4ngija on varjupaiga taga, v\u00f5ib plaan olla j\u00e4rgmine: h\u00e4vitada granaadiga \u2192 v\u00f5tta see \u00fcles \u2192 visata.<\/p>\n<p>Tavaliselt on mitmeid eesm\u00e4rke, igal neist on oma prioriteet. Kui k\u00f5ige k\u00f5rgema prioriteediga eesm\u00e4rki ei saa t\u00e4ita (\u00fchegi tegevuste kombinatsioon ei loo plaani \"h\u00e4vitada m\u00e4ngija\", kuna m\u00e4ngija ei ole n\u00e4htav), siis tagastab tehisintellekt madalama prioriteedi eesm\u00e4rkide juurde.<\/p>\n<h2>Koolitus ja kohandamine<\/h2>\n<p>\nOleme juba r\u00e4\u00e4kinud, et m\u00e4ngu tehisintellekt ei kasuta tavaliselt masin\u00f5pet, kuna see ei sobi reaalajas agente juhtimiseks. Kuid see ei t\u00e4henda, et sealt ei saaks midagi laenata. Me tahame sellist vastast tulistamism\u00e4ngus, kellelt on v\u00f5imalik \u00f5ppida. N\u00e4iteks teada saada parimatest kohtadest kaardil. V\u00f5i vastast kaklusm\u00e4ngus, kes blokeerib m\u00e4ngija tihti kasutatavaid kombo-k\u00e4ike, motiveerides kasutama teisi. Nii et masin\u00f5pe sellistes olukordades v\u00f5ib olla \u00fcsna kasulik.<\/p>\n<h3>Statistika ja t\u00f5en\u00e4osused<\/h3>\n<p>\nEnne kui l\u00e4heme keerukate n\u00e4idete juurde, vaatame, kui kaugele me saame minna, tehes m\u00f5ned lihtsad m\u00f5\u00f5tmised ja kasutades neid otsuste tegemiseks. N\u00e4iteks, reaalaja strateegia \u2014 kuidas me saame kindlaks teha, kas m\u00e4ngija suudab alustada r\u00fcnnakut m\u00e4ngu esimestel minutitel ja millist kaitset selle vastu valmistada? Saame uurida m\u00e4ngija varasemat kogemust, et m\u00f5ista, milline v\u00f5ib olla tulevane reaktsioon. Alustuseks meil pole selliseid algandmeid, kuid saame need koguda \u2014 iga kord, kui AI m\u00e4ngib inimese vastu, saab ta salvestada esimese r\u00fcnnaku aja. P\u00e4rast mitmeid sessioone saame keskmise aja, mille jooksul m\u00e4ngija tulevikus r\u00fcndab.<\/p>\n<p>Keskv\u00e4\u00e4rtustel on probleem: kui m\u00e4ngija on 20 korda 'rushinud' ja 20 korda m\u00e4nginud aeglaselt, siis vajalikud v\u00e4\u00e4rtused j\u00e4\u00e4vad kuskil keskele, mis ei paku meile midagi kasulikku. \u00dcks lahendustest on sisendandmete piiramine \u2014 v\u00f5ime arvesse v\u00f5tta viimased 20 juhtumit.<\/p>\n<p>Sarnast l\u00e4henemist kasutatakse teatud toimingute t\u00f5en\u00e4osuse hindamisel, eeldades, et m\u00e4ngija varasemad eelistused j\u00e4\u00e4vad tulevikus samaks. Kui m\u00e4ngija r\u00fcndab meid viis korda tulepalliga, kaks korda v\u00e4lguga ja \u00fche korra l\u00e4hiv\u00f5itluses, on ilmne, et ta eelistab tulepalli. Ekstrapoleerime ja n\u00e4eme erineva relva kasutamise t\u00f5en\u00e4osust: tulepall=62,5%, v\u00e4lk=25% ja l\u00e4hiv\u00f5itlus=12,5%. Meie m\u00e4ngu AI peab valmistuma tule eest kaitsmiseks.<\/p>\n<p>Veel \u00fcks huvitav meetod on kasutada Naive Bayes Classifier'i (naiivne bayeslik klassifikaator) suurte sisendandmete koguste uurimiseks ja olukorra klassifitseerimiseks, et AI reageeriks \u00f5igesti. Bayeslikud klassifikaatorid on k\u00f5ige tuntumad selle poolest, kuidas neid kasutatakse e-kirjade r\u00e4mpsposti filtrites. Seal uurivad nad s\u00f5nu, v\u00f5rdlevad neid sellega, kus need s\u00f5nad varem esinesid (r\u00e4mpspostis v\u00f5i mitte), ja teevad j\u00e4reldusi saabuvate kirjade kohta. Saame teha sama isegi v\u00e4iksema sisendandmete hulgaga. Tuginedes k\u00f5ikidele kasulikule teabele, mida AI n\u00e4eb (nt millised vaenlase \u00fcksused on loodud, milliseid loitse nad kasutavad v\u00f5i milliseid tehnoloogiaid on nad uurinud) ja l\u00f5pptulemusele (s\u00f5da v\u00f5i rahu, 'rushida' v\u00f5i kaitsta jne) \u2014 valime vajaliku AI k\u00e4itumise.<\/p>\n<p>K\u00f5ik need \u00f5ppimise meetodid on piisavad, kuid oleks soovitatav neid kasutada testimise andmete p\u00f5hjal. Tehisintellekt \u00f5pib kohanduma erinevate strateegiatega, mida teie m\u00e4ngijad kasutasid. Tehisintellekt, mis kohandub m\u00e4ngijaga p\u00e4rast v\u00e4ljaandmist, v\u00f5ib osutuda liiga ennustatavaks v\u00f5i vastupidi, liiga keeruliseks v\u00f5idetavaks.<\/p>\n<h3>Kohandamine v\u00e4\u00e4rtuste p\u00f5hjal<\/h3>\n<p>\nArvestades meie m\u00e4ngumaailma sisu ja reegleid, saame muuta nende otsuste tegemiseks m\u00f5jutavaid v\u00e4\u00e4rtuste komplekte, mitte lihtsalt kasutada sisendandmeid. Teeme seda j\u00e4rgmiselt:<\/p>\n<ul>\n<li>Las tehisintellekt kogub andmeid m\u00e4ngu ajal maailma olekute ja v\u00f5tmeeventside kohta (nagu on varem mainitud).<\/li>\n<li>Muudame m\u00f5ningaid olulisi v\u00e4\u00e4rtusi (value) nende andmete p\u00f5hjal.<\/li>\n<li>Rakendame oma otsuseid, mis p\u00f5hinevad nende v\u00e4\u00e4rtuste t\u00f6\u00f6tlemisel v\u00f5i hindamisel.<\/li>\n<\/ul>\n<p>\nN\u00e4iteks, kui agentil on mitu tuba valimiseks esimese isiku tulistamism\u00e4ngu kaardil. Igal toal on oma v\u00e4\u00e4rtus, mis m\u00e4\u00e4rab, kui soovitav see k\u00fclastamiseks on. Tehisintellekt valib juhuslikult, millisesse tuppa minna, p\u00f5hinedes v\u00e4\u00e4rtusele. Siis m\u00e4letab agent, millises toas ta h\u00e4vines, ja v\u00e4hendab selle v\u00e4\u00e4rtust (t\u00f5en\u00e4osus, et ta sinna naaseb). Vastupidisel juhul \u2014 kui agent h\u00e4vib palju vastaseid, siis toaga seotud v\u00e4\u00e4rtus suureneb.<\/p>\n<h3>Markovi mudel<\/h3>\n<p>\nMis siis, kui me kasutame kogutud andmeid ennustamiseks? Kui me m\u00e4letame iga tuba, kus m\u00e4ngijat teatud aja jooksul n\u00e4gime, suudame ennustada, millisesse tuppa m\u00e4ngija v\u00f5ib minna. J\u00e4lgides ja registreerides m\u00e4ngija liikumisi tubade vahel (values), saame neid ennustada.<\/p>\n<p>V\u00f5tame kolm tuba: punane, roheline ja sinine. Ja ka t\u00e4helepanekud, mida oleme kogunud m\u00e4ngu sessiooni vaatamisel:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/6e90a365b72a176c36c9a14213baaafc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nIga toa j\u00e4lgimise arv on peaaegu sama \u2014 kus on hea koha jaoks varitseda, ei tea me siiani. Statistika kogumine on samuti keeruline, kuna m\u00e4ngijad ilmuvad kaardil \u00fchtlaselt. Kuid j\u00e4rgmise toa andmed, kuhu nad sisenevad p\u00e4rast kaardile ilmumist, on juba kasulikud.<\/p>\n<p>N\u00e4ha on, et roheline tuba meeldib m\u00e4ngijatele \u2014 enamik inimesi punasest liigub sinna, kellest 50% j\u00e4\u00e4b sinna edasi. Sinine tuba aga ei naudi populaarsust, sinna peaaegu ei minda ja kui minnakse, siis ei viibita seal kaua. <\/p>\n<p>Kuid andmed r\u00e4\u00e4givad meile midagi t\u00f5eliselt olulist \u2014 kui m\u00e4ngija viibib sinises toas, siis on j\u00e4rgmine tuba, kus me teda k\u00f5ige t\u00f5en\u00e4olisemalt n\u00e4eme, punane, mitte roheline. Kuigi roheline tuba on punasest populaarsem, muutub olukord, kui m\u00e4ngija viibib sinises. J\u00e4rgmine seisund (ehk tuba, kuhu m\u00e4ngija l\u00e4heb) s\u00f5ltub eelnevast seisundist (ehk toast, kus m\u00e4ngija hetkel viibib). Seoste uurimise t\u00f5ttu prognoosime me t\u00e4psemalt, kui kui me lihtsalt loendame vaatlemisi iseseisvalt.<\/p>\n<p>Tuleviku seisundi ennustamist m\u00f6\u00f6dunud seisundi andmete p\u00f5hjal nimetatakse Markovi mudeliks (Markov model) ja selliseid n\u00e4iteid (tubadega) nimetatakse Markovi ahelateks. Kuna mudelid kujutavad endast t\u00f5en\u00e4osust muutusteks j\u00e4rjestikuste seisundite vahel, esitatakse need visuaalselt FSM-ina, kus iga \u00fclemineku t\u00f5en\u00e4osus on ligikaudu n\u00e4idatud. Varem kasutasime FSM-i agendi k\u00e4itumise seisundi esitamiseks, kuid see kontseptsioon laieneb igasugusele seisundile, olenemata sellest, kas see on seotud agendiga v\u00f5i mitte. Antud juhul esindavad seisundid agenti h\u00f5ivatud tuba:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/edb32dff7a3298b19c3fa4d66f48e9f4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on lihtne variant suhtelise t\u00f5en\u00e4osuse muutuste esitamiseks, andes tehisintellektille v\u00f5imaluse ennustada j\u00e4rgmist seisundit. V\u00f5ib teha prognoose mitu sammu ettepoole.<\/p>\n<p>Kui m\u00e4ngija viibib rohelises toas, siis on 50% t\u00f5en\u00e4osus, et ta j\u00e4\u00e4b sinna ka j\u00e4rgmise vaatlemise ajal. Kuid kui suur on t\u00f5en\u00e4osus, et ta j\u00e4\u00e4b sinna ka p\u00e4rast seda? On olemas mitte ainult t\u00f5en\u00e4osus, et m\u00e4ngija j\u00e4i rohelisse tuppa p\u00e4rast kahte vaatlemist, vaid ka t\u00f5en\u00e4osus, et ta lahkus ja naasis. Siin on uus tabel uute andmete arvestamisel:<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/f87afff68b066a879661e37f68654ae2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTabelist on n\u00e4ha, et t\u00f5en\u00e4osus n\u00e4ha m\u00e4ngijat rohelises toas p\u00e4rast kahte vaatlemist on 51% \u2014 21%, et ta tuleb punasest toast, 5% nende hulgast, et m\u00e4ngija k\u00fclastab sinist tuba nende vahel, ja 25%, et m\u00e4ngija ei lahku \u00fcldse rohelisest toast.<\/p>\n<p>Tabel on lihtsalt visuaalne t\u00f6\u00f6riist - protseduur n\u00f5uab vaid t\u00f5en\u00e4osuste korrutamist igal sammul. See t\u00e4hendab, et saate vaadata kaugele tulevikku, \u00fche parandusega: oletame, et t\u00f5en\u00e4osus siseneda ruumi s\u00f5ltub t\u00e4ielikult praegusest ruumist. Seda kutsutakse Markovi omaduseks - tulevane olek s\u00f5ltub ainult olevikust. Kuid see ei ole t\u00e4iesti t\u00e4pne. M\u00e4ngijad v\u00f5ivad otsuseid muuta s\u00f5ltuvalt teistest teguritest: tervise tase v\u00f5i kuulide arv. Kuna me ei fikseeri neid v\u00e4\u00e4rtusi, on meie ennustused v\u00e4hem t\u00e4psed.<\/p>\n<h3>N-grammid<\/h3>\n<p>\nKuidas on asi n\u00e4itel, kus m\u00e4ngija v\u00f5itleb ja ennustab combo-v\u00f5tteid? T\u00e4pselt sama! Kuid \u00fche oleku v\u00f5i s\u00fcndmuse asemel uurime tervet j\u00e4rjestust, millest combo-\u00fctlus koosneb.<\/p>\n<p>\u00dcks viis seda teha on salvestada iga sisend (n\u00e4iteks Kick, Punch v\u00f5i Block) puhvrisse ja salvestada kogu puhver s\u00fcndmusena. Seega, kui m\u00e4ngija j\u00e4rjestikku vajutab Kick, Kick, Punch, et kasutada r\u00fcnnakut SuperDeathFist, salvestab AI k\u00f5ik sisendid puhvrisse ja m\u00e4letab viimaseid kolme, mida kasutatakse igal sammul.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas luua m\u00e4ngu AI: algajate juhend\" src=\"\/wp-content\/uploads\/2019\/11\/9a95226ae155dca5e45a66d4440f3cd4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Rasvases kirjas on read, kui m\u00e4ngija k\u00e4ivitab r\u00fcnnaku SuperDeathFist.)<\/p>\n<p>AI n\u00e4eb k\u00f5iki v\u00f5imalusi, kui m\u00e4ngija valis Kick, j\u00e4rgneb teine Kick, ning seej\u00e4rel m\u00e4rkab, et j\u00e4rgmine sisend on alati Punch. See v\u00f5imaldab agendil ennustada combo-v\u00f5tet SuperDeathFist ja blokeerida selle, kui see on v\u00f5imalik.<\/p>\n<p>Need s\u00fcndmuste j\u00e4rjestused nimetatakse N-grammideks, kus N on salvestatud elementide arv. Eelnevas n\u00e4ites oli see 3-gramm (triaagramm), mis t\u00e4hendab: esimesed kaks salvestust kasutatakse kolmanda ennustamiseks. Seel\u00e4bi ennustavad 5-grammis esimesed neli salvestust viiendat ja nii edasi.<\/p>\n<p>Arendajal on vaja hoolikalt valida N-grammide suurus. V\u00e4hem N-d n\u00f5uab v\u00e4hem m\u00e4lu, kuid salvestab ka v\u00e4hem ajalugu. N\u00e4iteks 2-gramm (bikgramm) salvestab Kick, Kick v\u00f5i Kick, Punch, kuid ei suuda salvestada Kick, Kick, Punch, seega ei reageeri AI combo SuperDeathFist-le.<\/p>\n<p>Teiselt poolt, suuremad numbrid n\u00f5uavad rohkem m\u00e4lu ja AI-l on raskem \u00f5ppida, kuna tekib palju rohkem v\u00f5imalikke kombinatsioone. Kui teil oli kolm v\u00f5imaliku sisendit Kick, Punch v\u00f5i Block, ja kasutasime 10-grammi, siis tekib umbes 60 tuhat erinevat varianti.<\/p>\n<p>Bigrammi mudel on lihtne Markovi ahel \u2014 iga paar \"eelmine seisund \/ praegune seisund\" on bigramm ja v\u00f5ite ennustada teist seisundit esimesest. 3-gramm ja suuremad N-grammid v\u00f5ivad samuti olla Markovi ahelad, kus k\u00f5ik elemendid (v.a viimane N-grammis) koos moodustavad esimese seisundi ja viimane element \u2014 teise. N\u00e4ide, kus on v\u00f5itlus, n\u00e4itab \u00fclemineku t\u00f5en\u00e4osust olukorrast Kick ja Kick olukorda Kick ja Punch. Arvestades mitmeid sissejuhatusajaloo kirjeid kui \u00fchte \u00fcksust, muundame me sisendi j\u00e4rjestuse osaks terviklikust seisundist. See annab meile Markovi omaduse, mis v\u00f5imaldab kasutada Markovi ahelaid j\u00e4rgnevate sisendite ennustamiseks ja \u00e4ra arvata, milline tehnikak\u00e4ik j\u00e4rgneb.<\/p>\n<h2>Kokkuv\u00f5te<\/h2>\n<p>\nR\u00e4\u00e4kisime k\u00f5ige levinumatest t\u00f6\u00f6riistadest ja l\u00e4henemistest tehisintellekti arenduses. Samuti arutasime olukordi, kus neid tuleks rakendada ja kus nad on eriti kasulikud. <\/p>\n<p>Seda peaks olema piisavalt, et m\u00f5ista m\u00e4ngu tehisintellekti p\u00f5hiasju. Kuid muidugi pole see kaugeltki k\u00f5ik meetodid. V\u00e4hem levinud, kuid samas efektiivsed on:<\/p>\n<ul>\n<li>optimeerimisalgoritmid, sealhulgas m\u00e4gede t\u00f5us, gradientne langus ja geneetilised algoritmid<\/li>\n<li>konkurentsilised otsingu \/ planeerimise algoritmid (minimax ja alpha-beta k\u00e4rpimine)<\/li>\n<li>klassifitseerimismeetodid (perceptroonid, n\u00e4rviv\u00f5rgud ja toele suunatud masinad)<\/li>\n<li>s\u00fcsteemid agentide tajumise ja m\u00e4lu t\u00f6\u00f6tlemiseks<\/li>\n<li>arhitektuurilised l\u00e4henemised tehisintellektile (h\u00fcbriids\u00fcsteemid, arhitektuuride alamkogud ja teised tehisintellekti s\u00fcsteemide \u00fclekandmise viisid)<\/li>\n<li>animatsiooni t\u00f6\u00f6riistad (liikumise planeerimine ja s\u00fcnkroniseerimine)<\/li>\n<li>tulemusfaktorid (detailide tase, anytime algoritmid ja timeslicing)<\/li>\n<\/ul>\n<p>\nInternetiallikad teemal:<\/p>\n<p>1. GameDev.net sisaldab <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gamedev.net\/articles\/programming\/artificial-intelligence\/\">artiklite ja \u00f5petuste jaotist tehisintellekti kohta<\/a><\/noindex>, samuti <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gamedev.net\/forums\/forum\/6-artificial-intelligence\/\">a forum<\/a><\/noindex>.<br \/>\n2. <noindex><a rel=\"nofollow\" href=\"http:\/\/aigamedev.com\/\">AiGameDev.com<\/a><\/noindex> k\u00e4tkeb hulgaliselt esitlusmaterjale ja artikleid laia valiku teemade kohta seotud m\u00e4ngu tehisintellekti arendusega.<br \/>\n3. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gdcvault.com\/\">The GDC Vault<\/a><\/noindex> sisaldab GDC AI tippkohtumise teemasid, mille hulgast paljusid saab tasuta ligip\u00e4\u00e4seda.<br \/>\n4. Kasulikke materjale v\u00f5ib leida ka saidilt <noindex><a rel=\"nofollow\" href=\"http:\/\/gameai.com\/\">AI Game Programmers Guild<\/a><\/noindex>.<br \/>\n5. Tommy Thompson, tehisintellekti ja m\u00e4ngude arendamise uurija, teeb YouTube'i kanalil <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/user\/tthompso\">AI and Games<\/a><\/noindex> videoid tehisintellekti selgitamiseks ja uurimiseks kommertsm\u00e4ngudes.<\/p>\n<p>Teemakohased raamatud:<\/p>\n<p>1. Raamatute sari Game AI Pro koosneb l\u00fchikestest artiklitest, mis selgitavad, kuidas rakendada konkreetseid funktsioone v\u00f5i kuidas lahendada konkreetseid probleeme.<\/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: M\u00e4ngude AI professionaalide kogutud tarkus<\/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: M\u00e4ngude AI professionaalide kogutud tarkus<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2KF4irS\">Game AI Pro 3: M\u00e4ngude AI professionaalide kogutud tarkus<\/a><\/noindex><\/p>\n<p>2. Sarja AI Game Programming Wisdom eelk\u00e4ija on sari Game AI Pro. Selles on vanemaid meetodeid, kuid peaaegu k\u00f5ik on t\u00e4nap\u00e4eval siiski asjakohased.<\/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\">Tehisintellekt: Kaasaegne l\u00e4henemine<\/a><\/noindex> \u2014 see on \u00fcks p\u00f5hitekste k\u00f5igile, kes soovivad aru saada tehisintellekti \u00fcldisest valdkonnast. See raamat ei k\u00e4sitle m\u00e4ngude arendust \u2014 see \u00f5petab tehisintellekti p\u00f5hialuseid.<br \/>\n<br \/>Allikas: <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.1.1 - 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\/et\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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\udd47Kuidas luua m\u00e4ngu AI: algajate juhend | ProHoster","description":"J\u00f5udsin huvitava materjalini.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/52118","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=52118"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/52118\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=52118"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=52118"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=52118"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}