{"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\/hu\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","title":{"rendered":"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/9e57175b233a104e0df98383b374eded.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nR\u00e1bukkantam egy \u00e9rdekes anyagra a mesters\u00e9ges intelligenci\u00e1r\u00f3l a j\u00e1t\u00e9kokban. Az alapvet\u0151 dolgok magyar\u00e1zata egyszer\u0171 p\u00e9ld\u00e1kon kereszt\u00fcl, \u00e9s emellett sok hasznos eszk\u00f6z \u00e9s m\u00f3dszer tal\u00e1lhat\u00f3 a k\u00e9nyelmes fejleszt\u00e9s\u00e9hez \u00e9s tervez\u00e9s\u00e9hez. Az is benne van, hogyan, hol \u00e9s mikor kell \u0151ket haszn\u00e1lni.<\/p>\n<p>A legt\u00f6bb p\u00e9lda pszeudok\u00f3dban van meg\u00edrva, ez\u00e9rt m\u00e9ly programoz\u00f3i tud\u00e1sra nincs sz\u00fcks\u00e9g. A kattint\u00e1s ut\u00e1n 35 oldalnyi sz\u00f6veg k\u00e9pekkel \u00e9s gifekkel, sz\u00f3val k\u00e9sz\u00fclj fel.<\/p>\n<p>UPD. Eln\u00e9z\u00e9st, de m\u00e1r k\u00e9sz\u00fclt saj\u00e1t ford\u00edt\u00e1s a cikkb\u0151l a Habr-n\u00e1l. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/PatientZero\/\">PatientZero<\/a><\/noindex>. Az \u0151 verzi\u00f3j\u00e1t el lehet olvasni. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/420219\/\">itt<\/a><\/noindex>, de valami\u00e9rt a cikk elker\u00fclte a figyelmemet (kerestem, de valami nem stimmelt). Mivel blogot \u00edrok a j\u00e1t\u00e9kiparr\u00f3l, \u00fagy d\u00f6nt\u00f6ttem, hogy megosztom a saj\u00e1t ford\u00edt\u00e1somat az el\u0151fizet\u0151kkel (n\u00e9h\u00e1ny dolog m\u00e1shogy van megform\u00e1lva n\u00e1lam, m\u00e1s dolgok pedig sz\u00e1nd\u00e9kosan kihagy\u00e1sra ker\u00fcltek a fejleszt\u0151k tan\u00e1cs\u00e1ra).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Mi az a mesters\u00e9ges intelligencia?<\/h2>\n<p>\nA j\u00e1t\u00e9kbeli mesters\u00e9ges intelligencia azt vizsg\u00e1lja, hogy milyen l\u00e9p\u00e9seket kell az objektumnak v\u00e9grehajtania az adott k\u00f6r\u00fclm\u00e9nyek alapj\u00e1n. Ezt \u00e1ltal\u00e1ban \"intelligens \u00fcgyn\u00f6k\u00f6k ir\u00e1ny\u00edt\u00e1s\u00e1nak\" nevezik, ahol az \u00fcgyn\u00f6k lehet egy j\u00e1t\u00e9kfigura, egy j\u00e1rm\u0171, egy bot, s\u0151t n\u00e9ha valami elabr\u00e1ltabb: egy eg\u00e9sz entit\u00e1scsoport vagy ak\u00e1r egy civiliz\u00e1ci\u00f3. Minden esetben olyan dologr\u00f3l van sz\u00f3, amelynek l\u00e1tnia kell a k\u00f6rnyezet\u00e9t, d\u00f6nt\u00e9seket kell hoznia az alapj\u00e1n, \u00e9s aszerint kell cselekednie. Ezt h\u00edvj\u00e1k Sense\/Think\/Act (\u00c9rz\u00e9kelni\/Gondolkodni\/Cselekedni) ciklusnak:<\/p>\n<ul>\n<li>\u00c9rz\u00e9kelni: az \u00fcgyn\u00f6k inform\u00e1ci\u00f3t tal\u00e1l vagy kap a k\u00f6rnyezet\u00e9ben l\u00e9v\u0151 dolgokr\u00f3l, amelyek befoly\u00e1solhatj\u00e1k a viselked\u00e9s\u00e9t (k\u00f6zelben l\u00e9v\u0151 fenyeget\u00e9sek, gy\u0171jthet\u0151 t\u00e1rgyak, \u00e9rdekes helyek kutat\u00e1sra).<\/li>\n<li>Gondolkodni: az \u00fcgyn\u00f6k eld\u00f6nti, hogyan reag\u00e1ljon (megvizsg\u00e1lja, el\u00e9g biztons\u00e1gos-e gy\u0171jteni a t\u00e1rgyakat, vagy el\u0151sz\u00f6r harcolnia\/elj\u00e1rnia kell).<\/li>\n<li>Cselekedni: az \u00fcgyn\u00f6k v\u00e9grehajtja a kor\u00e1bbi d\u00f6nt\u00e9s\u00e9nek megfelel\u0151 l\u00e9p\u00e9seket (megkezdi a mozg\u00e1st az ellenf\u00e9l vagy a t\u00e1rgy fel\u00e9).<\/li>\n<li>\u2026most a helyzet megv\u00e1ltozott a karakterek cselekedetei miatt, ez\u00e9rt a ciklus \u00faj adatokkal ism\u00e9tl\u0151dik.<\/li>\n<\/ul>\n<p>\nA mesters\u00e9ges intelligencia \u00e1ltal\u00e1ban a Sense r\u00e9szre \u00f6sszpontos\u00edt a ciklusban. P\u00e9ld\u00e1ul az \u00f6nvezet\u0151 aut\u00f3k f\u00e9nyk\u00e9peket k\u00e9sz\u00edtenek az \u00fatr\u00f3l, egyes\u00edtik azokat a radar \u00e9s lidar adataival, \u00e9s \u00e9rtelmezik azokat. Ezt \u00e1ltal\u00e1ban a g\u00e9pi tanul\u00e1s v\u00e9gzi, amely feldolgozza a bej\u00f6v\u0151 adatokat, \u00e9s \u00e9rtelmet ad nekik, p\u00e9ld\u00e1ul \u00fagy, hogy kinyeri a szemiotikus inform\u00e1ci\u00f3t, mint p\u00e9ld\u00e1ul \"van m\u00e9g egy aut\u00f3 20 yardra el\u0151ttetek\". Ezek a klasszifik\u00e1ci\u00f3s probl\u00e9m\u00e1k.<\/p>\n<p>A j\u00e1t\u00e9koknak nem sz\u00fcks\u00e9ges bonyolult rendszer az inform\u00e1ci\u00f3k kinyer\u00e9s\u00e9hez, mivel a legt\u00f6bb adat m\u00e1r a j\u00e1t\u00e9knak szerves r\u00e9sze. Nincs sz\u00fcks\u00e9g k\u00e9pfelismer\u0151 algoritmusok futtat\u00e1s\u00e1ra, hogy meghat\u00e1rozzuk, van-e ellens\u00e9g el\u0151tt\u00fcnk \u2014 a j\u00e1t\u00e9k m\u00e1r tudja, \u00e9s k\u00f6zvet\u00edti az inform\u00e1ci\u00f3t k\u00f6zvetlen\u00fcl a d\u00f6nt\u00e9shozatali folyamat sor\u00e1n. Ez\u00e9rt a Sense ciklusnak gyakran sokkal egyszer\u0171bbnek kell lennie, mint a Think \u00e9s Act.<\/p>\n<h2>A j\u00e1t\u00e9kos mesters\u00e9ges intelligencia korl\u00e1tai<\/h2>\n<p>\nA mesters\u00e9ges intelligenci\u00e1nak sz\u00e1mos korl\u00e1toz\u00e1st kell figyelembe vennie:<\/p>\n<ul>\n<li>A mesters\u00e9ges intelligenci\u00e1t nem kell el\u0151re betan\u00edtani, mintha ez egy g\u00e9pi tanul\u00e1si algoritmus lenne. \u00c9rtelmetlen neur\u00e1lis h\u00e1l\u00f3zatot \u00edrni a fejleszt\u00e9s sor\u00e1n, hogy megfigyelj\u00fck a t\u00edzezernyi j\u00e1t\u00e9kost, \u00e9s megtanuljuk a legjobb m\u00f3dszert arra, hogy vel\u00fck szemben j\u00e1tsszunk. Mi\u00e9rt? Mert a j\u00e1t\u00e9k m\u00e9g nem jelent meg, \u00e9s nincsenek j\u00e1t\u00e9kosok.<\/li>\n<li>A j\u00e1t\u00e9knak sz\u00f3rakoztatnia \u00e9s kih\u00edv\u00e1sok el\u00e9 kell \u00e1ll\u00edtania, ez\u00e9rt az \u00fcgyn\u00f6k\u00f6k nem tal\u00e1lhatj\u00e1k meg a legjobb megk\u00f6zel\u00edt\u00e9st az emberek ellen.<\/li>\n<li>Az \u00fcgyn\u00f6k\u00f6knek val\u00f3s\u00e1gosnak kell t\u0171nni\u00fck, hogy a j\u00e1t\u00e9kosok azt \u00e9rezz\u00e9k, mintha val\u00f3di emberek ellen j\u00e1tszan\u00e1nak. Az AlphaGo program fel\u00fclm\u00falta az embert, de a v\u00e1lasztott l\u00e9p\u00e9sek jelent\u0151sen elt\u00e9rtek a j\u00e1t\u00e9k hagyom\u00e1nyos meg\u00e9rt\u00e9s\u00e9t\u0151l. Ha a j\u00e1t\u00e9k emberi ellenfelet imit\u00e1l, ennek az \u00e9rz\u00e9snek nem szabadna fenn\u00e1llnia. Az algoritmust m\u00f3dos\u00edtani kell, hogy hihet\u0151 d\u00f6nt\u00e9seket hozzon, nem pedig t\u00f6k\u00e9leteset.<\/li>\n<li>A mesters\u00e9ges intelligenci\u00e1nak val\u00f3s id\u0151ben kell m\u0171k\u00f6dnie. Ez azt jelenti, hogy az algoritmus nem monopoliz\u00e1lhatja a processzor haszn\u00e1lat\u00e1t hossz\u00fa ideig a d\u00f6nt\u00e9shozatal sor\u00e1n. M\u00e9g 10 milliszekundum is t\u00fal hossz\u00fa ehhez, mivel a legt\u00f6bb j\u00e1t\u00e9knak elegend\u0151 16\u201333 milliszekundum a teljes feldolgoz\u00e1shoz \u00e9s a k\u00f6vetkez\u0151 grafikai k\u00e9pkocka el\u00e9r\u00e9s\u00e9hez.<\/li>\n<li>Ide\u00e1lis, ha a rendszer legal\u00e1bb egy r\u00e9sze adatvez\u00e9relt, hogy a \"nem programoz\u00f3k\" is tudjanak m\u00f3dos\u00edt\u00e1sokat v\u00e9gezni, \u00e9s hogy a korrekci\u00f3k gyorsabban t\u00f6rt\u00e9nhessenek.<\/li>\n<\/ul>\n<p>\nVizsg\u00e1ljuk meg a mesters\u00e9ges intelligencia megk\u00f6zel\u00edt\u00e9seit, amelyek \u00e1tfogj\u00e1k a Sense\/Think\/Act ciklust.<\/p>\n<h3>Alapvet\u0151 d\u00f6nt\u00e9sek meghozatala<\/h3>\n<p>\nKezdj\u00fck a legegyszer\u0171bb j\u00e1t\u00e9kkal \u2014 Pong. A c\u00e9l: a paddlet \u00fagy mozgatni, hogy a labda visszapattanjon r\u00f3la, \u00e9s ne sz\u00e1lljon el mellette. Olyan ez, mint a tenisz, ahol veres\u00e9get szenvedsz, ha nem siker\u00fcl vissza\u00fctni a labd\u00e1t. Itt az MI viszonylag egyszer\u0171 feladatot kap \u2014 d\u00f6nteni, hogy melyik ir\u00e1nyba mozgassa a paddlet.<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/e1935d657b9f090bf60c365c21e8f92b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Felt\u00e9teles oper\u00e1torok<\/h3>\n<p>\nAz MI sz\u00e1m\u00e1ra a Pong j\u00e1t\u00e9kban a legnyilv\u00e1nval\u00f3bb megold\u00e1s \u2014 mindig pr\u00f3b\u00e1lja meg a paddlet al\u00e1 helyezni, ahol a labda van.<\/p>\n<p>Egy egyszer\u0171 algoritmus ehhez, \u00e1lnyelveken \u00edrva:<\/p>\n<p><i>minden frame\/update alatt, am\u00edg a j\u00e1t\u00e9k fut:<br \/>\nha a labda a paddle bal oldal\u00e1n van:<br \/>\n mozd\u00edtsd el a paddlet balra<br \/>\nm\u00e1sk\u00fcl\u00f6nben ha a labda a paddle jobb oldal\u00e1n van:<br \/>\n mozd\u00edtsd el a paddlet jobbra<\/i><\/p>\n<p>Ha a paddle ugyanazzal a sebess\u00e9ggel mozog, mint a labda, ez az ide\u00e1lis algoritmus az MI sz\u00e1m\u00e1ra a Pong j\u00e1t\u00e9kban. Nincs sz\u00fcks\u00e9g bonyol\u00edt\u00e1sokra, ha az adatok \u00e9s a lehets\u00e9ges cselekv\u00e9sek az \u00fcgyn\u00f6k sz\u00e1m\u00e1ra nem t\u00fal sokak.<\/p>\n<p>Ez a megk\u00f6zel\u00edt\u00e9s annyira egyszer\u0171, hogy a Sense\/Think\/Act ciklus alig \u00e9szlelhet\u0151. De van:<\/p>\n<ul>\n<li>A Sense r\u00e9sze k\u00e9t if oper\u00e1torban van. A j\u00e1t\u00e9k tudja, hol van a labda \u00e9s hol a paddle, ez\u00e9rt az MI ehhez az inform\u00e1ci\u00f3hoz fordul. <\/li>\n<li>A Think r\u00e9sze szint\u00e9n k\u00e9t if oper\u00e1torban tal\u00e1lhat\u00f3. Ezek a k\u00e9t megold\u00e1st testes\u00edtik meg, amelyek ebben az esetben k\u00f6lcs\u00f6n\u00f6sen kiz\u00e1rj\u00e1k egym\u00e1st. Ennek eredm\u00e9nyek\u00e9nt egy a h\u00e1rom cselekv\u00e9s k\u00f6z\u00fcl v\u00e1lasztunk \u2014 a paddlet balra mozgatni, jobbra mozgatni, vagy semmit sem tenni, ha m\u00e1r helyesen van elhelyezve.<\/li>\n<li>Az Act r\u00e9sze a Move Paddle Left \u00e9s Move Paddle Right oper\u00e1torokban tal\u00e1lhat\u00f3. A j\u00e1t\u00e9k tervez\u00e9s\u00e9t\u0151l f\u00fcgg\u0151en azonnal vagy bizonyos sebess\u00e9ggel mozgathatj\u00e1k a paddlet. <\/li>\n<\/ul>\n<p>\nAz ilyen megk\u00f6zel\u00edt\u00e9seket reag\u00e1l\u00f3 megold\u00e1soknak nevezik \u2014 van egy egyszer\u0171 szab\u00e1lyk\u00e9szlet (ebben az esetben az if oper\u00e1torok a k\u00f3dban), amelyek reag\u00e1lnak a vil\u00e1g aktu\u00e1lis \u00e1llapot\u00e1ra \u00e9s cselekszenek.<\/p>\n<h3>D\u00f6nt\u00e9si fa<\/h3>\n<p>\nA Pong j\u00e1t\u00e9kkal kapcsolatos p\u00e9lda val\u00f3j\u00e1ban egy form\u00e1lis MI koncepci\u00f3ra hasonl\u00edt, amelyet d\u00f6nt\u00e9si f\u00e1nak neveznek. Az algoritmus v\u00e9gighalad rajta, hogy el\u00e9rje a \u00ablevelet\u00bb \u2014 a d\u00f6nt\u00e9st arr\u00f3l, hogy milyen l\u00e9p\u00e9st tegyen.<\/p>\n<p>K\u00e9sz\u00edts\u00fcnk egy folyamat\u00e1br\u00e1t a d\u00f6nt\u00e9si f\u00e1hoz a paddle algoritmus\u00e1hoz:<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/d3b7290ba93144967cd849416cd5eef3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA fa minden r\u00e9sze node-nak (csom\u00f3pont) h\u00edvj\u00e1k \u2013 Az MI a gr\u00e1fok elm\u00e9let\u00e9t haszn\u00e1lja az ilyen strukt\u00far\u00e1k le\u00edr\u00e1s\u00e1ra. K\u00e9tf\u00e9le csom\u00f3pont l\u00e9tezik:<\/p>\n<ul>\n<li>D\u00f6nt\u00e9si pontok: v\u00e1laszt\u00e1s k\u00e9t alternat\u00edva k\u00f6z\u00f6tt egy adott felt\u00e9tel ellen\u0151rz\u00e9se alapj\u00e1n, ahol minden alternat\u00edva k\u00fcl\u00f6n csom\u00f3pontk\u00e9nt jelenik meg.<\/li>\n<li>V\u00e9gs\u0151 csom\u00f3pontok: v\u00e9grehajtand\u00f3 cselekv\u00e9s, amely a v\u00e9gs\u0151 d\u00f6nt\u00e9st k\u00e9pviseli.<\/li>\n<\/ul>\n<p>\nAz algoritmus a fa els\u0151 csom\u00f3pontj\u00e1val (a \"gy\u00f6k\u00e9rrel\") kezd\u0151dik. Vagy eld\u00f6nti, hogy melyik gyermekcsom\u00f3pontra l\u00e9pjen, vagy v\u00e9grehajt egy m\u0171veletet, amely a csom\u00f3pontban van, \u00e9s befejez\u0151dik.<\/p>\n<p>Mi a haszna, ha a d\u00f6nt\u00e9si fa ugyanazt a munk\u00e1t v\u00e9gzi, mint az if-utas\u00edt\u00f3k az el\u0151z\u0151 r\u00e9szben? Itt egy k\u00f6z\u00f6s rendszer van, ahol minden d\u00f6nt\u00e9snek csak egy felt\u00e9tele \u00e9s k\u00e9t lehets\u00e9ges kimenetele van. Ez lehet\u0151v\u00e9 teszi a fejleszt\u0151 sz\u00e1m\u00e1ra, hogy az adatokb\u00f3l, amelyek a fa d\u00f6nt\u00e9seit k\u00e9pviselik, mesters\u00e9ges intelligenci\u00e1t hozzon l\u00e9tre, elker\u00fclve annak hardk\u00f3dol\u00e1s\u00e1t. Tekints\u00fck ezt t\u00e1bl\u00e1zatos form\u00e1ban:<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/6875293a60ff9d0efa26fb5e1aa4b21c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA k\u00f3d oldal\u00e1n egy sorok olvas\u00e1s\u00e1ra szolg\u00e1l\u00f3 rendszert kapsz. Hozz l\u00e9tre csom\u00f3pontot mindegyik sz\u00e1m\u00e1ra, \u00e9s csatlakoztasd a d\u00f6nt\u00e9si logik\u00e1t a m\u00e1sodik oszlop alapj\u00e1n, valamint a harmadik \u00e9s negyedik oszlop alapj\u00e1n a gyermekcsom\u00f3pontokat. M\u00e9g mindig programoznod kell a felt\u00e9teleket \u00e9s a m\u0171veleteket, de most a j\u00e1t\u00e9kstruktur\u00e1d bonyolultabb\u00e1 v\u00e1lik. Tov\u00e1bbi d\u00f6nt\u00e9seket \u00e9s m\u0171veleteket adsz hozz\u00e1, majd be\u00e1ll\u00edtod az eg\u00e9sz AI-t, egyszer\u0171en szerkesztve a fa defin\u00edci\u00f3j\u00e1t tartalmaz\u00f3 sz\u00f6veges f\u00e1jlt. Ezt k\u00f6vet\u0151en \u00e1tadod a f\u00e1jlt a j\u00e1t\u00e9kkoncept\u0151rnek, aki megv\u00e1ltoztathatja a viselked\u00e9st an\u00e9lk\u00fcl, hogy \u00fajra kellene ford\u00edtania a j\u00e1t\u00e9kot vagy m\u00f3dos\u00edtania a k\u00f3dot.<\/p>\n<p>A d\u00f6nt\u00e9si f\u00e1k rendk\u00edv\u00fcl hasznosak, amikor automatikusan \u00e9p\u00edtik \u0151ket egy nagy p\u00e9ldak\u00e9szlet alapj\u00e1n (p\u00e9ld\u00e1ul az ID3 algoritmus haszn\u00e1lat\u00e1val). Ez hat\u00e9kony \u00e9s nagy teljes\u00edtm\u00e9ny\u0171 eszk\u00f6zz\u00e9 teszi \u0151ket a helyzetek oszt\u00e1lyoz\u00e1s\u00e1ra a kapott adatok alapj\u00e1n. Azonban t\u00falmegy\u00fcnk a puszta rendszeren, amelyet az \u00fcgyn\u00f6k\u00f6k cselekv\u00e9seinek kiv\u00e1laszt\u00e1s\u00e1ra haszn\u00e1lunk.<\/p>\n<h3>Forgat\u00f3k\u00f6nyvek<\/h3>\n<p>\nMegvizsg\u00e1ltuk a d\u00f6nt\u00e9si fa rendszer\u00e9t, amely el\u0151re elk\u00e9sz\u00edtett felt\u00e9teleket \u00e9s m\u0171veleteket haszn\u00e1lt. Az AI-t tervez\u0151 ember \u00fagy szervezheti a f\u00e1t, ahogy akarja, de m\u00e9g mindig a k\u00f3dol\u00f3ra kell t\u00e1maszkodnia, aki mindezt programozta. Mi lenne, ha eszk\u00f6z\u00f6ket tudn\u00e1nk adni a tervez\u0151nek saj\u00e1t felt\u00e9teleik vagy m\u0171veleteik l\u00e9trehoz\u00e1s\u00e1hoz?<\/p>\n<p>Annak \u00e9rdek\u00e9ben, hogy a programoz\u00f3nak ne kelljen k\u00f3dot \u00edrnia a 'Is Ball Left Of Paddle' \u00e9s 'Is Ball Right Of Paddle' felt\u00e9telekhez, olyan rendszert alkothat, ahol a tervez\u0151 r\u00f6gz\u00edtheti a felt\u00e9teleket e \u00e9rt\u00e9kek ellen\u0151rz\u00e9s\u00e9re. \u00cdgy a d\u00f6nt\u00e9si fa adatai \u00edgy n\u00e9zn\u00e9nek ki:<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/8e77f7c3410d097e8b7d8e1209355cc6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAlapvet\u0151en ugyanolyan, mint az els\u0151 t\u00e1bl\u00e1zatban, de a megold\u00e1sok saj\u00e1t k\u00f3ddal rendelkeznek, amely egy kicsit hasonl\u00edt az if-utas\u00edt\u00e1s felt\u00e9teles r\u00e9sz\u00e9re. A k\u00f3d oldal\u00e1n ez a m\u00e1sodik oszlopban olvashat\u00f3 a d\u00f6nt\u00e9si csom\u00f3pontok sz\u00e1m\u00e1ra, de a konkr\u00e9t felt\u00e9tel keres\u00e9se (Is Ball Left Of Paddle) helyett a felt\u00e9teles kifejez\u00e9st \u00e9rt\u00e9keli, \u00e9s visszaadja az igaz vagy hamis \u00e9rt\u00e9ket ennek megfelel\u0151en. Ezt a Lua vagy Angelscript script nyelv seg\u00edts\u00e9g\u00e9vel v\u00e9gzik. Ezekkel a fejleszt\u0151 k\u00e9pes saj\u00e1t j\u00e1t\u00e9k\u00e1nak objektumait (labda \u00e9s \u00fct\u0151) kezelni, \u00e9s olyan v\u00e1ltoz\u00f3kat l\u00e9trehozni, amelyek el\u00e9rhet\u0151ek a scriptben (ball.position). Ezen k\u00edv\u00fcl a scriptnyelv egyszer\u0171bb, mint a C++. Nem ig\u00e9nyel teljes ford\u00edt\u00e1si szakaszt, \u00edgy ide\u00e1lis a j\u00e1t\u00e9k logik\u00e1j\u00e1nak gyors m\u00f3dos\u00edt\u00e1s\u00e1hoz, \u00e9s lehet\u0151v\u00e9 teszi a \u201enem programoz\u00f3k\u201d sz\u00e1m\u00e1ra, hogy saj\u00e1t funkci\u00f3kat hozzanak l\u00e9tre.<\/p>\n<p>A fenti p\u00e9ld\u00e1ban a scriptnyelv \u00e1ltal\u00e1nosan csak a felt\u00e9teles kifejez\u00e9s \u00e9rt\u00e9kel\u00e9s\u00e9re van haszn\u00e1lva, de tev\u00e9kenys\u00e9gekre is alkalmazhat\u00f3. P\u00e9ld\u00e1ul az Move Paddle Right adatok scriptutas\u00edt\u00e1ss\u00e1 v\u00e1lhatnak (ball.position.x += 10). \u00cdgy a tev\u00e9kenys\u00e9g is a scriptben hat\u00e1rozhat\u00f3 meg, an\u00e9lk\u00fcl, hogy a Move Paddle Right programoz\u00e1sa sz\u00fcks\u00e9ges lenne.<\/p>\n<p>M\u00e9g tov\u00e1bb is mehet\u00fcnk, \u00e9s teljes d\u00f6nt\u00e9si f\u00e1kat \u00edrhatunk script nyelven. Ez k\u00f3d lesz, amely mereven k\u00f3dolt (hardcoded) felt\u00e9teles oper\u00e1torok form\u00e1j\u00e1ban jelenik meg, de ezek k\u00fcls\u0151 scriptf\u00e1jlokban tal\u00e1lhat\u00f3k, amelyek \u00edgy m\u00f3dos\u00edthat\u00f3k an\u00e9lk\u00fcl, hogy az eg\u00e9sz programot \u00fajra kellene ford\u00edtani. Gyakran m\u00f3dos\u00edthatja a scriptf\u00e1jlt k\u00f6zvetlen\u00fcl a j\u00e1t\u00e9k sor\u00e1n, hogy gyorsan tesztelhessen k\u00fcl\u00f6nb\u00f6z\u0151 AI reakci\u00f3kat.<\/p>\n<h3>Esem\u00e9nyekre reag\u00e1l\u00e1s<\/h3>\n<p>\nA fenti p\u00e9ld\u00e1k t\u00f6k\u00e9letesen illeszkednek a Ponghoz. Folyamatosan futtatj\u00e1k a Sense\/Think\/Act ciklust, \u00e9s az utols\u00f3 vil\u00e1g \u00e1llapota alapj\u00e1n cselekszenek. De bonyolultabb j\u00e1t\u00e9kokban k\u00fcl\u00f6n esem\u00e9nyekre kell reag\u00e1lni, nem pedig mindent egyszerre \u00e9rt\u00e9kelni. A Pong ebb\u0151l a szempontb\u00f3l m\u00e1r nem a legjobb p\u00e9lda. V\u00e1lasszunk m\u00e1sikat. <\/p>\n<p>K\u00e9pzelj\u00fcnk el egy l\u00f6v\u00f6ld\u00f6z\u0151s j\u00e1t\u00e9kot, ahol az ellenfelek mozdulatlanok, am\u00edg \u00e9szre nem veszik a j\u00e1t\u00e9kost, ezut\u00e1n pedig a 'szak\u00e9rtelm\u00fck' alapj\u00e1n cselekednek: valaki rohamozni fog, valaki t\u00e1volr\u00f3l t\u00e1mad. Ez m\u00e9g mindig egy alap reag\u00e1l\u00f3 rendszer - 'ha a j\u00e1t\u00e9kos \u00e9szlelve van, akkor csin\u00e1lj valamit', - de logikailag feloszthat\u00f3 Player Seen esem\u00e9nyre (j\u00e1t\u00e9kos \u00e9szlelve) \u00e9s reakci\u00f3ra (v\u00e1lasszon v\u00e1laszt \u00e9s hajtsa v\u00e9gre).<\/p>\n<p>Ez visszavezeti minket a Sense\/Tthink\/Act ciklushoz. Meg tudjuk \u00edrni a Sense r\u00e9szt, amely minden egyes frame-n\u00e9l ellen\u0151rzi, hogy a mesters\u00e9ges intelligencia l\u00e1tja-e a j\u00e1t\u00e9kost. Ha nem, akkor semmi nem t\u00f6rt\u00e9nik, de ha igen, akkor egy Player Seen esem\u00e9ny keletkezik. A k\u00f3dnak lesz egy k\u00fcl\u00f6n r\u00e9sze, amely azt mondja: \u00abamikor a Player Seen esem\u00e9ny t\u00f6rt\u00e9nik, csin\u00e1lj \u00bb, ahol  \u2014 a v\u00e1lasz, amelyre sz\u00fcks\u00e9ged van a Think \u00e9s Act r\u00e9szek h\u00edv\u00e1s\u00e1hoz. \u00cdgy be\u00e1ll\u00edtod a Player Seen esem\u00e9nyre adott reakci\u00f3kat: a \u201et\u00e1mad\u00f3\u201d karakterre \u2014 ChargeAndAttack, a mesterl\u00f6v\u00e9szekre pedig \u2014 HideAndSnipe. Ezeket a kapcsolatokat adatf\u00e1jlban is l\u00e9trehozhatod, hogy gyorsan szerkeszthesd an\u00e9lk\u00fcl, hogy \u00fajra kellene ford\u00edtani. Itt is haszn\u00e1lhatod a szkriptnyelvet.<\/p>\n<h2>Bonyolult d\u00f6nt\u00e9shozatal<\/h2>\n<p>\nB\u00e1r az egyszer\u0171 reakci\u00f3s rendszerek nagyon hat\u00e9konyak, sok olyan helyzet van, amikor nem elegend\u0151ek. N\u00e9ha k\u00fcl\u00f6nb\u00f6z\u0151 d\u00f6nt\u00e9seket kell hozni, amelyek azon alapulnak, hogy az \u00fcgyn\u00f6k jelenleg mit csin\u00e1l, de ezt nehezen lehet felt\u00e9telk\u00e9nt prezent\u00e1lni. N\u00e9ha t\u00fal sok felt\u00e9tel l\u00e9tezik ahhoz, hogy hat\u00e9konyan \u00e1br\u00e1zolhassuk \u0151ket egy d\u00f6nt\u00e9si f\u00e1ban vagy szkripten. N\u00e9ha el\u0151re kell \u00e9rt\u00e9kelni, hogyan v\u00e1ltozik a helyzet, miel\u0151tt d\u00f6nt\u00e9st hozunk a k\u00f6vetkez\u0151 l\u00e9p\u00e9sr\u0151l. Ezeknek a probl\u00e9m\u00e1knak a megold\u00e1s\u00e1hoz bonyolultabb megk\u00f6zel\u00edt\u00e9sek sz\u00fcks\u00e9gesek.<\/p>\n<h3>V\u00e9gs\u0151 \u00e1llapotg\u00e9p<\/h3>\n<p>\nA v\u00e9gs\u0151 \u00e1llapotg\u00e9p vagy FSM (v\u00e9gs\u0151 automata) egy m\u00f3dja annak, hogy elmondjuk, hogy \u00fcgyn\u00f6k\u00fcnk \u00e9ppen egy adott \u00e1llapotban van a t\u00f6bb lehets\u00e9ges \u00e1llapot k\u00f6z\u00fcl, \u00e9s hogy k\u00e9pes \u00e1tmenni az egyik \u00e1llapotb\u00f3l a m\u00e1sikba. Ezeknek az \u00e1llapotoknak a sz\u00e1ma meghat\u00e1rozott \u2014 ez\u00e9rt van a neve is. A legjobb p\u00e9lda az \u00e9letb\u0151l egy k\u00f6zleked\u00e9si l\u00e1mpa. K\u00fcl\u00f6nb\u00f6z\u0151 helyeken m\u00e1s \u00e9s m\u00e1s f\u00e9nyel\u0151\u00edr\u00e1sok vannak, de az elv ugyanaz \u2014 minden egyes \u00e1llapot valamit reprezent\u00e1l (\u00e1llj, menj stb.). A k\u00f6zleked\u00e9si l\u00e1mpa b\u00e1rmely pillanatban csak egy \u00e1llapotban van, \u00e9s egyszer\u0171 szab\u00e1lyok alapj\u00e1n l\u00e9phet \u00e1t egyik \u00e1llapotb\u00f3l a m\u00e1sikba.<\/p>\n<p>A j\u00e1t\u00e9kok NPC-ivel hasonl\u00f3 a helyzet. P\u00e9ldak\u00e9nt vegy\u00fcnk egy \u0151rt a k\u00f6vetkez\u0151 \u00e1llapotokkal:<\/p>\n<ul>\n<li>P\u00e1rhuzamosan (Patrolling).<\/li>\n<li>T\u00e1mad\u00f3 (Attacking).<\/li>\n<li>Menek\u00fcl (Fleeing).<\/li>\n<\/ul>\n<p>\n\u00c9s ezek a felt\u00e9telek az \u00e1llapot\u00e1nak megv\u00e1ltoztat\u00e1s\u00e1hoz:<\/p>\n<ul>\n<li>Ha az \u0151r l\u00e1tja az ellenfelet, megt\u00e1madja.<\/li>\n<li>Ha az \u0151r t\u00e1mad, de m\u00e1r nem l\u00e1tja az ellenfelet, visszat\u00e9r a p\u00e1rhuzamos j\u00e1ratba.<\/li>\n<li>Ha az \u0151r t\u00e1mad, de s\u00falyosan megsebes\u00fclt, menek\u00fcl.<\/li>\n<\/ul>\n<p>\nA if-operators can also be written with a guard state variable and various checks: is there an enemy nearby, what is the NPC's health level, etc. Let's add a few more states:<\/p>\n<ul>\n<li>Tev\u00e9kenys\u00e9g hi\u00e1nya (Idling) - a j\u00e1r\u0151r\u00f6z\u00e9sek k\u00f6z\u00f6tt.<\/li>\n<li>Keres\u00e9s (Searching) - amikor a megfigyelt ellens\u00e9g elb\u00fajt.<\/li>\n<li>Seg\u00edts\u00e9get k\u00e9rni (Finding Help) - amikor az ellens\u00e9g \u00e9szlelve van, de t\u00fal er\u0151s ahhoz, hogy egyed\u00fcl harcoljunk vele.<\/li>\n<\/ul>\n<p>\nMindenkinek korl\u00e1tozott v\u00e1laszt\u00e1sa van - p\u00e9ld\u00e1ul a \u0151r nem megy el keresni a rejt\u0151zk\u00f6d\u0151 ellens\u00e9get, ha alacsony az \u00e9letereje.<\/p>\n<p>V&eacute;g&uuml;l a hatalmas &#039;ha&#039; lista &lt;x \u0438 y, \u043d\u043e \u043d\u0435 z&gt;, akkor &lt;p&gt;, t&uacute;l terjessz&eacute; v&aacute;lhat, ez&eacute;rt &eacute;rdemes form&aacute;lis m&oacute;dszert kidolgozni, amely lehet\u0151v&eacute; teszi sz&aacute;munkra, hogy szem el\u0151tt tartsuk az &aacute;llapotokat &eacute;s az &aacute;llapotok k&ouml;z&ouml;tti &aacute;tmeneteket. Ehhez vegy&uuml;k figyelembe az &ouml;sszes &aacute;llapotot, &eacute;s minden &aacute;llapot al&aacute; &iacute;rjuk fel a t&ouml;bbi &aacute;llapotba val&oacute; &aacute;tmeneteket a sz&uuml;ks&eacute;ges felt&eacute;teleikkel egy&uuml;tt.<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/ba4c401aa20de3d22d2478cba5a4b1ec.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEz az \u00e1llapot\u00e1tmenetek t\u00e1bl\u00e1zata - egy \u00f6sszetett m\u00f3dja az FSM bemutat\u00e1s\u00e1nak. Rajzoljunk egy diagramot, \u00e9s teljes \u00e1ttekint\u00e9st kapunk arr\u00f3l, hogyan v\u00e1ltozik az NPC viselked\u00e9se.<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/b4182359983cf573872dacc575af13dc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA diagram t\u00fckr\u00f6zi ennek az \u00fcgyn\u00f6knek a d\u00f6nt\u00e9shozatali l\u00e9nyeg\u00e9t a jelenlegi helyzet alapj\u00e1n. Minden ny\u00edl az \u00e1llapotok k\u00f6z\u00f6tti \u00e1tmenetet mutatja, ha a mellette l\u00e9v\u0151 felt\u00e9tel igaz.<\/p>\n<p>Minden friss\u00edt\u00e9sn\u00e9l ellen\u0151rizz\u00fck az \u00fcgyn\u00f6k aktu\u00e1lis \u00e1llapot\u00e1t, \u00e1tn\u00e9zz\u00fck az \u00e1tmenetek list\u00e1j\u00e1t, \u00e9s ha az \u00e1tmenet felt\u00e9telei teljes\u00fclnek, \u00faj \u00e1llapotot vesz fel. P\u00e9ld\u00e1ul minden egyes k\u00e9pkock\u00e1ban ellen\u0151rizni kell, hogy letelt-e a 10 m\u00e1sodperces id\u0151z\u00edt\u0151, \u00e9s ha igen, az Idling \u00e1llapotb\u00f3l az \u0151r a Patrolling \u00e1llapotba l\u00e9p. Hasonl\u00f3k\u00e9ppen, az Attacking \u00e1llapot ellen\u0151rzi az \u00fcgyn\u00f6k eg\u00e9szs\u00e9g\u00e9t - ha az alacsony, akkor a Fleeing \u00e1llapotba l\u00e9p.<\/p>\n<p>Ez az \u00e1llapotok k\u00f6z\u00f6tti \u00e1tmenetek kezel\u00e9se, de mi a helyzet a konkr\u00e9t \u00e1llapotokkal kapcsolatos viselked\u00e9ssel? Ami a konkr\u00e9t \u00e1llapotok t\u00e9nyleges viselked\u00e9s\u00e9nek megval\u00f3s\u00edt\u00e1s\u00e1t illeti, \u00e1ltal\u00e1ban k\u00e9tf\u00e9le 'hook' l\u00e9tezik, ahol a m\u0171veleteket az FSM-hez rendelj\u00fck:<\/p>\n<ul>\n<li>Azok a tev\u00e9kenys\u00e9gek, amelyeket id\u0151r\u0151l id\u0151re v\u00e9grehajtunk az aktu\u00e1lis \u00e1llapot sz\u00e1m\u00e1ra.<\/li>\n<li>Azok a tev\u00e9kenys\u00e9gek, amelyeket az egyik \u00e1llapotb\u00f3l a m\u00e1sikba val\u00f3 \u00e1tl\u00e9p\u00e9skor v\u00e9gz\u00fcnk.<\/li>\n<\/ul>\n<p>\nP\u00e9ld\u00e1k az els\u0151 t\u00edpusra. A Patrolling \u00e1llapot minden egyes k\u00e9pkock\u00e1ban mozgatja az \u00fcgyn\u00f6k\u00f6t a j\u00e1r\u0151rutvonal ment\u00e9n. Az Attacking \u00e1llapot minden egyes k\u00e9pkock\u00e1ban megpr\u00f3b\u00e1l t\u00e1mad\u00e1st ind\u00edtani, vagy \u00e1tmenni egy olyan \u00e1llapotba, amikor ez lehets\u00e9ges.<\/p>\n<p>A m\u00e1sodik t\u00edpust tekintve vizsg\u00e1ljuk meg az \u00e1tv\u00e1lt\u00e1st: \"ha az ellens\u00e9g l\u00e1that\u00f3 \u00e9s az ellens\u00e9g t\u00fal er\u0151s, akkor kapcsol\u00f3djunk a Seg\u00edts\u00e9g Keres\u00e9se \u00e1llapotba. Az \u00fcgyn\u00f6knek ki kell v\u00e1lasztania, hov\u00e1 menjen seg\u00edts\u00e9g\u00e9rt, \u00e9s meg kell \u0151riznie ezt az inform\u00e1ci\u00f3t, hogy a Seg\u00edts\u00e9g Keres\u00e9se \u00e1llapot tudja, hov\u00e1 forduljon. Miut\u00e1n a seg\u00edts\u00e9g megtal\u00e1l\u00f3dott, az \u00fcgyn\u00f6k visszat\u00e9r az T\u00e1mad\u00e1s \u00e1llapotba. Ekkor szeretn\u00e9 t\u00e1j\u00e9koztatni a sz\u00f6vets\u00e9gest a fenyeget\u00e9sr\u0151l, \u00edgy l\u00e9trej\u00f6het a Fenyeget\u00e9s Bejelent\u00e9se akci\u00f3.<\/p>\n<p>\u00dajra megn\u00e9zhetj\u00fck ezt a rendszert a Sense\/Think\/Act ciklus szemsz\u00f6g\u00e9b\u0151l. A Sense az \u00e1tv\u00e1lt\u00e1si logik\u00e1ban haszn\u00e1lt adatokban \u00f6lt testet. A Think az egyes \u00e1llapotokban el\u00e9rhet\u0151 \u00e1tv\u00e1lt\u00e1sokban. Az Act pedig a periodikusan, az \u00e1llapotkeretein bel\u00fcl v\u00e9gzett akci\u00f3kban val\u00f3sul meg.<\/p>\n<p>N\u00e9ha a folyamatos \u00e1tmeneti \u00e1llapotok ellen\u0151rz\u00e9se k\u00f6lts\u00e9ges lehet. P\u00e9ld\u00e1ul, ha minden \u00fcgyn\u00f6k bonyolult sz\u00e1m\u00edt\u00e1sokat v\u00e9gez minden egyes k\u00e9pkock\u00e1n, hogy meghat\u00e1rozza, l\u00e1t-e ellens\u00e9geket \u00e9s hogy \u00e1tt\u00e9rhet-e a J\u00e1r\u0151r\u00f6z\u00e9s \u00e1llapotb\u00f3l a T\u00e1mad\u00e1s \u00e1llapotba \u2014 ez rengeteg processzort ig\u00e9nyel. <\/p>\n<p>A vil\u00e1g \u00e1llapot\u00e1ban bek\u00f6vetkez\u0151 fontos v\u00e1ltoz\u00e1sokat olyan esem\u00e9nyekk\u00e9nt kell tekinteni, amelyeket a megjelen\u00e9s\u00fckkor fognak feldolgozni. Ahelyett, hogy a FSM minden egyes k\u00e9pkock\u00e1n ellen\u0151rizn\u00e9, hogy \"l\u00e1tja-e az \u00fcgyn\u00f6k a j\u00e1t\u00e9kost?\", be lehet \u00e1ll\u00edtani egy k\u00fcl\u00f6n rendszert, amely ritk\u00e1bban v\u00e9gez ellen\u0151rz\u00e9seket (p\u00e9ld\u00e1ul m\u00e1sodpercenk\u00e9nt 5 alkalommal). Az eredm\u00e9ny pedig a J\u00e1t\u00e9kos L\u00e1tva, amikor az ellen\u0151rz\u00e9s sikeres. <\/p>\n<p>Ez \u00e1tad\u00f3dik a FSM-nek, amelynek most \u00e1t kell t\u00e9rnie a J\u00e1t\u00e9kos L\u00e1tva esem\u00e9ny megkap\u00e1s\u00e1ra \u00e9s ennek megfelel\u0151en reag\u00e1lni. Az \u00f6sszvisz\u00e1lyi viselked\u00e9s ugyanaz, kiv\u00e9ve, hogy szinte \u00e9szrev\u00e9tlen k\u00e9sleked\u00e9s van a v\u00e1laszad\u00e1s el\u0151tt. De ez\u00e1ltal a teljes\u00edtm\u00e9ny javult az\u00e1ltal, hogy a Sense egy r\u00e9sz\u00e9t k\u00fcl\u00f6n programr\u00e9szbe elk\u00fcl\u00f6n\u00edtett\u00fck.<\/p>\n<h3>Hierarchikus v\u00e9ges \u00e1llapotg\u00e9p<\/h3>\n<p>\nAzonban nagy FSM-ekkel dolgozni nem mindig k\u00e9nyelmes. Ha ki szeretn\u00e9nk b\u0151v\u00edteni a t\u00e1mad\u00e1si \u00e1llapotot, k\u00fcl\u00f6n MeleeAttacking (k\u00f6zelharc) \u00e9s RangedAttacking (t\u00e1voli harc) \u00e1llapotokkal, meg kell v\u00e1ltoztatnunk azokat az \u00e1tmeneteket, amelyek minden m\u00e1s \u00e1llapotb\u00f3l az T\u00e1mad\u00e1s \u00e1llapotba vezetnek (jelenlegi \u00e9s j\u00f6v\u0151beli).<\/p>\n<p>Bizony\u00e1ra \u00e9szrevetted, hogy p\u00e9ld\u00e1nkban sok ism\u00e9tl\u0151d\u0151 \u00e1tmenet van. A legt\u00f6bb \u00e1tmenet az Idling \u00e1llapotban megegyezik a Patrolling \u00e1llapotban l\u00e9v\u0151kkel. J\u00f3 lenne elker\u00fclni a megism\u00e9tl\u00e9st, k\u00fcl\u00f6n\u00f6sen, ha tov\u00e1bbi hasonl\u00f3 \u00e1llapotokat adunk hozz\u00e1. \u00c9rdemes lenne az Idling \u00e9s Patrolling \u00e1llapotokat egy k\u00f6z\u00f6s \u201enem harci\u201d c\u00edmke al\u00e1 csoportos\u00edtani, ahol csak egy k\u00f6z\u00f6s \u00e1tmeneti halmaz van a harci \u00e1llapotokhoz. Ha ezt a c\u00edmk\u00e9t \u00e1llapotk\u00e9nt k\u00e9pzelj\u00fck el, akkor az Idling \u00e9s Patrolling als\u00f3 \u00e1llapotokk\u00e1 v\u00e1lnak. P\u00e9lda egy k\u00fcl\u00f6n \u00e1tmeneti t\u00e1bl\u00e1zat haszn\u00e1lat\u00e1ra az \u00faj nem harci als\u00f3 \u00e1llapothoz:<\/p>\n<p><i>Alapvet\u0151 \u00e1llapotok:<\/i><br \/>\n<img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/d86dd918acbe81b9bf22c2fb34aecee3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<i>Nem harci \u00e1llapot:<\/i><br \/>\n<img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/9d5bc2053010a32c5f68d7f0192c04ed.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c9s diagram form\u00e1j\u00e1ban:<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/0ccf95ecafa9ce2a6ea5b5b9833ddc4f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEz ugyanaz a rendszer, de \u00faj nem harci \u00e1llapottal, amely mag\u00e1ban foglalja az Idling \u00e9s Patrolling \u00e1llapotokat. Mivel minden \u00e1llapot tartalmaz egy FSM-t als\u00f3 \u00e1llapotokkal (az als\u00f3 \u00e1llapotok pedig saj\u00e1t FSM-mel rendelkeznek \u2014 \u00e9s \u00edgy tov\u00e1bb, ahogy sz\u00fcks\u00e9ges), kapunk egy Hierarchical Finite State Machine-t vagy HFSM-t (hierarchikus v\u00e9g\u00e1llapot g\u00e9p). A nem harci \u00e1llapot csoportos\u00edt\u00e1s\u00e1val sok f\u00f6l\u00f6sleges \u00e1tmenetet elt\u00e1vol\u00edtottunk. Ugyanezt megtehetj\u00fck b\u00e1rmely \u00faj \u00e1llapotra, amely k\u00f6z\u00f6s \u00e1tmeneteket tartalmaz. P\u00e9ld\u00e1ul, ha a j\u00f6v\u0151ben az Attacking \u00e1llapotot MeleeAttacking \u00e9s MissileAttacking \u00e1llapotokra b\u0151v\u00edtj\u00fck, akkor ezek als\u00f3 \u00e1llapotokk\u00e1 v\u00e1lnak, amelyek egym\u00e1s k\u00f6z\u00f6tt l\u00e9pnek \u00e1t az ellens\u00e9g t\u00e1vols\u00e1ga \u00e9s a l\u0151szer rendelkez\u00e9sre \u00e1ll\u00e1sa alapj\u00e1n. V\u00e9g\u00fcl a bonyolult viselked\u00e9si modellek \u00e9s az almodellek a lehet\u0151 legkevesebb ism\u00e9tl\u0151d\u0151 \u00e1tmenettel \u00e1br\u00e1zolhat\u00f3k.<\/p>\n<h3>Viselked\u00e9si fa<\/h3>\n<p>\nHFSM seg\u00edts\u00e9g\u00e9vel bonyolult viselked\u00e9si kombin\u00e1ci\u00f3k hozhat\u00f3k l\u00e9tre egyszer\u0171 m\u00f3don. Mindazon\u00e1ltal van egy kis neh\u00e9zs\u00e9g, hogy a d\u00f6nt\u00e9shozatal \u00e1tmeneti szab\u00e1lyok form\u00e1j\u00e1ban szorosan kapcsol\u00f3dik az aktu\u00e1lis \u00e1llapothoz. \u00c9s sok j\u00e1t\u00e9kban ez pontosan az, amire sz\u00fcks\u00e9g van. Az \u00e1llapotok hierarchi\u00e1j\u00e1nak gondos haszn\u00e1lata cs\u00f6kkentheti az \u00e1tmenetek ism\u00e9tl\u0151d\u00e9s\u00e9t. De n\u00e9ha olyan szab\u00e1lyokra van sz\u00fcks\u00e9g, amelyek f\u00fcggetlen\u00fcl att\u00f3l m\u0171k\u00f6dnek, hogy melyik \u00e1llapotban vagy, vagy amelyek szinte b\u00e1rmely \u00e1llapotban alkalmazhat\u00f3k. P\u00e9ld\u00e1ul, ha az \u00fcgyn\u00f6k eg\u00e9szs\u00e9ge 25% al\u00e1 cs\u00f6kkent, szeretn\u00e9d, ha menek\u00fclne, f\u00fcggetlen\u00fcl att\u00f3l, hogy harcban, t\u00e9tlen\u00fcl vagy besz\u00e9lget\u00e9s k\u00f6zben van \u2014 ezt a felt\u00e9telt minden \u00e1llapotba be kell illesztened. Ha pedig k\u00e9s\u0151bb a tervez\u0151d meg akarja v\u00e1ltoztatni az alacsony eg\u00e9szs\u00e9g k\u00fcsz\u00f6b\u00e9t 25%-r\u00f3l 10%-ra, akkor ezt ism\u00e9t kezelni kell.<\/p>\n<p>Ide\u00e1lis esetben sz\u00fcks\u00e9g van egy olyan rendszerre, amelyben a \"milyen \u00e1llapotban legy\u00fcnk\" d\u00f6nt\u00e9sek az \u00e1llapotokon k\u00edv\u00fcl helyezkednek el, \u00edgy m\u00f3dos\u00edt\u00e1sokat csak egy helyen kell v\u00e9gezni, an\u00e9lk\u00fcl hogy a v\u00e1lt\u00e1si felt\u00e9teleket meg\u00e9rinten\u00e9nk. Itt l\u00e9pnek \u00e9letbe a viselked\u00e9si f\u00e1k.<\/p>\n<p>T\u00f6bbf\u00e9le megval\u00f3s\u00edt\u00e1s l\u00e9tezik, de a l\u00e9nyeg minden esetben hasonl\u00f3 a d\u00f6nt\u00e9si f\u00e1hoz: az algoritmus a \"gy\u00f6k\u00e9r\" csom\u00f3ponttal kezd\u0151dik, a f\u00e1ban pedig csom\u00f3pontok tal\u00e1lhat\u00f3k, amelyek vagy d\u00f6nt\u00e9seket, vagy m\u0171veleteket k\u00e9pviselnek. Igaz, van n\u00e9h\u00e1ny kulcsfontoss\u00e1g\u00fa k\u00fcl\u00f6nbs\u00e9g:<\/p>\n<ul>\n<li>Most a csom\u00f3pontok h\u00e1rom lehets\u00e9ges eredm\u00e9nyt adnak: Sikeres (ha a munka elv\u00e9gezve), Sikertelen (ha nem tudja elind\u00edtani) vagy Folyamatban (ha m\u00e9g mindig fut \u00e9s nincs v\u00e9gs\u0151 eredm\u00e9ny).<\/li>\n<li>Nincs t\u00f6bb\u00e9 d\u00f6nt\u00e9si csom\u00f3pont a k\u00e9t alternat\u00edva k\u00f6z\u00f6tti v\u00e1laszt\u00e1shoz. Helyette Decorator csom\u00f3pontok vannak, amelyeknek egyetlen gyermek csom\u00f3pontja van. Ha azok Sikeresek, akkor v\u00e9grehajtj\u00e1k egyetlen gyermek csom\u00f3pontjukat.<\/li>\n<li>A m\u0171veleteket v\u00e9grehajt\u00f3 csom\u00f3pontok Running \u00e9rt\u00e9ket adnak vissza, ami a folyamatban l\u00e9v\u0151 m\u0171veleteket reprezent\u00e1lja.<\/li>\n<\/ul>\n<p>\nEz a kis csom\u00f3pontk\u00e9szlet sok bonyolult viselked\u00e9si modell l\u00e9trehoz\u00e1s\u00e1ra egyes\u00edthet\u0151. Gondoljunk a kor\u00e1bbi p\u00e9lda HFSM \u0151r\u00e9re viselked\u00e9si fa form\u00e1j\u00e1ban:<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/5eaa5c725e4ada8285f16f95bb206d53.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEzzel a strukt\u00far\u00e1val nem lenne ny\u00edlt \u00e1tmenet az Idling\/Patrolling \u00e1llapotokb\u00f3l az Attacking vagy b\u00e1rmely m\u00e1s \u00e1llapotba. Ha az ellens\u00e9g l\u00e1that\u00f3 \u00e9s a karakter \u00e9lete alacsony, a v\u00e9grehajt\u00e1s meg\u00e1ll a Fleeing csom\u00f3ponton, f\u00fcggetlen\u00fcl att\u00f3l, hogy kor\u00e1bban melyik csom\u00f3pontot hajtotta v\u00e9gre \u2014 Patrolling, Idling, Attacking vagy b\u00e1rmely m\u00e1s.<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/e1c1dcc2055174aa7cfa846364b1709a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA viselked\u00e9si f\u00e1k bonyolultak \u2014 sokf\u00e9lek\u00e9ppen lehet \u0151ket \u00f6ssze\u00e1ll\u00edtani, \u00e9s a dekor\u00e1torok \u00e9s \u00f6sszetett csom\u00f3pontok helyes kombin\u00e1ci\u00f3j\u00e1nak megtal\u00e1l\u00e1sa is probl\u00e9m\u00e1s lehet. Felmer\u00fcl a k\u00e9rd\u00e9s, hogy milyen gyakran ellen\u0151rizz\u00fck a f\u00e1t \u2014 minden r\u00e9sz\u00e9n v\u00e9gig kell menni, vagy csak akkor, amikor egy felt\u00e9tel megv\u00e1ltozik? Hogyan t\u00e1roljuk a csom\u00f3pontokhoz kapcsol\u00f3d\u00f3 \u00e1llapotokat \u2014 hogyan tudjuk, mikor voltunk Idling \u00e1llapotban 10 m\u00e1sodpercig, vagy hogyan tudjuk, milyen csom\u00f3pontokat hajtottunk v\u00e9gre legut\u00f3bb, hogy helyesen kezelj\u00fck a sorrendet?<\/p>\n<p>Ez az oka annak, hogy sz\u00e1mos megval\u00f3s\u00edt\u00e1s l\u00e9tezik. P\u00e9ld\u00e1ul egyes rendszerekben a dekor\u00e1tor csom\u00f3pontokat be\u00e9p\u00edtett dekor\u00e1torokkal helyettes\u00edtett\u00e9k. Ezek \u00fajra\u00e9rt\u00e9kelik a f\u00e1t a dekor\u00e1tor felt\u00e9teleinek megv\u00e1ltoz\u00e1sa eset\u00e9n, seg\u00edtenek a csom\u00f3pontok \u00f6sszekapcsol\u00e1s\u00e1ban \u00e9s id\u0151szakos friss\u00edt\u00e9seket biztos\u00edtanak.<\/p>\n<h3>Haszn\u00e1lati alap\u00fa rendszer<\/h3>\n<p>\nN\u00e9h\u00e1ny j\u00e1t\u00e9knak sz\u00e1mos k\u00fcl\u00f6nf\u00e9le mechanik\u00e1ja van. El\u0151ny\u00f6s, ha ezek mind \u00e9lvezhetik az egyszer\u0171 \u00e9s \u00e1ltal\u00e1nos \u00e1tmeneti szab\u00e1lyok el\u0151nyeit, de nem sz\u00fcks\u00e9ges, hogy teljes viselked\u00e9si f\u00e1t alkossanak. Ahelyett, hogy vil\u00e1gos v\u00e1laszt\u00e1si lehet\u0151s\u00e9gekkel vagy lehets\u00e9ges cselekv\u00e9sek f\u00e1j\u00e1val rendelkezn\u00e9nek, k\u00f6nnyebb minden cselekv\u00e9st tanulm\u00e1nyozni \u00e9s kiv\u00e1lasztani a legmegfelel\u0151bbet a pillanatban.<\/p>\n<p>A haszonelv\u0171 rendszer (utility-based system) ebben seg\u00edt. Ez egy olyan rendszer, ahol az \u00fcgyn\u00f6knek sz\u00e1mos cselekedete van, \u00e9s \u0151 maga v\u00e1lasztja ki, hogy melyiket hajtja v\u00e9gre, a cselekv\u00e9sek relat\u00edv hasznoss\u00e1ga alapj\u00e1n. A hasznoss\u00e1g egy \u00f6nk\u00e9nyes m\u00e9rt\u00e9ke annak, mennyire fontos vagy k\u00edv\u00e1natos egy adott cselekv\u00e9s v\u00e9grehajt\u00e1sa az \u00fcgyn\u00f6k sz\u00e1m\u00e1ra. <\/p>\n<p>A cselekv\u00e9s hasznoss\u00e1g\u00e1t, amelyet az aktu\u00e1lis \u00e1llapot \u00e9s k\u00f6rnyezet alapj\u00e1n sz\u00e1m\u00edtanak ki, az \u00fcgyn\u00f6k b\u00e1rmikor ellen\u0151rizheti, \u00e9s v\u00e1laszthat egy m\u00e1sik, legink\u00e1bb megfelel\u0151 \u00e1llapotot. Ez hasonl\u00edt az FSM-re, kiv\u00e9ve, hogy itt az \u00e1tmenetek minden potenci\u00e1lis \u00e1llapot, bele\u00e9rtve az aktu\u00e1lis \u00e1llapot \u00e9rt\u00e9kel\u00e9se alapj\u00e1n ker\u00fclnek meghat\u00e1roz\u00e1sra. Ne feledj\u00fck, hogy a leghasznosabb cselekv\u00e9st v\u00e1lasztjuk a v\u00e1lt\u00e1shoz (vagy maradunk, ha m\u00e1r v\u00e9grehajtottuk azt). A v\u00e1ltozatoss\u00e1g kedv\u00e9\u00e9rt ez lehet egy s\u00falyozott, de v\u00e9letlenszer\u0171 v\u00e1laszt\u00e1s egy r\u00f6vid list\u00e1b\u00f3l.<\/p>\n<p>A rendszer egy \u00f6nk\u00e9nyes hasznoss\u00e1gi \u00e9rt\u00e9kintervallumot rendel a cselekv\u00e9sekhez \u2014 p\u00e9ld\u00e1ul 0-t\u00f3l (teljesen nem k\u00edv\u00e1natos) 100-ig (teljesen k\u00edv\u00e1natos). Minden cselekv\u00e9shez tartozik egy sor param\u00e9ter, amely befoly\u00e1solja ennek az \u00e9rt\u00e9knek a kisz\u00e1m\u00edt\u00e1s\u00e1t. Visszat\u00e9rve az \u0151r p\u00e9ld\u00e1j\u00e1hoz:<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/085fb2c197bde93d78455d18e63c9c25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAz akci\u00f3k k\u00f6z\u00f6tti \u00e1tmenetek nem egy\u00e9rtelm\u0171ek \u2014 b\u00e1rmely \u00e1llapot k\u00f6vetheti b\u00e1rmely m\u00e1sikat. Az akci\u00f3k priorit\u00e1sai a hasznoss\u00e1gi \u00e9rt\u00e9kel\u00e9sekben tal\u00e1lhat\u00f3ak. Ha az ellens\u00e9g l\u00e1that\u00f3, \u00e9s ez az ellens\u00e9g er\u0151s, m\u00edg a karakter \u00e9lete alacsony, akkor a Fleeing \u00e9s a FindingHelp is magas, nem nulla \u00e9rt\u00e9keket fog visszaadni. Ugyanakkor a FindingHelp mindig magasabb lesz. Hasonl\u00f3k\u00e9ppen, a nem harci akci\u00f3k soha nem adnak vissza 50-n\u00e9l nagyobb \u00e9rt\u00e9ket, ez\u00e9rt mindig alacsonyabbak a harci akci\u00f3kn\u00e1l. Ezt figyelembe kell venni az akci\u00f3k l\u00e9trehoz\u00e1sakor \u00e9s hasznoss\u00e1guk kisz\u00e1m\u00edt\u00e1sakor.<\/p>\n<p>P\u00e9ld\u00e1nkban a tev\u00e9kenys\u00e9gek vagy egy fix \u00e1lland\u00f3 \u00e9rt\u00e9ket, vagy k\u00e9t r\u00f6gz\u00edtett \u00e9rt\u00e9k egyik\u00e9t adj\u00e1k vissza. Egy re\u00e1lisabb rendszer folyamatos \u00e9rt\u00e9ktartom\u00e1nyb\u00f3l adna vissza \u00e9rt\u00e9kel\u00e9st. P\u00e9ld\u00e1ul a Fleeing tev\u00e9kenys\u00e9g magasabb hasznoss\u00e1gi \u00e9rt\u00e9keket ad vissza, ha az \u00fcgyn\u00f6k eg\u00e9szs\u00e9gi \u00e1llapota alacsony, m\u00edg az Attacking tev\u00e9kenys\u00e9g alacsonyabb \u00e9rt\u00e9keket, ha az ellens\u00e9g t\u00fal er\u0151s. Emiatt a Fleeing tev\u00e9kenys\u00e9g priorit\u00e1st \u00e9lvez az Attacking tev\u00e9kenys\u00e9ggel szemben b\u00e1rmilyen helyzetben, amikor az \u00fcgyn\u00f6k \u00fagy \u00e9rzi, hogy nincs el\u00e9g eg\u00e9szs\u00e9ge ahhoz, hogy gy\u0151zz\u00f6n az ellenfel\u00e9n. Ez lehet\u0151v\u00e9 teszi a tev\u00e9kenys\u00e9gek priorit\u00e1sainak m\u00f3dos\u00edt\u00e1s\u00e1t b\u00e1rmilyen sz\u00e1m\u00fa krit\u00e9rium alapj\u00e1n, ami rugalmasabb\u00e1 \u00e9s v\u00e1ltozatosabb\u00e1 teszi ezt a megk\u00f6zel\u00edt\u00e9st, mint a viselked\u00e9si fa vagy az FSM.<\/p>\n<p>Minden tev\u00e9kenys\u00e9g sz\u00e1mos felt\u00e9telt tartalmaz a program kisz\u00e1m\u00edt\u00e1s\u00e1hoz. Ezeket meg lehet \u00edrni szkriptnyelven vagy matematikai formul\u00e1k sorozatak\u00e9nt. A The Sims-ben, amely a karakter napi rutinj\u00e1t modellezi, egy tov\u00e1bbi sz\u00e1m\u00edt\u00e1si szintet vezetnek be \u2014 az \u00fcgyn\u00f6k egy sor \u201emotiv\u00e1ci\u00f3t\u201d kap, amelyek hat\u00e1ssal vannak a hasznoss\u00e1gi \u00e9rt\u00e9kekre. Ha a karakter \u00e9hes, akkor id\u0151vel egyre \u00e9hesebb lesz, \u00e9s az EatFood tev\u00e9kenys\u00e9g hasznoss\u00e1gi eredm\u00e9nye egyre n\u00f6vekedni fog, am\u00edg a karakter el nem v\u00e9gzi azt, cs\u00f6kkentve az \u00e9hs\u00e9g szintj\u00e9t, \u00e9s az EatFood \u00e9rt\u00e9k\u00e9t null\u00e1ra vissza\u00e1ll\u00edtva. <\/p>\n<p>Az a gondolat, hogy a tev\u00e9kenys\u00e9geket hasznoss\u00e1gi \u00e9rt\u00e9kek alapj\u00e1n v\u00e1lasztjuk ki, meglehet\u0151sen egyszer\u0171, ez\u00e9rt a hasznoss\u00e1gi alap\u00fa rendszert az AI d\u00f6nt\u00e9shozatali folyamatainak r\u00e9sz\u00e9v\u00e9 lehet tenni, nem pedig teljes helyettes\u00edt\u00e9sk\u00e9nt. A d\u00f6nt\u00e9si fa k\u00e9rheti k\u00e9t gyermekcsom\u00f3pont hasznoss\u00e1gi \u00e9rt\u00e9k\u00e9nek meg\u00e1llap\u00edt\u00e1s\u00e1t, \u00e9s a magasabbat v\u00e1laszthatja. Hasonl\u00f3k\u00e9ppen, a viselked\u00e9si fa tartalmazhat egy \u00f6sszetett Utility csom\u00f3pontot a tev\u00e9kenys\u00e9gek hasznoss\u00e1gi \u00e9rt\u00e9keinek \u00e9rt\u00e9kel\u00e9s\u00e9re, hogy eld\u00f6ntse, melyik gyermekelemet hajtson v\u00e9gre.<\/p>\n<h2>Mozg\u00e1s \u00e9s navig\u00e1ci\u00f3<\/h2>\n<p>\nA kor\u00e1bbi p\u00e9ld\u00e1kban volt egy platform, amelyet balra vagy jobbra mozgattunk, \u00e9s egy \u0151r, amely patrul\u00e1lt vagy t\u00e1madott. De hogyan kezelj\u00fck pontosan az \u00fcgyn\u00f6k mozg\u00e1s\u00e1t egy adott id\u0151tartamon bel\u00fcl? Hogyan \u00e1ll\u00edtjuk be a sebess\u00e9get, hogyan ker\u00fcl\u00fcnk el akad\u00e1lyokat, \u00e9s hogyan tervezz\u00fck meg az \u00fatvonalat, ha a c\u00e9lhoz jut\u00e1s nehezebb, mint egyszer\u0171en egyenesen haladni? N\u00e9zz\u00fck meg ezt.<\/p>\n<h3>Kezel\u00e9s<\/h3>\n<p>\nA kezdeti szakaszban felt\u00e9telezhetj\u00fck, hogy minden \u00fcgyn\u00f6knek van egy sebess\u00e9ge, amely mag\u00e1ban foglalja, hogy mennyire gyorsan mozog \u00e9s melyik ir\u00e1nyba. Ezt m\u00e9rhetj\u00fck m\u00e9ter\/m\u00e1sodperc, kilom\u00e9ter\/\u00f3ra, pixel\/m\u00e1sodperc stb. Egyszer\u0171en visszaeml\u00e9kezve a Sense\/Think\/Act ciklusra, elk\u00e9pzelhetj\u00fck, hogy a Think r\u00e9sz kiv\u00e1lasztja a sebess\u00e9get, m\u00edg az Act r\u00e9sz alkalmazza ezt a sebess\u00e9get az \u00fcgyn\u00f6kre. \u00c1ltal\u00e1ban a j\u00e1t\u00e9kokban van egy fizikai rendszer, amely elv\u00e9gzi ezt a feladatot helyett\u00fcnk, megvizsg\u00e1lva minden objektum sebess\u00e9g\u00e9t \u00e9s szab\u00e1lyozva azt. \u00cdgy az AI-nak csak az a feladata, hogy eld\u00f6ntse, milyen sebess\u00e9ggel kell rendelkeznie az \u00fcgyn\u00f6knek. Ha tudjuk, hov\u00e1 kellene az \u00fcgyn\u00f6knek mennie, akkor azt a helyes ir\u00e1nyba kell mozgatnunk a megadott sebess\u00e9ggel. Egy nagyon trivi\u00e1lis egyenlet:<\/p>\n<p><i>desired_travel = destination_position \u2013 agent_position<\/i><\/p>\n<p>K\u00e9pzelj\u00fcnk el egy 2D vil\u00e1got. Az \u00fcgyn\u00f6k a (-2,-2) pontban helyezkedik el, a c\u00e9lpont pedig valahol \u00e9szakkeletre a (30, 20) koordin\u00e1t\u00e1n, \u00e9s a sz\u00fcks\u00e9ges \u00fat, amit az \u00fcgyn\u00f6knek meg kell tennie, hogy ott legyen \u2014 (32, 22). Tegy\u00fck fel, hogy ezek a poz\u00edci\u00f3k m\u00e9terben vannak m\u00e9rve \u2014 ha az \u00fcgyn\u00f6k sebess\u00e9g\u00e9t 5 m\u00e9ter\/m\u00e1sodpercre \u00e1ll\u00edtjuk, akkor a mozg\u00e1si vektorunkat sk\u00e1l\u00e1zzuk, \u00e9s k\u00f6r\u00fclbel\u00fcl (4.12, 2.83) sebess\u00e9get kapunk. Ezekkel a param\u00e9terekkel az \u00fcgyn\u00f6k majdnem 8 m\u00e1sodperc m\u00falva \u00e9rkezne meg a c\u00e9lhoz.<\/p>\n<p>Az \u00e9rt\u00e9keket b\u00e1rmikor \u00fajra lehet sz\u00e1molni. Ha az \u00fcgyn\u00f6k f\u00e9l\u00faton van a c\u00e9l fel\u00e9, akkor a mozg\u00e1s a fele hossz\u00fas\u00e1g\u00fa lenne, de mivel az \u00fcgyn\u00f6k maxim\u00e1lis sebess\u00e9ge 5 m\/s (ahogy azt kor\u00e1bban meg\u00e1llap\u00edtottuk), a sebess\u00e9g ugyanaz marad. Ez a mozg\u00f3 c\u00e9lokra is m\u0171k\u00f6dik, lehet\u0151v\u00e9 t\u00e9ve az \u00fcgyn\u00f6k sz\u00e1m\u00e1ra, hogy apr\u00f3 m\u00f3dos\u00edt\u00e1sokat v\u00e9gezzen a c\u00e9lok elmozdul\u00e1sa k\u00f6zben.<\/p>\n<p>De t\u00f6bb v\u00e1ltozatoss\u00e1got szeretn\u00e9nk \u2014 p\u00e9ld\u00e1ul lassan n\u00f6velni a sebess\u00e9get, hogy szimul\u00e1ljuk egy karakter mozg\u00e1s\u00e1t \u00e1ll\u00f3 helyzetb\u0151l fut\u00e1sra. Ugyanezt megtehetj\u00fck a meg\u00e1ll\u00e1s el\u0151tt. Ezeket a funkci\u00f3kat steering behaviours n\u00e9ven ismerik, mindegyiknek konkr\u00e9t nevei vannak: Seek (keres\u00e9s), Flee (menek\u00fcl\u00e9s), Arrival (\u00e9rkez\u00e9s) stb. Az \u00f6tlet az, hogy gyorsul\u00e1si er\u0151ket lehet alkalmazni az \u00fcgyn\u00f6k sebess\u00e9g\u00e9re, a c\u00e9lpont poz\u00edci\u00f3j\u00e1val \u00e9s az aktu\u00e1lis sebess\u00e9ggel v\u00e9gzett \u00f6sszehasonl\u00edt\u00e1s alapj\u00e1n, hogy k\u00fcl\u00f6nb\u00f6z\u0151 m\u00f3dokat alkalmazzunk a c\u00e9lhoz val\u00f3 eljut\u00e1sra.<\/p>\n<p>Minden viselked\u00e9snek egy kicsit m\u00e1s c\u00e9lja van. A Seek \u00e9s Arrival a m\u00f3dszerek, amellyel az \u00fcgyn\u00f6k eljut a c\u00e9lhelyre. Az Obstacle Avoidance (akad\u00e1lyker\u00fcl\u00e9s) \u00e9s a Separation (k\u00fcl\u00f6nv\u00e1laszt\u00e1s) az \u00fcgyn\u00f6k mozg\u00e1s\u00e1t korrig\u00e1lja, hogy elker\u00fclje az akad\u00e1lyokat a c\u00e9l fel\u00e9 vezet\u0151 \u00faton. Az Alignment (\u00f6sszhang) \u00e9s a Cohesion (\u00f6sszetart\u00e1s) azt biztos\u00edtja, hogy az \u00fcgyn\u00f6k\u00f6k egy\u00fctt mozogjanak. B\u00e1rmilyen sz\u00e1m\u00fa k\u00fcl\u00f6nb\u00f6z\u0151 steering behaviours \u00f6sszegz\u00e9sre ker\u00fclhet, hogy egyetlen \u00fatvektort kapjunk, figyelembe v\u00e9ve minden t\u00e9nyez\u0151t. Az \u00fcgyn\u00f6k a Arrival, Separation \u00e9s Obstacle Avoidance viselked\u00e9seit haszn\u00e1lja, hogy t\u00e1vol tartsa mag\u00e1t a falakt\u00f3l \u00e9s m\u00e1s \u00fcgyn\u00f6k\u00f6kt\u0151l. Ez a megk\u00f6zel\u00edt\u00e9s j\u00f3l m\u0171k\u00f6dik nyitott helyeken, ahol nincsenek felesleges r\u00e9szletek. <\/p>\n<p>Neh\u00e9z k\u00f6r\u00fclm\u00e9nyek k\u00f6z\u00f6tt a k\u00fcl\u00f6nb\u00f6z\u0151 viselked\u00e9sek \u00f6sszegz\u00e9se gyeng\u00e9bben m\u0171k\u00f6dik \u2014 p\u00e9ld\u00e1ul egy \u00fcgyn\u00f6k beszorulhat a falba az Arrival \u00e9s az Obstacle Avoidance konfliktusa miatt. Ez\u00e9rt figyelembe kell venni bonyolultabb lehet\u0151s\u00e9geket, mint csup\u00e1n az \u00f6sszes \u00e9rt\u00e9k \u00f6sszead\u00e1s\u00e1t. Egy ilyen m\u00f3dszer: az egyes viselked\u00e9sek eredm\u00e9nyeinek \u00f6sszead\u00e1sa helyett \u00e9rdemes a k\u00fcl\u00f6nb\u00f6z\u0151 ir\u00e1nyokban val\u00f3 mozg\u00e1st megfontolni \u00e9s a legjobb lehet\u0151s\u00e9get v\u00e1lasztani. <\/p>\n<p>Bonyolult k\u00f6rnyezetben azonban, ahol zs\u00e1kutc\u00e1k \u00e9s ir\u00e1nyv\u00e1laszt\u00e1s van, sz\u00fcks\u00e9g\u00fcnk lesz valamire, ami m\u00e9g fejlettebb.<\/p>\n<h3>\u00datvonaltervez\u00e9s<\/h3>\n<p>\nA steering behaviours kiv\u00e1l\u00f3an alkalmas egyszer\u0171 mozg\u00e1sra ny\u00edlt t\u00e9rben (futballp\u00e1lya vagy ar\u00e9na), ahol A-b\u00f3l B-be jutni egyenes \u00fat kis elt\u00e9r\u00e9sekkel az akad\u00e1lyok mellett. Bonyolultabb \u00fatvonalakhoz pathfinding (\u00fatvonaltervez\u00e9s) sz\u00fcks\u00e9ges, ami egy m\u00f3dszer a vil\u00e1g felfedez\u00e9s\u00e9re \u00e9s a rajta val\u00f3 navig\u00e1l\u00e1s d\u00f6nt\u00e9s\u00e9re.<\/p>\n<p>A legegyszer\u0171bb m\u00f3dszer, ha r\u00e1csot fektetsz minden n\u00e9gyzetre, ami az \u00fcgyn\u00f6k mellett van, \u00e9s \u00e9rt\u00e9keled, melyekben megengedett a mozg\u00e1s. Ha valamelyik\u00fck a c\u00e9lpont, k\u00f6vesd a nyomot az el\u0151z\u0151 n\u00e9gyzetek fel\u00e9, m\u00edg vissza nem \u00e9rsz a kezd\u0151pontra. Ez az \u00e1ltalad keresett \u00fat. Ha nem, ism\u00e9teld meg a folyamatot a legk\u00f6zelebbi n\u00e9gyzetekkel, am\u00edg meg nem tal\u00e1lod a c\u00e9lpontot, vagy elfogynak a n\u00e9gyzetek (ez azt jelenti, hogy nincs lehets\u00e9ges \u00fatvonal). Ezt hivatalosan Breadth-First Search-nak vagy BFS-nek nevezik (sz\u00e9less\u00e9gi keres\u00e9si algoritmus). Minden l\u00e9p\u00e9sn\u00e9l minden ir\u00e1nyba figyel, \u00edgy h\u00edvj\u00e1k \u201esz\u00e9less\u00e9g\u201d-nek. A keres\u00e9si t\u00e9r hasonl\u00f3 a hull\u00e1mfronthoz, amely addig terjed, m\u00edg el nem \u00e9ri a keresett helyet \u2014 a keres\u00e9s ter\u00fclete minden l\u00e9p\u00e9sn\u00e9l kit\u00e1gul, am\u00edg be nem ker\u00fcl a c\u00e9lpont, ekkor pedig nyomon k\u00f6vethetj\u00fck az utat a kezdethez.<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/d367e62bc53033b05388538649853a41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEnnek eredm\u00e9nyek\u00e9ppen kapsz egy n\u00e9gyzetekb\u0151l \u00e1ll\u00f3 list\u00e1t, melyekb\u0151l a sz\u00fcks\u00e9ges \u00fatvonalat kialak\u00edtj\u00e1k. Ez az \u00fat (innen ered a pathfinding) \u2014 a helyek list\u00e1ja, amelyeket az \u00fcgyn\u00f6k megl\u00e1togat, mik\u00f6zben a c\u00e9lhoz tart.<\/p>\n<p>Mivel tudjuk, hogy a vil\u00e1g minden n\u00e9gyzet\u00e9nek helyzete ismert, felhaszn\u00e1lhatjuk a steering behaviours-t a mozg\u00e1sra az \u00faton \u2014 az 1. csom\u00f3pontt\u00f3l a 2. csom\u00f3pontra, majd a 2. csom\u00f3pontt\u00f3l a 3. csom\u00f3pontra \u00e9s \u00edgy tov\u00e1bb. A legegyszer\u0171bb v\u00e1ltozat, ha a k\u00f6vetkez\u0151 n\u00e9gyzet k\u00f6z\u00e9ppontj\u00e1ba tartasz, de m\u00e9g jobb, ha meg\u00e1llsz a sz\u00e9l\u00e9n a jelenlegi n\u00e9gyzet \u00e9s a k\u00f6vetkez\u0151 k\u00f6z\u00f6tt. Ennek k\u00f6sz\u00f6nhet\u0151en az \u00fcgyn\u00f6k k\u00e9pes lesz lev\u00e1gni a sarkokat \u00e9les kanyarokban.<\/p>\n<p>A BFS algoritmusnak vannak h\u00e1tr\u00e1nyai is \u2014 annyira vizsg\u00e1lja a n\u00e9gyzeteket \u201erossz\u201d ir\u00e1nyban, mint \u201ej\u00f3\u201d ir\u00e1nyban. Itt l\u00e9p be egy bonyolultabb algoritmus, az A* (A star). Ez is hasonl\u00f3an m\u0171k\u00f6dik, de ahelyett, hogy vakon kutatn\u00e1 a szomsz\u00e9dos n\u00e9gyzeteket (majd a szomsz\u00e9dok szomsz\u00e9dait, \u00e9s \u00edgy tov\u00e1bb), egy list\u00e1ban gy\u0171jti a csom\u00f3pontokat, \u00e9s \u00fagy rendezi azokat, hogy a k\u00f6vetkez\u0151 vizsg\u00e1lt csom\u00f3pont mindig az legyen, ami a legr\u00f6videbb \u00fatvonalhoz vezet. A csom\u00f3pontokat egy heurisztika alapj\u00e1n rangsorolj\u00e1k, amely figyelembe veszi k\u00e9t dolgot \u2014 a \u201ek\u00f6lts\u00e9g\u00e9t\u201d a hipotetikus \u00fatvonalnak a sz\u00fcks\u00e9ges n\u00e9gyzethez (bele\u00e9rtve a mozg\u00e1s k\u00f6lts\u00e9geit) \u00e9s azt az \u00e9rt\u00e9kel\u00e9st, hogy mennyire van messze ez a n\u00e9gyzet a c\u00e9lpontt\u00f3l (ir\u00e1ny\u00edtva a keres\u00e9st a helyes ir\u00e1nyba).<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/1cab4f53fa5af6b31d352c7bcf453d7e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nE p\u00e9ld\u00e1ban l\u00e1that\u00f3, hogy az \u00fcgyn\u00f6k egy n\u00e9gyzetet vizsg\u00e1l meg egyszerre, mindig a leg\u00edg\u00e9retesebb szomsz\u00e9dot v\u00e1lasztva. Az el\u00e9rt \u00fat ugyanaz, mint a BFS eset\u00e9ben, de a folyamat sor\u00e1n kevesebb n\u00e9gyzetet vizsg\u00e1ltunk meg \u2013 ami jelent\u0151s hat\u00e1ssal van a j\u00e1t\u00e9k teljes\u00edtm\u00e9ny\u00e9re.<\/p>\n<h3>R\u00e1cs n\u00e9lk\u00fcli mozg\u00e1s<\/h3>\n<p>\nDe a legt\u00f6bb j\u00e1t\u00e9k nincs r\u00e1csra helyezve, \u00e9s gyakran nem is lehet a realizmus rov\u00e1s\u00e1ra megoldani. Kompromisszumokra van sz\u00fcks\u00e9g. Mekkora m\u00e9ret\u0171ek legyenek a n\u00e9gyzetek? T\u00fal nagyok \u2013 \u00e9s nem tudj\u00e1k megfelel\u0151en \u00e1br\u00e1zolni a kis folyos\u00f3kat vagy kanyarokat, t\u00fal kicsik \u2013 t\u00fal sok n\u00e9gyzetet kell keresni, ami v\u00e9gs\u0151 soron rengeteg id\u0151t ig\u00e9nyel.<\/p>\n<p>El\u0151sz\u00f6r is meg kell \u00e9rten\u00fcnk, hogy a r\u00e1cs egy kapcsolt csom\u00f3pontokb\u00f3l \u00e1ll\u00f3 gr\u00e1fot ad nek\u00fcnk. Az A* \u00e9s BFS algoritmusok val\u00f3j\u00e1ban gr\u00e1fokon m\u0171k\u00f6dnek, \u00e9s egy\u00e1ltal\u00e1n nem foglalkoznak a r\u00e1csunkkal. B\u00e1rmelyik helyen elhelyezhetn\u00e9nk a csom\u00f3pontokat a j\u00e1t\u00e9k vil\u00e1g\u00e1ban: ha b\u00e1rmely k\u00e9t \u00f6sszekapcsolt csom\u00f3pont k\u00f6z\u00f6tt van kapcsolat, valamint a kezd\u0151 \u00e9s v\u00e9gpont k\u00f6z\u00f6tt \u00e9s legal\u00e1bb az egyik csom\u00f3ponttal \u2013 az algoritmus olyan j\u00f3l fog m\u0171k\u00f6dni, mint kor\u00e1bban. Ezt gyakran waypoint rendszernek nevezik, mivel minden csom\u00f3pont jelent\u0151s helyet k\u00e9pvisel a vil\u00e1gban, amely r\u00e9sze lehet b\u00e1rmennyi hipotetikus \u00fatnak.<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/d87e9d4bb2a2fc713d32abc158506eaa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>1. p\u00e9lda: csom\u00f3pont minden n\u00e9gyzetben. A keres\u00e9s abb\u00f3l a csom\u00f3pontb\u00f3l indul, ahol az \u00fcgyn\u00f6k tal\u00e1lhat\u00f3, \u00e9s a c\u00e9l n\u00e9gyzet csom\u00f3pontj\u00e1ban fejez\u0151dik be.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/b535a5db805efdc427d7c5724b866982.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>2. p\u00e9lda: kisebb csom\u00f3pontk\u00e9szlet (waypointok). A keres\u00e9s a n\u00e9gyzetben kezd\u0151dik, ahol az \u00fcgyn\u00f6k tal\u00e1lhat\u00f3, \u00e1thalad a sz\u00fcks\u00e9ges sz\u00e1m\u00fa csom\u00f3ponton, majd folytat\u00f3dik a c\u00e9l\u00e1llom\u00e1sig.<\/i><\/p>\n<p>Ez egy meglehet\u0151sen rugalmas \u00e9s er\u0151teljes rendszer. De n\u00e9mi \u00f3vatoss\u00e1g sz\u00fcks\u00e9ges a d\u00f6nt\u00e9sekben, hogy hol \u00e9s hogyan helyezz\u00fck el a waypointokat, k\u00fcl\u00f6nben az \u00fcgyn\u00f6k\u00f6k egyszer\u0171en nem l\u00e1tj\u00e1k a legk\u00f6zelebbi pontot, \u00e9s nem tudj\u00e1k megkezdeni az utat. K\u00f6nnyebb lenne, ha automatikusan elhelyezhetn\u00e9nk a waypointokat a vil\u00e1g geometri\u00e1ja alapj\u00e1n.<\/p>\n<p>Itt l\u00e9p \u00e9letbe a navigation mesh, azaz navmesh (navig\u00e1ci\u00f3s r\u00e1cs). Ez \u00e1ltal\u00e1ban egy 2D-s h\u00e1romsz\u00f6gh\u00e1l\u00f3, amely a vil\u00e1g geometri\u00e1j\u00e1ra van r\u00e1vet\u00edtve \u2013 mindenhol, ahol az \u00fcgyn\u00f6k szabadon j\u00e1rhat. A h\u00e1l\u00f3 minden h\u00e1romsz\u00f6ge csom\u00f3pontt\u00e1 v\u00e1lik a gr\u00e1fban, \u00e9s legfeljebb h\u00e1rom szomsz\u00e9dos h\u00e1romsz\u00f6ggel rendelkezhet, amelyek a gr\u00e1f szomsz\u00e9dos csom\u00f3pontjaiv\u00e1 v\u00e1lnak. <\/p>\n<p>Ez a k\u00e9p az Unity motor p\u00e9ld\u00e1ja \u2014 elemezte a vil\u00e1g geometri\u00e1j\u00e1t, \u00e9s l\u00e9trehozta a navmesht (a k\u00e9perny\u0151k\u00e9pen vil\u00e1gosk\u00e9k sz\u00ednnel). Minden poligon a navmesh-en egy ter\u00fclet, ahol az \u00fcgyn\u00f6k \u00e1llhat vagy egyik poligonb\u00f3l a m\u00e1sikba mozoghat. Ebben a p\u00e9ld\u00e1ban a poligonok kisebbek, mint az \u00e1ltaluk k\u00e9pviselt emeletek \u2014 ezt az\u00e9rt tett\u00e9k, hogy figyelembe vegy\u00e9k az \u00fcgyn\u00f6k m\u00e9reteit, amelyek t\u00fall\u00e9phetnek a nomin\u00e1lis helyzet\u00e9n.<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/845705ba7b9a9d469203aedf7942da41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00e9pesek vagyunk keresni az \u00fatvonalat ezen a h\u00e1l\u00f3n, ism\u00e9t az A* algoritmust haszn\u00e1lva. Ez szinte t\u00f6k\u00e9letes \u00fatvonalat ad nek\u00fcnk a vil\u00e1gban, amely figyelembe veszi az \u00f6sszes geometri\u00e1t, mik\u00f6zben nem ig\u00e9nyel felesleges csom\u00f3pontokat \u00e9s \u00fatvonalpontok l\u00e9trehoz\u00e1s\u00e1t.<\/p>\n<p>Az \u00fatvonaltervez\u00e9s \u2014 t\u00fal sz\u00e9les t\u00e9ma, amelyr\u0151l egyetlen szakasz\u00fa cikk kev\u00e9s. Ha szeretn\u00e9 jobban megismerni, akkor ebben seg\u00edt <noindex><a rel=\"nofollow\" href=\"https:\/\/www.redblobgames.com\/pathfinding\/a-star\/introduction.html\">Amit Patel weboldala<\/a><\/noindex>.<\/p>\n<h2>Tervez\u00e9s<\/h2>\n<p>\nMeggy\u0151z\u0151dt\u00fcnk az \u00fatvonaltervez\u00e9sr\u0151l, hogy n\u00e9ha nem el\u00e9g csak egy ir\u00e1nyt v\u00e1lasztani \u00e9s haladni \u2014 meg kell v\u00e1lasztanunk az \u00fatvonalat, \u00e9s zsin\u00f3rban n\u00e9h\u00e1ny kanyart kell tenn\u00fcnk, hogy el\u00e9rj\u00fck a k\u00edv\u00e1nt c\u00e9lpontot. Ezt az elk\u00e9pzel\u00e9st \u00e1ltal\u00e1nos\u00edthatjuk: a c\u00e9l el\u00e9r\u00e9se nem csup\u00e1n a k\u00f6vetkez\u0151 l\u00e9p\u00e9s, hanem egy eg\u00e9sz sorozat, ahol n\u00e9ha el\u0151re kell n\u00e9zn\u00fcnk n\u00e9h\u00e1ny l\u00e9p\u00e9st, hogy megtudjuk, milyen legyen az els\u0151. Ezt tervez\u00e9snek nevezik. Az \u00fatvonaltervez\u00e9s egyike lehet a tervez\u00e9s kieg\u00e9sz\u00edt\u00e9seinek. A Sense \/ Think \/ Act ciklusunk szempontj\u00e1b\u00f3l ez az a r\u00e9sz, ahol a Think r\u00e9sze a j\u00f6v\u0151beli Act r\u00e9szeit tervezi.<\/p>\n<p>N\u00e9zz\u00fck meg az asztali j\u00e1t\u00e9k p\u00e9ld\u00e1j\u00e1n kereszt\u00fcl, a Magic: The Gathering j\u00e1t\u00e9kban. Az al\u00e1bbi k\u00e1rty\u00e1k k\u00e9szlet\u00e9vel mi l\u00e9p\u00fcnk els\u0151k\u00e9nt:<\/p>\n<ul>\n<li>Mocs\u00e1r \u2014 1 fekete man\u00e1t biztos\u00edt (f\u00f6ldk\u00e1rtya).<\/li>\n<li>Erd\u0151 \u2014 1 z\u00f6ld man\u00e1t biztos\u00edt (f\u00f6ldk\u00e1rtya).<\/li>\n<li>Fugitive Wizard \u2014 1 k\u00e9k man\u00e1t ig\u00e9nyel a megid\u00e9z\u00e9shez.<\/li>\n<li>Elvish Mystic \u2014 1 z\u00f6ld man\u00e1t ig\u00e9nyel a megid\u00e9z\u00e9shez.<\/li>\n<\/ul>\n<p>\nA fennmarad\u00f3 h\u00e1rom k\u00e1rty\u00e1t figyelmen k\u00edv\u00fcl hagyjuk, hogy egyszer\u0171bb legyen. A szab\u00e1lyok szerint a j\u00e1t\u00e9kosnak egy k\u00e1rty\u00e1t szabadna j\u00e1tszania egy k\u00f6rben, haszn\u00e1lhatja a 'tippel\u00e9s' mechanizmust, hogy nyerjen bel\u0151le man\u00e1t, majd var\u00e1zslatokat (bele\u00e9rtve a l\u00e9nyek megid\u00e9z\u00e9s\u00e9t) j\u00e1tszhat az el\u00e9rhet\u0151 mana mennyis\u00e9ge alapj\u00e1n. Ebben a helyzetben az emberi j\u00e1t\u00e9kos tudja, hogy j\u00e1tszania kell az Erd\u0151t, 'tippelnie' kell 1 z\u00f6ld man\u00e1t, majd megid\u00e9zni az Elvish Mystic-et. De hogyan tal\u00e1lja ki ezt a j\u00e1t\u00e9k AI-ja?<\/p>\n<h3>Egyszer\u0171 tervez\u00e9s<\/h3>\n<p>\nA trivi\u00e1lis megk\u00f6zel\u00edt\u00e9s az, hogy minden l\u00e9p\u00e9st egyenk\u00e9nt pr\u00f3b\u00e1lunk ki, am\u00edg nem marad t\u00f6bb megfelel\u0151 lehet\u0151s\u00e9g. A k\u00e1rty\u00e1k n\u00e9zeget\u00e9se k\u00f6zben az AI l\u00e1tja, hogy j\u00e1tszhat a Swamp-mal. \u00c9s j\u00e1tszik is vele. Maradtak-e m\u00e1s l\u00e9p\u00e9sek ezen a k\u00f6r\u00f6n? Nem tudja megid\u00e9zni sem az Elvish Mystic-ot, sem a Fugitive Wizard-ot, mivel az id\u00e9z\u00e9s\u00fckh\u00f6z z\u00f6ld \u00e9s k\u00e9k mana sz\u00fcks\u00e9ges, m\u00edg a Swamp csak fekete man\u00e1t ad. \u00c9s m\u00e1r nem tudja j\u00e1tszani a Forest-ot se, mert m\u00e1r lej\u00e1tszotta a Swamp-ot. \u00cdgy a j\u00e1t\u00e9kos AI betartotta a szab\u00e1lyokat, de nem j\u00f3l tette ezt. Lehetne jav\u00edtani.<\/p>\n<p>A tervez\u00e9s fel tudja t\u00e9rk\u00e9pezni azokat a l\u00e9p\u00e9seket, amelyek a j\u00e1t\u00e9kot a k\u00edv\u00e1nt \u00e1llapotba hozz\u00e1k. Ahogyan minden n\u00e9gyzet az \u00fatvonalon rendelkezett szomsz\u00e9dokkal (a p\u00e1lyakeres\u00e9s sor\u00e1n), minden l\u00e9p\u00e9s a tervben is rendelkezik szomsz\u00e9dokkal vagy ut\u00f3dokkal. Ezeket a l\u00e9p\u00e9seket \u00e9s a k\u00f6vetkez\u0151 l\u00e9p\u00e9seket kereshetj\u00fck, am\u00edg el nem \u00e9rj\u00fck a k\u00edv\u00e1nt \u00e1llapotot.<\/p>\n<p>A mi p\u00e9ld\u00e1nkban a k\u00edv\u00e1nt eredm\u00e9ny az \u201eid\u00e9zz meg egy l\u00e9nyt, ha lehets\u00e9ges\u201d. A k\u00f6r elej\u00e9n csak k\u00e9t lehets\u00e9ges l\u00e9p\u00e9st l\u00e1tunk, amelyek a j\u00e1t\u00e9k szab\u00e1lyai szerint megengedettek:<\/p>\n<p><i>1. J\u00e1tszd le a Swamp-ot (eredm\u00e9ny: Swamp a j\u00e1t\u00e9kban)<br \/>\n2. J\u00e1tszd le a Forest-ot (eredm\u00e9ny: Forest a j\u00e1t\u00e9kban)<\/i><\/p>\n<p>Minden elfogadott l\u00e9p\u00e9s tov\u00e1bbi l\u00e9p\u00e9sekhez vezethet, \u00e9s m\u00e1sokat z\u00e1rhat be, ism\u00e9telten a j\u00e1t\u00e9k szab\u00e1lyait\u00f3l f\u00fcgg\u0151en. K\u00e9pzelj\u00fck el, hogy lej\u00e1tszottuk a Swamp-ot \u2014 ez elt\u00e1vol\u00edtja a Swamp-ot, mint k\u00f6vetkez\u0151 l\u00e9p\u00e9st (mivel m\u00e1r lej\u00e1tszottuk), \u00e9s elt\u00e1vol\u00edtja a Forest-ot is (mivel a szab\u00e1lyok szerint egy f\u00f6ldk\u00e1rty\u00e1t csak egyszer lehet lej\u00e1tszani egy k\u00f6rben). Ezt k\u00f6vet\u0151en az AI mint k\u00f6vetkez\u0151 l\u00e9p\u00e9st hozz\u00e1adja \u2014 1 fekete mana szerz\u00e9s\u00e9t, mivel m\u00e1s lehet\u0151s\u00e9g nem \u00e1ll rendelkez\u00e9sre. Ha tov\u00e1bbmegy, \u00e9s v\u00e1lasztja a Tap the Swamp-ot, akkor 1 egys\u00e9g fekete man\u00e1t kap, \u00e9s semmit sem tud kezdeni vele.<\/p>\n<p><i>1. J\u00e1tszd le a Swamp-ot (eredm\u00e9ny: Swamp a j\u00e1t\u00e9kban)<br \/>\n 1.1 \u201eTeppej\u201d a Swamp-ot (eredm\u00e9ny: Swamp \u201etapped\u201d, +1 egys\u00e9g fekete mana)<br \/>\n Nincs el\u00e9rhet\u0151 l\u00e9p\u00e9s \u2013 V\u00c9GE<br \/>\n2. J\u00e1tszd le a Forest-ot (eredm\u00e9ny: Forest a j\u00e1t\u00e9kban)<\/i><\/p>\n<p>A l\u00e9p\u00e9sek list\u00e1ja r\u00f6vidre siker\u00fclt, zs\u00e1kutc\u00e1ba ker\u00fclt\u00fcnk. Ism\u00e9telj\u00fck meg a folyamatot a k\u00f6vetkez\u0151 l\u00e9p\u00e9shez. J\u00e1tszunk a Forest-tel, megnyitjuk a \u201eszerezz 1 z\u00f6ld man\u00e1t\u201d l\u00e9p\u00e9st, ami viszont megnyit egy harmadik l\u00e9p\u00e9st \u2014 az Elvish Mystic id\u00e9z\u00e9s\u00e9t.<\/p>\n<p><i>1. J\u00e1tszd le a Swamp-ot (eredm\u00e9ny: Swamp a j\u00e1t\u00e9kban)<br \/>\n 1.1 \u201eTeppej\u201d a Swamp-ot (eredm\u00e9ny: Swamp \u201etapped\u201d, +1 egys\u00e9g fekete mana)<br \/>\n Nincs el\u00e9rhet\u0151 l\u00e9p\u00e9s \u2013 V\u00c9GE<br \/>\n2. J\u00e1tszd le a Forest-ot (eredm\u00e9ny: Forest a j\u00e1t\u00e9kban)<br \/>\n 2.1 \u201eTeppej\u201d a Forest-ot (eredm\u00e9ny: Forest \u201etapped\u201d, +1 egys\u00e9g z\u00f6ld mana)<br \/>\n 2.1.1 Id\u00e9zd meg az Elvish Mystic-ot (eredm\u00e9ny: Elvish Mystic a j\u00e1t\u00e9kban, -1 egys\u00e9g z\u00f6ld mana)<br \/>\n Nincs el\u00e9rhet\u0151 l\u00e9p\u00e9s \u2013 V\u00c9GE<\/i><\/p>\n<p>V\u00e9g\u00fcl felfedezt\u00fck az \u00f6sszes lehets\u00e9ges l\u00e9p\u00e9st, \u00e9s megtal\u00e1ltuk a tervet, amely egy l\u00e9ny id\u00e9z\u00e9s\u00e9re ir\u00e1nyul.<\/p>\n<p>Ez egy nagyon leegyszer\u0171s\u00edtett p\u00e9lda. Aj\u00e1nlott a legjobb lehets\u00e9ges tervet v\u00e1lasztani, nem csak b\u00e1rmit, ami megfelel valamilyen krit\u00e9riumnak. \u00c1ltal\u00e1ban a potenci\u00e1lis terveket a v\u00e9gs\u0151 eredm\u00e9ny vagy az elv\u00e9gz\u00e9s\u00fckkel j\u00e1r\u00f3 \u00f6sszes el\u0151ny alapj\u00e1n lehet \u00e9rt\u00e9kelni. Egy f\u00f6ldk\u00e1rtya lej\u00e1tsz\u00e1s\u00e1\u00e9rt 1 pontot, egy l\u00e9ny megid\u00e9z\u00e9s\u00e9\u00e9rt pedig 3 pontot kaphatunk. A Swamp lej\u00e1tsz\u00e1sa 1 pontot ad. Ha Forest \u2192 Tap the Forest \u2192 megid\u00e9zz\u00fck az Elvish Mystic-ot, az azonnal 4 pontot \u00e9r. <\/p>\n<p>\u00cdgy m\u0171k\u00f6dik a tervez\u00e9s a Magic: The Gathering-ben, de ugyanezen logika m\u00e1s helyzetekben is alkalmazhat\u00f3. P\u00e9ld\u00e1ul egy b\u00e1bunak a mozgat\u00e1s\u00e1val helyet szabad\u00edtunk fel a b\u00e1stya l\u00e9p\u00e9s\u00e9hez a sakkban. Vagy elb\u00fajunk a fal m\u00f6g\u00e9, hogy biztons\u00e1gosan l\u0151hess\u00fcnk az XCOM-ban. Sz\u00f3val, \u00e9rtettek, mir\u0151l van sz\u00f3.<\/p>\n<h3>Fejlettebb tervez\u00e9s<\/h3>\n<p>\nN\u00e9ha t\u00fal sok potenci\u00e1lis l\u00e9p\u00e9s van, hogy minden lehets\u00e9ges lehet\u0151s\u00e9get figyelembe vegy\u00fcnk. Visszat\u00e9rve a Magic: The Gathering p\u00e9ld\u00e1hoz: tegy\u00fck fel, hogy a j\u00e1t\u00e9kban \u00e9s a kezedben is t\u00f6bb f\u00f6ld- \u00e9s l\u00e9nyk\u00e1rtya van \u2013 a lehets\u00e9ges l\u00e9p\u00e9skombin\u00e1ci\u00f3k sz\u00e1ma ak\u00e1r tucatnyi is lehet. Van n\u00e9h\u00e1ny megold\u00e1s a probl\u00e9m\u00e1ra.<\/p>\n<p>Az els\u0151 m\u00f3dszer a backwards chaining (visszafel\u00e9 l\u00e1ncol\u00e1s). Ahelyett, hogy minden kombin\u00e1ci\u00f3t v\u00e9gigpr\u00f3b\u00e1ln\u00e1nk, jobban j\u00e1runk, ha a v\u00e9gs\u0151 eredm\u00e9nnyel kezd\u00fcnk, \u00e9s megpr\u00f3b\u00e1lunk egy k\u00f6zvetlen \u00fatvonalat tal\u00e1lni. Ahelyett, hogy a fa gy\u00f6ker\u00e9t\u0151l egy adott lev\u00e9lhez haladn\u00e1nk, visszafel\u00e9 megy\u00fcnk \u2013 a lev\u00e9lt\u0151l a gy\u00f6k\u00e9rhez. Ez a m\u00f3dszer egyszer\u0171bb \u00e9s gyorsabb.<\/p>\n<p>Ha az ellenf\u00e9lnek 1 \u00e9lete van, tal\u00e1lhatunk egy tervet, ami \"1 vagy t\u00f6bb sebz\u00e9st okoz\". Ennek el\u00e9r\u00e9s\u00e9hez egy sor felt\u00e9telt kell teljes\u00edteni: <\/p>\n<p>1. A sebz\u00e9st egy var\u00e1zslat okozhatja \u2013 annak a kez\u00fcnkben kell lennie.<br \/>\n2. A var\u00e1zslat kij\u00e1tsz\u00e1s\u00e1hoz mana sz\u00fcks\u00e9ges.<br \/>\n3. A mana szerz\u00e9s\u00e9hez f\u00f6ldk\u00e1rty\u00e1t kell kij\u00e1tszanunk.<br \/>\n4. A f\u00f6ldk\u00e1rtya kij\u00e1tsz\u00e1s\u00e1hoz a kez\u00fcnkn\u00e9l kell lennie.<\/p>\n<p>A m\u00e1sik m\u00f3dszer a best-first search (legjobb els\u0151 keres\u00e9s). Ahelyett, hogy minden lehet\u0151s\u00e9get v\u00e9gign\u00e9zn\u00e9nk, a legmegfelel\u0151bbet v\u00e1lasztjuk. \u00c9pp ez\u00e9rt ez a m\u00f3dszer gyakran optim\u00e1lis tervet ad a keres\u00e9sre ford\u00edtott felesleges k\u00f6lts\u00e9gek n\u00e9lk\u00fcl. Az A* a legjobb els\u0151 keres\u00e9s egy form\u00e1ja \u2013 a leg\u00edg\u00e9retesebb \u00fatvonalakat kutatva a legels\u0151 l\u00e9p\u00e9st\u0151l, m\u00e1r megtal\u00e1lhatja a legjobbat an\u00e9lk\u00fcl, hogy a t\u00f6bbi lehet\u0151s\u00e9get ellen\u0151rizni kellene.<\/p>\n<p>A Monte Carlo Tree Search, a fascinating and increasingly popular variant of best-first search, selects random successors at each step instead of guessing which plans are better during each subsequent action choice. The algorithm continues until it reaches an endpoint (when the plan results in a win or loss). The outcome is then used to adjust the \"weight\" evaluation of the previous options. By repeating this process multiple times, the algorithm provides a solid assessment of which next step is the best, even if the situation changes (if the opponent takes action to hinder the player). <\/p>\n<p>When discussing action planning in games, one cannot overlook Goal-Oriented Action Planning, or GOAP. This widely used and discussed method is, at its core, a form of backwards chaining, with a few distinctive details. If the task is to \"eliminate the player,\" and the player is behind cover, the plan may look like this: throw a grenade \u2192 retrieve it \u2192 throw it.<\/p>\n<p>Typically, there are multiple goals, each with its own priority. If the highest-priority goal cannot be achieved (no combination of actions leads to a plan to \"eliminate the player\" because the player is not visible), the AI will revert to objectives with lower priority.<\/p>\n<h2>Learning and adaptation<\/h2>\n<p>\nWe have already mentioned that game AI typically does not use machine learning, as it is not suitable for real-time agent control. However, that does not mean we cannot borrow something from this field. We want an opponent in a shooter from whom we can learn something. For example, to find out about the best positions on the map. Or an opponent in a fighting game who blocks frequently used player combos, encouraging the use of different ones. Therefore, machine learning can be quite beneficial in such situations.<\/p>\n<h3>Statistics and probabilities<\/h3>\n<p>\nMiel\u0151tt bonyolult p\u00e9ld\u00e1kra t\u00e9rn\u00e9nk, n\u00e9zz\u00fck meg, milyen messzire juthatunk, ha n\u00e9h\u00e1ny egyszer\u0171 m\u00e9r\u00e9st v\u00e9gz\u00fcnk, \u00e9s ezeket a d\u00f6nt\u00e9shozatalhoz haszn\u00e1ljuk. P\u00e9ld\u00e1ul a val\u00f3s idej\u0171 strat\u00e9gia \u2014 hogyan hat\u00e1rozhatjuk meg, hogy egy j\u00e1t\u00e9kos k\u00e9pes-e t\u00e1mad\u00e1st ind\u00edtani a j\u00e1t\u00e9k els\u0151 n\u00e9h\u00e1ny perc\u00e9ben, \u00e9s milyen v\u00e9delmet kell ellene k\u00e9sz\u00edten\u00fcnk? Megvizsg\u00e1lhatjuk a j\u00e1t\u00e9kos kor\u00e1bbi tapasztalatait, hogy meg\u00e9rts\u00fck, milyen lehet a j\u00f6v\u0151beli reakci\u00f3juk. Kezdj\u00fck azzal, hogy nincsenek ilyen alapadataik, de ezeket \u00f6ssze tudjuk gy\u0171jteni \u2014 minden alkalommal, amikor az AI emberek ellen j\u00e1tszik, r\u00f6gz\u00edtheti az els\u0151 t\u00e1mad\u00e1s id\u0151pontj\u00e1t. P\u00e1r session ut\u00e1n megkaphatjuk az \u00e1tlagos id\u0151t, amelyen bel\u00fcl a j\u00e1t\u00e9kos a j\u00f6v\u0151ben t\u00e1madni fog.<\/p>\n<p>Az \u00e1tlagoknak is van egy probl\u00e9m\u00e1ja: ha a j\u00e1t\u00e9kos 20 alkalommal \u00abrohamozott\u00bb, \u00e9s 20 alkalommal lassan j\u00e1tszott, akkor a sz\u00fcks\u00e9ges \u00e9rt\u00e9kek valahol a k\u00f6zep\u00e9n lesznek, ami sz\u00e1munkra nem jelent hasznos inform\u00e1ci\u00f3t. Az egyik megold\u00e1s az adatok korl\u00e1toz\u00e1sa \u2014 figyelembe vehetj\u00fck az utols\u00f3 20 alkalmat.<\/p>\n<p>Hasonl\u00f3 megk\u00f6zel\u00edt\u00e9st alkalmazunk a bizonyos cselekedetek val\u00f3sz\u00edn\u0171s\u00e9g\u00e9nek \u00e9rt\u00e9kel\u00e9s\u00e9ben, felt\u00e9telezve, hogy a j\u00e1t\u00e9kos kor\u00e1bbi preferenci\u00e1i a j\u00f6v\u0151ben is hasonl\u00f3ak lesznek. Ha a j\u00e1t\u00e9kos \u00f6tsz\u00f6r t\u00e1madott minket t\u0171zg\u00f6mbbel, k\u00e9tszer vill\u00e1mmal \u00e9s egyszer k\u00f6zelharcban, nyilv\u00e1nval\u00f3, hogy a t\u0171zg\u00f6mb\u00f6t prefer\u00e1lja. Kiterjesztj\u00fck, \u00e9s l\u00e1tjuk a k\u00fcl\u00f6nb\u00f6z\u0151 fegyverek haszn\u00e1lat\u00e1nak val\u00f3sz\u00edn\u0171s\u00e9g\u00e9t: t\u0171zg\u00f6mb=62,5%, vill\u00e1m=25% \u00e9s k\u00f6zelharc=12,5%. A j\u00e1t\u00e9kunk AI-j\u00e1nak fel kell k\u00e9sz\u00fclnie a t\u0171z elleni v\u00e9dekez\u00e9sre.<\/p>\n<p>Egy m\u00e1sik \u00e9rdekes m\u00f3dszer a Naive Bayes Classifier (na\u00edv Bayes-oszt\u00e1lyoz\u00f3) haszn\u00e1lata, amely nagy mennyis\u00e9g\u0171 bemeneti adatot tanulm\u00e1nyoz, \u00e9s oszt\u00e1lyozza a helyzetet, hogy az AI megfelel\u0151 m\u00f3don reag\u00e1ljon. A Bayes-oszt\u00e1lyoz\u00f3k legismertebbek az e-mail spam sz\u0171r\u0151kben val\u00f3 haszn\u00e1latukkal. Itt a szavakat elemzik, \u00f6sszehasonl\u00edtj\u00e1k azzal, hogy kor\u00e1bban hol fordultak el\u0151 ezek a szavak (spamk\u00e9nt vagy nem), \u00e9s k\u00f6vetkeztet\u00e9seket vonnak le a bej\u00f6v\u0151 levelekr\u0151l. Ugyanezt megtehetj\u00fck m\u00e9g kevesebb bemeneti adatokkal is. Az AI sz\u00e1m\u00e1ra rendelkez\u00e9sre \u00e1ll\u00f3 hasznos inform\u00e1ci\u00f3k alapj\u00e1n (p\u00e9ld\u00e1ul milyen ellens\u00e9ges egys\u00e9geket \u00e1ll\u00edtottak el\u0151, vagy milyen var\u00e1zslatokat haszn\u00e1lnak, vagy mely technol\u00f3gi\u00e1kat kutatt\u00e1k) \u00e9s a v\u00e9gs\u0151 eredm\u00e9ny (h\u00e1bor\u00fa vagy b\u00e9ke, \u00abrohamozni\u00bb vagy v\u00e9dekezni stb.) alapj\u00e1n kiv\u00e1lasztjuk az AI megfelel\u0151 viselked\u00e9s\u00e9t.<\/p>\n<p>Mindezen tanul\u00e1si m\u00f3d elegend\u0151, de aj\u00e1nlott, hogy tesztel\u00e9sb\u0151l sz\u00e1rmaz\u00f3 adatok alapj\u00e1n haszn\u00e1ljuk \u0151ket. Az AI megtanul alkalmazkodni a k\u00fcl\u00f6nb\u00f6z\u0151 strat\u00e9gi\u00e1khoz, amelyeket a playtesterjeid haszn\u00e1ltak. Az a mesters\u00e9ges intelligencia, amely a megjelen\u00e9s ut\u00e1n alkalmazkodik a j\u00e1t\u00e9koshoz, t\u00fals\u00e1gosan kisz\u00e1m\u00edthat\u00f3 vagy \u00e9ppen ellenkez\u0151leg, t\u00fals\u00e1gosan neh\u00e9z lehet a gy\u0151zelemhez.<\/p>\n<h3>\u00c9rt\u00e9k alap\u00fa alkalmazkod\u00e1s<\/h3>\n<p>\nFigyelembe v\u00e9ve a j\u00e1t\u00e9k vil\u00e1gunk \u00e9s szab\u00e1lyaink tartalm\u00e1t, megv\u00e1ltoztathatjuk azokat az \u00e9rt\u00e9kek halmaz\u00e1t, amelyek befoly\u00e1solj\u00e1k a d\u00f6nt\u00e9shozatalt, nem csup\u00e1n a bemeneti adatokat haszn\u00e1lva. Ezt tessz\u00fck:<\/p>\n<ul>\n<li>Hagyjuk, hogy az AI adatokat gy\u0171jts\u00f6n a vil\u00e1g \u00e1llapot\u00e1r\u00f3l \u00e9s a kulcsfontoss\u00e1g\u00fa esem\u00e9nyekr\u0151l a j\u00e1t\u00e9k sor\u00e1n (ahogyan azt fentebb jelezt\u00fck).<\/li>\n<li>Megv\u00e1ltoztatjuk n\u00e9h\u00e1ny fontos \u00e9rt\u00e9ket (value) ezen adatok alapj\u00e1n.<\/li>\n<li>Megval\u00f3s\u00edtjuk a d\u00f6nt\u00e9seinket, amelyek ezeknek az \u00e9rt\u00e9keknek a feldolgoz\u00e1s\u00e1n vagy ki\u00e9rt\u00e9kel\u00e9s\u00e9n alapulnak.<\/li>\n<\/ul>\n<p>\nP\u00e9ld\u00e1ul, az \u00fcgyn\u00f6knek van n\u00e9h\u00e1ny szob\u00e1ja a harmadik szem\u00e9ly\u0171 l\u00f6v\u00f6ld\u00f6z\u0151s t\u00e9rk\u00e9pen. Minden szob\u00e1nak van egy saj\u00e1t \u00e9rt\u00e9ke, amely meghat\u00e1rozza, mennyire k\u00edv\u00e1natos a l\u00e1togat\u00e1sa. Az AI v\u00e9letlenszer\u0171en v\u00e1lasztja ki, melyik szob\u00e1ba menjen az \u00e9rt\u00e9k alapj\u00e1n. Ezut\u00e1n az \u00fcgyn\u00f6k eml\u00e9kezik arra, hogy melyik szob\u00e1ban \u00f6lt\u00e9k meg, \u00e9s cs\u00f6kkenti annak az \u00e9rt\u00e9k\u00e9t (az es\u00e9lyt, hogy visszat\u00e9r oda). Hasonl\u00f3 a ford\u00edtott helyzet \u2014 ha az \u00fcgyn\u00f6k sok ellenfelet meg\u00f6l, a szoba \u00e9rt\u00e9ke n\u00f6vekszik.<\/p>\n<h3>Markov-modell<\/h3>\n<p>\nMi lenne, ha a gy\u0171jt\u00f6tt adatokat el\u0151rejelz\u00e9sre haszn\u00e1ln\u00e1nk? Ha megjegyz\u00fcnk minden szob\u00e1t, ahol a j\u00e1t\u00e9kost egy bizonyos id\u0151szak alatt l\u00e1ttuk, el\u0151re tudjuk jelezni, melyik szob\u00e1ba l\u00e9phet a j\u00e1t\u00e9kos. A j\u00e1t\u00e9kos szob\u00e1kba val\u00f3 mozg\u00e1s\u00e1nak (\u00e9rt\u00e9kek) nyomon k\u00f6vet\u00e9s\u00e9vel \u00e9s r\u00f6gz\u00edt\u00e9s\u00e9vel k\u00e9pesek vagyunk el\u0151rejelezni azokat.<\/p>\n<p>Vegy\u00fcnk h\u00e1rom szob\u00e1t: piros, z\u00f6ld \u00e9s k\u00e9k. \u00c9s azokat a megfigyel\u00e9seket, amelyeket egy j\u00e1t\u00e9k\u00fctemez\u00e9s sor\u00e1n r\u00f6gz\u00edtett\u00fcnk:<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/6e90a365b72a176c36c9a14213baaafc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nA megfigyel\u00e9sek sz\u00e1ma minden szob\u00e1r\u00f3l majdnem egyenl\u0151 \u2014 hogy hol csin\u00e1ljunk egy j\u00f3 rejtekhelyet, azt m\u00e9g nem tudjuk. A statisztikai adatok gy\u0171jt\u00e9s\u00e9t a j\u00e1t\u00e9kosok \u00fajra\u00e9leszt\u00e9se is nehez\u00edti, akik egyenletesen jelennek meg az eg\u00e9sz t\u00e9rk\u00e9pen. De az adatok azonnali szob\u00e1r\u00f3l, ahov\u00e1 bel\u00e9pnek a t\u00e9rk\u00e9pre val\u00f3 megjelen\u00e9s ut\u00e1n \u2014 m\u00e1r hasznosak.<\/p>\n<p>L\u00e1tszik, hogy a z\u00f6ld szoba kedvez a j\u00e1t\u00e9kosoknak \u2013 a pirosb\u00f3l t\u00f6bben \u00e1tl\u00e9pnek ide, k\u00f6z\u00fcl\u00fck 50% ott is marad. A k\u00e9k szoba azonban nem n\u00e9pszer\u0171, alig l\u00e9pnek be, ha pedig igen, nem sok\u00e1ig tart\u00f3zkodnak benne. <\/p>\n<p>De az adatok valami fontosabbat is el\u00e1rulnak nek\u00fcnk \u2013 amikor a j\u00e1t\u00e9kos a k\u00e9k szob\u00e1ban van, akkor a k\u00f6vetkez\u0151 szoba, ahol val\u00f3sz\u00edn\u0171leg l\u00e1tni fogjuk, a piros lesz, nem a z\u00f6ld. Annak ellen\u00e9re, hogy a z\u00f6ld szoba n\u00e9pszer\u0171bb a pirosn\u00e1l, a helyzet megv\u00e1ltozik, ha a j\u00e1t\u00e9kos a k\u00e9ket haszn\u00e1lja. A k\u00f6vetkez\u0151 \u00e1llapot (azaz a szoba, ahov\u00e1 a j\u00e1t\u00e9kos \u00e1tmegy) a kor\u00e1bbi \u00e1llapott\u00f3l f\u00fcgg (azaz att\u00f3l a szob\u00e1t\u00f3l, ahol a j\u00e1t\u00e9kos \u00e9ppen tart\u00f3zkodik). A f\u00fcgg\u0151s\u00e9gek vizsg\u00e1lata r\u00e9v\u00e9n pontosabb el\u0151rejelz\u00e9seket tudunk v\u00e9gezni, mint ha egyszer\u0171en f\u00fcggetlen\u00fcl sz\u00e1ml\u00e1ln\u00e1nk a megfigyel\u00e9seket.<\/p>\n<p>A j\u00f6v\u0151beli \u00e1llapot el\u0151rejelz\u00e9se a m\u00faltbeli \u00e1llapot adatai alapj\u00e1n markov-modellnek (Markov model) nevezz\u00fck, \u00e9s az ilyen p\u00e9ld\u00e1k (szob\u00e1kkal) markov-l\u00e1ncoknak h\u00edvj\u00e1k. Mivel a modellek a val\u00f3sz\u00edn\u0171s\u00e9g\u00e9t \u00e1br\u00e1zolj\u00e1k a k\u00f6vetkez\u0151 \u00e1llapotok k\u00f6z\u00f6tti v\u00e1ltoz\u00e1soknak, vizu\u00e1lisan FSM-k\u00e9nt jelen\u00edtik meg \u0151ket, a val\u00f3sz\u00edn\u0171s\u00e9g k\u00f6r\u00fclbel\u00fcl a minden \u00e1tmeneti v\u00e1ltoz\u00f3ra. Kor\u00e1bban az FSM-t arra haszn\u00e1ltuk, hogy \u00e1br\u00e1zoljuk az \u00fcgyn\u00f6k viselked\u00e9si \u00e1llapot\u00e1t, de ez a koncepci\u00f3 b\u00e1rmilyen \u00e1llapotra vonatkozik, f\u00fcggetlen\u00fcl att\u00f3l, hogy kapcsol\u00f3dik-e az \u00fcgyn\u00f6kh\u00f6z vagy sem. Ebben az esetben az \u00e1llapotok k\u00e9pviselik azt a szob\u00e1t, amelyet az \u00fcgyn\u00f6k elfoglal:<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/edb32dff7a3298b19c3fa4d66f48e9f4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEz egy egyszer\u0171 m\u00f3dja a v\u00e1ltoz\u00e1sok relat\u00edv val\u00f3sz\u00edn\u0171s\u00e9g\u00e9nek megjelen\u00edt\u00e9s\u00e9re, amely lehet\u0151v\u00e9 teszi az AI sz\u00e1m\u00e1ra, hogy j\u00f3slatokat tegyen a k\u00f6vetkez\u0151 \u00e1llapotra. Lehets\u00e9ges, hogy t\u00f6bb l\u00e9p\u00e9st is el\u0151re jelezzen.<\/p>\n<p>Ha a j\u00e1t\u00e9kos a z\u00f6ld szob\u00e1ban van, akkor 50% es\u00e9ly van arra, hogy a k\u00f6vetkez\u0151 megfigyel\u00e9sn\u00e9l ott marad. De mennyi az es\u00e9lye, hogy m\u00e9g mindig ott lesz? Nemcsak az es\u00e9ly, hogy a j\u00e1t\u00e9kos a z\u00f6ld szob\u00e1ban marad, hanem az is, hogy elment \u00e9s visszat\u00e9rt. \u00cdme egy \u00faj t\u00e1bl\u00e1zat figyelembe v\u00e9ve az \u00faj adatokat:<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/f87afff68b066a879661e37f68654ae2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nEbb\u0151l egy\u00e9rtelm\u0171, hogy a val\u00f3sz\u00edn\u0171s\u00e9ge annak, hogy a j\u00e1t\u00e9kost a z\u00f6ld szob\u00e1ban l\u00e1ssuk a k\u00e9t megfigyel\u00e9s ut\u00e1n 51% lesz \u2014 21%, hogy a piros szob\u00e1b\u00f3l \u00e9rkezik, 5% arra, hogy a j\u00e1t\u00e9kos a k\u00e9k szob\u00e1t is megl\u00e1togatja k\u00f6zben, \u00e9s 25%, hogy a j\u00e1t\u00e9kos egy\u00e1ltal\u00e1n nem hagyja el a z\u00f6ld szob\u00e1t.<\/p>\n<p>A t\u00e1bl\u00e1zat \u2014 egyszer\u0171 vizu\u00e1lis eszk\u00f6z \u2014 a folyamat csak a val\u00f3sz\u00edn\u0171s\u00e9gek szorz\u00e1s\u00e1t ig\u00e9nyli minden l\u00e9p\u00e9sn\u00e9l. Ez azt jelenti, hogy messzire l\u00e1thatsz a j\u00f6v\u0151be, egy felt\u00e9tellel: felt\u00e9telezz\u00fck, hogy a szoba bel\u00e9p\u00e9s\u00e9nek es\u00e9lye teljesen a jelenlegi szob\u00e1t\u00f3l f\u00fcgg. Ezt h\u00edvj\u00e1k Markov-tulajdons\u00e1gnak (Markov Property) \u2014 a j\u00f6v\u0151 \u00e1llapota csak a jelenlegi \u00e1llapott\u00f3l f\u00fcgg. De ez nem sz\u00e1z sz\u00e1zal\u00e9kig pontos. A j\u00e1t\u00e9kosok m\u00e1s t\u00e9nyez\u0151k, p\u00e9ld\u00e1ul az eg\u00e9szs\u00e9gi \u00e1llapot vagy a l\u0151szer mennyis\u00e9ge alapj\u00e1n is v\u00e1ltoztathatj\u00e1k a d\u00f6nt\u00e9seiket. Mivel ezeket az \u00e9rt\u00e9keket nem r\u00f6gz\u00edtj\u00fck, a j\u00f3slataink kev\u00e9sb\u00e9 lesznek pontosak.<\/p>\n<h3>N-Gramok<\/h3>\n<p>\nDe mi a helyzet a p\u00e9ld\u00e1val, amely a harci j\u00e1t\u00e9kban a j\u00e1t\u00e9kos kombin\u00e1ci\u00f3s mozdulatait j\u00f3solja? Ugyanaz! De egyetlen \u00e1llapot vagy esem\u00e9ny helyett eg\u00e9sz sorozatokat fogunk megvizsg\u00e1lni, amelyekb\u0151l a kombin\u00e1lt \u00fct\u00e9s \u00e1ll.<\/p>\n<p>Az egyik m\u00f3dszer az, hogy minden bemenetet (p\u00e9ld\u00e1ul Kick, Punch vagy Block) egy puffert\u00e1rol\u00f3ban t\u00e1rolunk, \u00e9s az eg\u00e9sz puffert egy esem\u00e9nyk\u00e9nt r\u00f6gz\u00edtj\u00fck. Teh\u00e1t a j\u00e1t\u00e9kos t\u00f6bbsz\u00f6r r\u00e1kattint a Kick, Kick, Punch kombin\u00e1ci\u00f3ra, hogy aktiv\u00e1lja a SuperDeathFist t\u00e1mad\u00e1st, az AI rendszere t\u00e1rolja az \u00f6sszes bemenetet a puffert\u00e1rol\u00f3ban, \u00e9s eml\u00e9kezik az utols\u00f3 h\u00e1romra, amelyet minden l\u00e9p\u00e9sn\u00e9l haszn\u00e1ltak.<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: kezd\u0151knek sz\u00f3l\u00f3 \u00fatmutat\u00f3\" src=\"\/wp-content\/uploads\/2019\/11\/9a95226ae155dca5e45a66d4440f3cd4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(A j\u00e1t\u00e9kos SuperDeathFist t\u00e1mad\u00e1s\u00e1nak aktiv\u00e1l\u00e1sakor az al\u00e1bbi sorok vastagon kiemelve jelennek meg.)<\/p>\n<p>Az AI \u00e9szlelni fogja az \u00f6sszes lehet\u0151s\u00e9get, amikor a j\u00e1t\u00e9kos Kick-et v\u00e1lasztott, majd k\u00f6vetkezik egy m\u00e1sik Kick, \u00e9s azt\u00e1n \u00e9szreveszi, hogy a k\u00f6vetkez\u0151 bemenet mindig Punch. Ez lehet\u0151v\u00e9 teszi az \u00fcgyn\u00f6k sz\u00e1m\u00e1ra, hogy el\u0151re jelezze a SuperDeathFist kombin\u00e1ci\u00f3s mozdulatot, \u00e9s blokkolja azt, ha lehets\u00e9ges.<\/p>\n<p>Ezeket az esem\u00e9nysorozatokat N-gramoknak (N-grams) h\u00edvj\u00e1k, ahol N a t\u00e1rolt elemek sz\u00e1ma. A kor\u00e1bbi p\u00e9ld\u00e1ban ez egy 3-gram volt (trigram), ami azt jelenti: az els\u0151 k\u00e9t bejegyz\u00e9s a harmadik el\u0151rejelz\u00e9s\u00e9re szolg\u00e1l. Ennek megfelel\u0151en az 5-gramban az els\u0151 n\u00e9gy bejegyz\u00e9s az \u00f6t\u00f6dik el\u0151rejelz\u00e9s\u00e9re szolg\u00e1l, \u00e9s \u00edgy tov\u00e1bb.<\/p>\n<p>A fejleszt\u0151nek gondosan ki kell v\u00e1lasztania az N-gramok m\u00e9ret\u00e9t. A kisebb N kevesebb mem\u00f3ri\u00e1t ig\u00e9nyel, de kisebb t\u00f6rt\u00e9netet is t\u00e1rol. P\u00e9ld\u00e1ul a 2-gram (bigram) a Kick, Kick vagy Kick, Punch bejegyz\u00e9seket t\u00e1rolja, de nem tudja r\u00f6gz\u00edteni a Kick, Kick, Punch kombin\u00e1ci\u00f3t, \u00edgy az AI nem reag\u00e1l a SuperDeathFist kombin\u00e1ci\u00f3ra.<\/p>\n<p>M\u00e1sr\u00e9szt a nagyobb sz\u00e1mok t\u00f6bb mem\u00f3ri\u00e1t ig\u00e9nyelnek, \u00e9s az AI-nak nehezebb lesz tanulnia, mivel sokkal t\u00f6bb lehets\u00e9ges vari\u00e1ci\u00f3 lesz. Ha h\u00e1rom lehets\u00e9ges bemenet\u00fcnk volt, Kick, Punch vagy Block, \u00e9s 10-gramot haszn\u00e1ltunk, akkor k\u00f6r\u00fclbel\u00fcl 60 ezer k\u00fcl\u00f6nb\u00f6z\u0151 vari\u00e1ci\u00f3t kapunk.<\/p>\n<p>A bigram model is a simple Markov chain \u2014 each pair of \"previous state\/current state\" is a bigram, and you can predict the second state based on the first. Trigrams and larger N-grams can also be viewed as Markov chains, where all elements (except the last in the N-gram) together form the first state, while the last element is the second. An example with fighting shows the chance of transitioning from the state Kick and Kick to the state Kick and Punch. By treating several historical input records as a single unit, we essentially transform the input sequence into a part of a whole state. This gives us the Markov property, allowing the use of Markov chains to predict the next input and guess which combo move will come next.<\/p>\n<h2>Z\u00e1r\u00e1s<\/h2>\n<p>\nWe discussed the most common tools and approaches in artificial intelligence development. We also covered situations in which to apply them and where they are particularly useful. <\/p>\n<p>This should be enough to understand the basics of game AI. But, of course, this is far from all methods. Less popular, but no less effective include:<\/p>\n<ul>\n<li>optimization algorithms, including hill climbing, gradient descent, and genetic algorithms<\/li>\n<li>competitive search\/planning algorithms (minimax and alpha-beta pruning)<\/li>\n<li>classification methods (perceptrons, neural networks, and support vector machines)<\/li>\n<li>systems for processing agents' perception and memory<\/li>\n<li>architectural approaches to AI (hybrid systems, subsets of architectures, and other ways of layering AI systems)<\/li>\n<li>animation tools (motion planning and coordination)<\/li>\n<li>performance factors (level of detail, anytime algorithms, and time slicing)<\/li>\n<\/ul>\n<p>\nOnline resources on the topic:<\/p>\n<p>1. GameDev.net has <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gamedev.net\/articles\/programming\/artificial-intelligence\/\">a section with articles and tutorials on AI<\/a><\/noindex>, valamint <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gamedev.net\/forums\/forum\/6-artificial-intelligence\/\">f\u00f3rum<\/a><\/noindex>.<br \/>\n2. <noindex><a rel=\"nofollow\" href=\"http:\/\/aigamedev.com\/\">AiGameDev.com<\/a><\/noindex> contains many presentations and articles on a wide range of topics related to game AI development.<br \/>\n3. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gdcvault.com\/\">The GDC Vault<\/a><\/noindex> includes topics from the GDC AI summit, many of which are available for free.<br \/>\n4. Useful materials can also be found on the site <noindex><a rel=\"nofollow\" href=\"http:\/\/gameai.com\/\">AI Game Programmers Guild<\/a><\/noindex>.<br \/>\n5. Tommy Thompson, an AI researcher and game developer, makes videos on the YouTube channel <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/user\/tthompso\">AI and Games<\/a><\/noindex> explaining and exploring AI in commercial games.<\/p>\n<p>Books on the topic:<\/p>\n<p>1. A Game AI Pro k\u00f6nyvsorozat r\u00f6vid cikkek gy\u0171jtem\u00e9nye, amelyek magyar\u00e1zz\u00e1k, hogyan val\u00f3s\u00edtsuk meg a konkr\u00e9t funkci\u00f3kat, vagy hogyan oldjunk meg konkr\u00e9t probl\u00e9m\u00e1kat.<\/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: A J\u00e1t\u00e9k AI Szakemberek Gy\u0171jt\u00f6tt Tud\u00e1sa<\/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: A J\u00e1t\u00e9k AI Szakemberek Gy\u0171jt\u00f6tt Tud\u00e1sa<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2KF4irS\">Game AI Pro 3: A J\u00e1t\u00e9k AI Szakemberek Gy\u0171jt\u00f6tt Tud\u00e1sa<\/a><\/noindex><\/p>\n<p>2. Az AI Game Programming Wisdom sorozat a Game AI Pro sorozat el\u0151dje. R\u00e9gebbi m\u00f3dszereket tartalmaz, de szinte mindegyik a mai napig aktu\u00e1lis.<\/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\">Mesters\u00e9ges Intelligencia: Modern Megk\u00f6zel\u00edt\u00e9s<\/a><\/noindex> \u2014 ez az egyik alapvet\u0151 sz\u00f6veg mindazok sz\u00e1m\u00e1ra, akik szeretn\u00e9k meg\u00e9rteni a mesters\u00e9ges intelligencia \u00e1ltal\u00e1nos ter\u00fclet\u00e9t. Ez a k\u00f6nyv nem a j\u00e1t\u00e9kfejleszt\u00e9sr\u0151l sz\u00f3l \u2014 az AI alapjait tan\u00edtja.<br \/>\n<br \/>Forr\u00e1s: <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\/hu\/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=\"hu_HU\" \/>\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\/hu\/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\udd47Hogyan k\u00e9sz\u00edts\u00fcnk j\u00e1t\u00e9k AI-t: \u00fatmutat\u00f3 kezd\u0151knek | ProHoster","description":"Tal\u00e1ltam egy \u00e9rdekes anyagot a(z).","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/52118","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=52118"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/52118\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=52118"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=52118"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=52118"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}