{"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\/de\/blog\/novosti-interneta\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","title":{"rendered":"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/9e57175b233a104e0df98383b374eded.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIch bin auf ein interessantes Material \u00fcber k\u00fcnstliche Intelligenz in Spielen gesto\u00dfen. Es erkl\u00e4rt die Grundlagen der KI mit einfachen Beispielen und enth\u00e4lt viele n\u00fctzliche Werkzeuge und Methoden f\u00fcr eine komfortable Entwicklung und Gestaltung. Auch wie, wo und wann man sie einsetzen kann, wird behandelt.<\/p>\n<p>Die meisten Beispiele sind in Pseudocode verfasst, daher sind keine tiefen Programmierkenntnisse erforderlich. Im Anhang finden sich 35 Seiten Text mit Bildern und GIFs, also bereiten Sie sich vor.<\/p>\n<p>UPD. Ich entschuldige mich, aber ich habe diese Artikel\u00fcbersetzung bereits auf Habrahabr gemacht <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/PatientZero\/\">PatientZero<\/a><\/noindex>. Seinen Beitrag kann man lesen <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/420219\/\">hier<\/a><\/noindex>, aber irgendwie ist der Artikel an mir vorbeigegangen (ich habe die Suche genutzt, aber irgendetwas lief schief). Da ich in einem Blog schreibe, der sich dem Game Development widmet, wollte ich meine \u00dcbersetzung f\u00fcr die Abonnenten teilen (einige Punkte habe ich anders formuliert, andere absichtlich nach R\u00fccksprache mit den Entwicklern weggelassen).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Was ist KI?<\/h2>\n<p>\nDie Gaming-KI konzentriert sich darauf, welche Aktionen ein Objekt in Abh\u00e4ngigkeit von den gegebenen Bedingungen ausf\u00fchren sollte. H\u00e4ufig wird dies als das Management von \"intelligenten Agenten\" bezeichnet, wobei ein Agent ein Spielcharakter, ein Fahrzeug, ein Bot oder manchmal etwas Abstrakteres sein kann: eine gesamte Gruppe von Entit\u00e4ten oder sogar eine Zivilisation. In jedem Fall ist es etwas, das seine Umgebung wahrnehmen, darauf basierende Entscheidungen treffen und entsprechend handeln muss. Dies wird als der Zyklus Sense\/Think\/Act (Wahrnehmen\/Denken\/Handeln) bezeichnet:<\/p>\n<ul>\n<li>Wahrnehmen: Der Agent findet oder erh\u00e4lt Informationen \u00fcber Dinge in seiner Umgebung, die sein Verhalten beeinflussen k\u00f6nnten (nahe Bedrohungen, Sammlungsobjekte, interessante Orte zur Erkundung).<\/li>\n<li>Denken: Der Agent entscheidet, wie er reagieren soll (er pr\u00fcft, ob es sicher genug ist, um Objekte zu sammeln, oder ob er zun\u00e4chst k\u00e4mpfen oder sich verstecken sollte).<\/li>\n<li>Handeln: Der Agent f\u00fchrt Aktionen durch, um die vorherige Entscheidung umzusetzen (er beginnt, sich dem Gegner oder dem Objekt zuzubewegen).<\/li>\n<li>\u2026nun hat sich die Situation ge\u00e4ndert aufgrund der Aktionen der Charaktere, daher wird der Zyklus mit neuen Daten wiederholt.<\/li>\n<\/ul>\n<p>\nKI konzentriert sich in der Regel auf den Sinn-Teil des Zyklus. Beispielsweise machen autonome Fahrzeuge Aufnahmen der Stra\u00dfe, kombinieren diese mit Radar- und LiDAR-Daten und interpretieren sie. Dies geschieht normalerweise durch maschinelles Lernen, das die eingehenden Daten verarbeitet und ihnen Bedeutung verleiht, indem es semantische Informationen extrahiert wie \"Ein weiteres Fahrzeug befindet sich 20 Yards vor Ihnen\". Dies sind sogenannte Klassifizierungsprobleme.<\/p>\n<p>Spiele ben\u00f6tigen kein komplexes System zur Informationsgewinnung, da der Gro\u00dfteil der Daten bereits ein integraler Bestandteil davon ist. Es ist nicht n\u00f6tig, Bilderkennungsalgorithmen zu verwenden, um festzustellen, ob ein Feind voraus ist \u2013 das Spiel wei\u00df es bereits und \u00fcbertr\u00e4gt die Informationen direkt im Entscheidungsprozess. Daher ist der Sinn-Teil des Zyklus oft viel einfacher als Denken und Handeln.<\/p>\n<h2>Einschr\u00e4nkungen der Spiel-KI<\/h2>\n<p>\nDie KI hat eine Reihe von Einschr\u00e4nkungen, die eingehalten werden m\u00fcssen:<\/p>\n<ul>\n<li>Die KI muss nicht im Voraus trainiert werden, als w\u00e4re sie ein Algorithmus f\u00fcr maschinelles Lernen. Es ist sinnlos, ein neuronales Netzwerk w\u00e4hrend der Entwicklung zu schreiben, um Zehntausende von Spielern zu beobachten und die beste Spielweise gegen sie zu lernen. Warum? Weil das Spiel noch nicht ver\u00f6ffentlicht ist und es keine Spieler gibt.<\/li>\n<li>Das Spiel sollte unterhalten und herausfordern, weshalb die Agenten keinen optimalen Ansatz gegen Menschen finden sollten.<\/li>\n<li>Die Agenten m\u00fcssen realistisch wirken, damit die Spieler das Gef\u00fchl haben, gegen echte Menschen zu spielen. Das AlphaGo-Programm \u00fcbertraf den Menschen, aber die gew\u00e4hlten Z\u00fcge waren weit entfernt von einem traditionellen Verst\u00e4ndnis des Spiels. Wenn ein Spiel einen menschlichen Gegner imitiert, sollte dieses Gef\u00fchl nicht vorhanden sein. Der Algorithmus muss angepasst werden, um plausible Entscheidungen zu treffen, anstatt perfekte.<\/li>\n<li>KI muss in Echtzeit arbeiten. Das bedeutet, dass der Algorithmus die CPU nicht \u00fcber einen l\u00e4ngeren Zeitraum monopolistisch nutzen kann, um Entscheidungen zu treffen. Selbst 10 Millisekunden daf\u00fcr sind zu lang, da den meisten Spielen nur 16 bis 33 Millisekunden ausreichen, um die gesamte Verarbeitung durchzuf\u00fchren und zum n\u00e4chsten Grafikframe \u00fcberzugehen.<\/li>\n<li>Es w\u00e4re ideal, wenn zumindest ein Teil des Systems datenbasiert gesteuert wird, damit auch \"Nicht-Coder\" \u00c4nderungen vornehmen k\u00f6nnen und Anpassungen schneller erfolgen.<\/li>\n<\/ul>\n<p>\nBetrachten wir Ans\u00e4tze der KI, die den gesamten Zyklus Sense\/Think\/Act abdecken.<\/p>\n<h3>Treffen grundlegender Entscheidungen<\/h3>\n<p>\nBeginnen wir mit dem einfachsten Spiel \u2013 Pong. Ziel: Bewege die Plattform (Paddle) so, dass der Ball von ihr abprallt und nicht daran vorbeifliegt. Es ist wie Tennisspielen, bei dem du verlierst, wenn du den Ball nicht zur\u00fcckspielst. F\u00fcr die KI ist die Aufgabe relativ einfach \u2013 zu entscheiden, in welche Richtung die Plattform bewegt werden soll.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/e1935d657b9f090bf60c365c21e8f92b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Bedingte Operatoren<\/h3>\n<p>\nF\u00fcr die KI in Pong gibt es eine naheliegende L\u00f6sung \u2013 immer versuchen, die Plattform unter dem Ball zu positionieren.<\/p>\n<p>Ein einfacher Algorithmus daf\u00fcr, verfasst in Pseudocode:<\/p>\n<p><i>jede Frame\/Aktualisierung, w\u00e4hrend das Spiel l\u00e4uft:<br \/>\nWenn der Ball links von der Plattform ist:<br \/>\n Bewege die Plattform nach links<br \/>\nSonst, wenn der Ball rechts von der Plattform ist:<br \/>\n Bewege die Plattform nach rechts<\/i><\/p>\n<p>Wenn die Plattform sich mit der Geschwindigkeit des Balls bewegt, ist das der ideale Algorithmus f\u00fcr die KI in Pong. Es gibt keinen Grund, es komplizierter zu machen, wenn es nicht viele Daten oder m\u00f6gliche Aktionen f\u00fcr den Agenten gibt.<\/p>\n<p>Dieser Ansatz ist so einfach, dass der gesamte Zyklus Sense\/Think\/Act kaum bemerkbar ist. Aber er existiert:<\/p>\n<ul>\n<li>Der Teil Sense befindet sich in den beiden if-Operatoren. Das Spiel wei\u00df, wo der Ball ist und wo sich die Plattform befindet, also greift die KI auf diese Informationen zu. <\/li>\n<li>Der Teil Think geh\u00f6rt ebenfalls zu zwei if-Operatoren. Sie repr\u00e4sentieren zwei L\u00f6sungen, die in diesem Fall sich gegenseitig ausschlie\u00dfen. Infolgedessen wird eine der drei Aktionen gew\u00e4hlt \u2013 die Plattform nach links bewegen, nach rechts bewegen oder nichts tun, wenn sie bereits korrekt positioniert ist.<\/li>\n<li>Der Teil Act befindet sich in den Operatoren Move Paddle Left und Move Paddle Right. Je nach Spieldesign k\u00f6nnen sie die Plattform sofort oder mit einer bestimmten Geschwindigkeit bewegen. <\/li>\n<\/ul>\n<p>\nSolche Ans\u00e4tze werden als reaktiv bezeichnet \u2013 es gibt eine einfache Regelmenge (in diesem Fall if-Operatoren im Code), die auf den aktuellen Zustand der Welt reagiert und handelt.<\/p>\n<h3>Entscheidungsbaum<\/h3>\n<p>\nDas Beispiel mit dem Spiel Pong entspricht tats\u00e4chlich dem formalen Konzept der KI, das als Entscheidungsbaum bezeichnet wird. Der Algorithmus durchl\u00e4uft ihn, um zum 'Blatt' zu gelangen \u2013 einer Entscheidung dar\u00fcber, welche Aktion zu ergreifen ist.<\/p>\n<p>Lassen Sie uns ein Flussdiagramm des Entscheidungsbaums f\u00fcr den Algorithmus unserer Plattform erstellen:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/d3b7290ba93144967cd849416cd5eef3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJeder Teil des Baums wird als Node (Knoten) bezeichnet \u2013 die KI verwendet die Grafentheorie, um solche Strukturen zu beschreiben. Es gibt zwei Arten von Knoten:<\/p>\n<ul>\n<li>Entscheidungsfindungsknoten: Auswahl zwischen zwei Alternativen basierend auf einer Bedingung, wobei jede Alternative als separater Knoten dargestellt wird.<\/li>\n<li>Endknoten: Eine auszuf\u00fchrende Aktion, die die endg\u00fcltige Entscheidung darstellt.<\/li>\n<\/ul>\n<p>\nDer Algorithmus beginnt mit dem ersten Knoten (\u201eWurzel\u201c des Baums). Er entscheidet entweder, zu welchem Kindknoten er wechseln soll, oder f\u00fchrt die im Knoten gespeicherte Aktion aus und endet.<\/p>\n<p>Was ist der Vorteil, wenn Entscheidungsb\u00e4ume dieselbe Funktion erf\u00fcllen wie die if-Anweisungen im vorherigen Abschnitt? Hier gibt es ein allgemeines System, in dem jede Entscheidung nur eine Bedingung und zwei m\u00f6gliche Ergebnisse hat. Dies erm\u00f6glicht es dem Entwickler, KI aus Daten zu erstellen, die Entscheidungen im Baum darstellen, ohne sie hart zu kodieren. Lassen Sie es uns in Form einer Tabelle darstellen:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/6875293a60ff9d0efa26fb5e1aa4b21c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAuf der Code-Seite erhalten Sie ein System zur Verarbeitung von Zeilen. Erstellen Sie f\u00fcr jede dieser Zeilen einen Knoten, verbinden Sie die Entscheidungslogik mit der zweiten Spalte und die Kindknoten mit der dritten und vierten Spalte. Sie m\u00fcssen weiterhin Bedingungen und Aktionen programmieren, aber die Struktur des Spiels wird jetzt komplexer. Sie f\u00fcgen zus\u00e4tzliche Entscheidungen und Aktionen hinzu und konfigurieren die gesamte KI, indem Sie einfach die Textdatei mit der Definition des Baumes bearbeiten. Anschlie\u00dfend \u00fcbergeben Sie die Datei an den Game Designer, der das Verhalten \u00e4ndern kann, ohne das Spiel neu zu kompilieren oder den Code zu \u00e4ndern.<\/p>\n<p>Entscheidungsb\u00e4ume sind \u00e4u\u00dferst n\u00fctzlich, wenn sie automatisch auf der Grundlage eines gro\u00dfen Beispiel-Sets erstellt werden (zum Beispiel unter Verwendung des ID3-Algorithmus). Dies macht sie zu einem effizienten und leistungsstarken Werkzeug zur Klassifizierung von Situationen basierend auf den gesammelten Daten. Wir gehen jedoch \u00fcber ein einfaches System zur Auswahl von Aktionen durch Agenten hinaus.<\/p>\n<h3>Szenarien<\/h3>\n<p>\nWir haben ein Entscheidungsbaum-System untersucht, das vordefinierte Bedingungen und Aktionen verwendete. Der Entwickler von KI kann den Baum nach seinen Vorstellungen gestalten, muss jedoch immer noch auf den Programmierer zur\u00fcckgreifen, der alles implementiert hat. Was w\u00e4re, wenn wir dem Designer die Werkzeuge geben k\u00f6nnten, um eigene Bedingungen oder Aktionen zu erstellen?<\/p>\n<p>Damit der Programmierer keinen Code f\u00fcr die Bedingungen Is Ball Left Of Paddle und Is Ball Right Of Paddle schreiben muss, kann er ein System schaffen, in dem der Designer die Bedingungen zur \u00dcberpr\u00fcfung dieser Werte festlegt. Dann w\u00fcrde die Datenstruktur des Entscheidungsbaums folgenderma\u00dfen aussehen:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/8e77f7c3410d097e8b7d8e1209355cc6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIm Grunde genommen ist dies dasselbe wie in der ersten Tabelle, aber die L\u00f6sungen haben einen eigenen Code, der ein wenig an den bedingten Teil eines if-Operators erinnert. Im Code w\u00fcrde dies in der zweiten Spalte f\u00fcr Entscheidungsknoten ausgelesen, aber anstelle der Suche nach einer spezifischen Bedingung zum Ausf\u00fchren (Ist der Ball links vom Paddle?) bewertet es den bedingten Ausdruck und gibt entsprechend true oder false zur\u00fcck. Dies geschieht mit der Skriptsprache Lua oder Angelscript. Mit diesen kann der Entwickler Objekte in seinem Spiel (Ball und Paddle) annehmen und Variablen erstellen, die im Skript verf\u00fcgbar sind (ball.position). Dar\u00fcber hinaus ist die Skriptsprache einfacher als C++. Sie erfordert keinen vollst\u00e4ndigen Kompilierungsprozess, was sie ideal f\u00fcr schnelle Anpassungen der Spiel-Logik macht und es \u201eNicht-Programmierern\u201c erm\u00f6glicht, eigene Funktionen zu erstellen.<\/p>\n<p>Im gegebenen Beispiel wird die Skriptsprache nur zur Bewertung des bedingten Ausdrucks verwendet, aber sie kann auch f\u00fcr Aktionen genutzt werden. Zum Beispiel k\u00f6nnten Daten wie Bewege Paddle nach Rechts zu einem Skriptoperator werden (ball.position.x += 10). So kann die Aktion auch im Skript definiert werden, ohne dass eine Programmierung f\u00fcr 'Bewege Paddle nach Rechts' erforderlich ist.<\/p>\n<p>Man kann noch einen Schritt weiter gehen und einen Entscheidungsbaum vollst\u00e4ndig in einer Skriptsprache formulieren. Der Code wird in Form von festen (hardcoded) Bedingungsoperatoren vorliegen, die jedoch in externen Skriptdateien gespeichert sind, sodass sie ohne eine vollst\u00e4ndige Neukompilierung des Programms ge\u00e4ndert werden k\u00f6nnen. Oft kann die Skriptdatei w\u00e4hrend des Spiels ge\u00e4ndert werden, um verschiedene KI-Reaktionen schnell zu testen.<\/p>\n<h3>Ereignisreaktion<\/h3>\n<p>\nDie obigen Beispiele eignen sich hervorragend f\u00fcr Pong. Sie f\u00fchren kontinuierlich den Zyklus Sense\/Think\/Act aus und handeln basierend auf dem letzten Zustand der Welt. In komplexeren Spielen muss jedoch auf einzelne Ereignisse reagiert werden, anstatt alles auf einmal zu bewerten. Pong ist in diesem Fall also ein ungeeignetes Beispiel. Lassen Sie uns ein anderes w\u00e4hlen. <\/p>\n<p>Stellen Sie sich einen Shooter vor, in dem die Feinde bewegungslos bleiben, bis sie den Spieler entdecken, woraufhin sie je nach ihrer \u201eSpezialisierung\u201c handeln: Einige werden \u201erushen\u201c, w\u00e4hrend andere aus der Ferne angreifen. Dies ist immer noch ein grundlegendes Reaktionssystem \u2013 \u201eWenn der Spieler gesehen wird, dann tue etwas\u201c \u2013 aber es kann logisch in das Ereignis \u201eSpieler gesehen\u201c und die Reaktion (w\u00e4hlen Sie eine Antwort und f\u00fchren Sie diese aus) unterteilt werden.<\/p>\n<p>Das bringt uns zur\u00fcck zum Zyklus Sense\/Think\/Act. Wir k\u00f6nnen den Sense-Teil programmieren, der in jedem Frame \u00fcberpr\u00fcft, ob die KI den Spieler sieht. Wenn nicht, passiert nichts, aber wenn sie sieht, wird das Ereignis Player Seen ausgel\u00f6st. Der Code wird einen separaten Abschnitt haben, der besagt: \u201ewenn das Ereignis Player Seen eintritt, mache\u201c, wobei  die Antwort ist, die ben\u00f6tigt wird, um auf die Teile Think und Act zuzugreifen. So k\u00f6nnen Sie die Reaktionen auf das Ereignis Player Seen einstellen: f\u00fcr einen \u201erushenden\u201c Charakter \u2013 ChargeAndAttack, und f\u00fcr einen Sniper \u2013 HideAndSnipe. Diese Verbindungen k\u00f6nnen in der Datendatei erstellt werden, um schnelle Anpassungen vorzunehmen, ohne die Notwendigkeit, neu zu kompilieren. Hier kann auch eine Skriptsprache verwendet werden.<\/p>\n<h2>Komplexe Entscheidungen treffen<\/h2>\n<p>\nObwohl einfache Reaktionssysteme sehr effektiv sein k\u00f6nnen, gibt es viele Situationen, in denen sie nicht ausreichen. Manchmal m\u00fcssen Entscheidungen getroffen werden, die auf dem aktuellen Verhalten des Agenten basieren, was schwer als Bedingung darzustellen ist. Oft gibt es zu viele Bedingungen, um sie effektiv in einem Entscheidungsbaum oder Skript abzubilden. Manchmal ist es notwendig, im Voraus zu bewerten, wie sich die Situation entwickeln wird, bevor eine Entscheidung \u00fcber den n\u00e4chsten Schritt getroffen wird. F\u00fcr diese Herausforderungen sind komplexere Ans\u00e4tze erforderlich.<\/p>\n<h3>Endlicher Automat<\/h3>\n<p>\nEin endlicher Automat oder FSM (Finite State Machine) ist ein Konzept, das besagt, dass sich unser Agent derzeit in einem von mehreren m\u00f6glichen Zust\u00e4nden befindet und dass er von einem Zustand in einen anderen wechseln kann. Es gibt eine bestimmte Anzahl solcher Zust\u00e4nde, daher der Name. Ein gutes Beispiel aus dem Alltag ist eine Ampel. An verschiedenen Orten gibt es unterschiedliche Lichtfolgen, aber das Prinzip bleibt gleich \u2013 jeder Zustand steht f\u00fcr etwas (stoppen, gehen usw.). Die Ampel befindet sich zu jedem Zeitpunkt nur in einem Zustand und wechselt basierend auf einfachen Regeln von einem Zustand in den anderen.<\/p>\n<p>In Spielen mit NPCs gibt es eine \u00e4hnliche Geschichte. Nehmen wir als Beispiel einen W\u00e4chter mit diesen Zust\u00e4nden:<\/p>\n<ul>\n<li>Patrouillierend (Patrolling).<\/li>\n<li>Angreifend (Attacking).<\/li>\n<li>Fl\u00fcchtend (Fleeing).<\/li>\n<\/ul>\n<p>\nUnd mit diesen Bedingungen zur \u00c4nderung seines Zustands:<\/p>\n<ul>\n<li>Wenn der W\u00e4chter den Gegner sieht, greift er an.<\/li>\n<li>Wenn der W\u00e4chter angreift, aber den Gegner nicht mehr sieht, kehrt er zur Patrouille zur\u00fcck.<\/li>\n<li>Wenn der W\u00e4chter angreift, aber schwer verwundet ist, flieht er.<\/li>\n<\/ul>\n<p>\nMan kann auch if-Anweisungen mit der Status-Variable des W\u00e4chters und verschiedenen Pr\u00fcfungen schreiben: Gibt es einen Feind in der N\u00e4he, wie hoch ist der Gesundheitszustand des NPC usw. F\u00fcgen wir noch einige weitere Zust\u00e4nde hinzu:<\/p>\n<ul>\n<li>Inaktiv (Idling) \u2014 zwischen den Patrouillen.<\/li>\n<li>Suchend (Searching) \u2014 wenn der gesichtete Feind verschwunden ist.<\/li>\n<li>Hilfe suchen (Finding Help) \u2014 wenn ein Feind bemerkt wird, der jedoch zu stark ist, um alleine gegen ihn zu k\u00e4mpfen.<\/li>\n<\/ul>\n<p>\nDie Auswahl f\u00fcr jeden von ihnen ist eingeschr\u00e4nkt \u2014 zum Beispiel wird der W\u00e4chter nicht nach einem verschwundenen Feind suchen, wenn er wenig Gesundheit hat.<\/p>\n<p>Letztendlich kann eine umfangreiche Liste von &bdquo;Wenn-Dann&ldquo;-Bedingungen zu un&uuml;bersichtlich werden. Daher sollten wir einen formalisierten Ansatz entwickeln, der es uns erm&ouml;glicht, die Zust&auml;nde und &Uuml;berg&auml;nge zwischen diesen Zust&auml;nden im Blick zu behalten. &lt;x \u0438 y, \u043d\u043e \u043d\u0435 z&gt;, dann &lt;p&gt;Um dies zu erreichen, werden wir alle m&ouml;glichen Zust&auml;nde ber&uuml;cksichtigen und unter jedem Zustand eine Liste aller &Uuml;berg&auml;nge zu anderen Zust&auml;nden zusammenstellen, einschlie&szlig;lich der daf&uuml;r erforderlichen Bedingungen.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/ba4c401aa20de3d22d2478cba5a4b1ec.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDies ist eine Zustands\u00fcbergangstabelle \u2014 eine komplexe Methode zur Darstellung von FSM. Lassen Sie uns ein Diagramm zeichnen und erhalten einen kompletten \u00dcberblick dar\u00fcber, wie sich das Verhalten des NPC \u00e4ndert.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/b4182359983cf573872dacc575af13dc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas Diagramm veranschaulicht den Entscheidungsprozess dieses Agenten basierend auf der aktuellen Situation. Jede Pfeil zeigt den \u00dcbergang zwischen Zust\u00e4nden an, wenn die Bedingungen daneben erf\u00fcllt sind.<\/p>\n<p>Bei jedem Update \u00fcberpr\u00fcfen wir den aktuellen Zustand des Agenten, sehen uns die Liste der \u00dcberg\u00e4nge an, und wenn die Bedingungen f\u00fcr den \u00dcbergang erf\u00fcllt sind, nimmt er einen neuen Zustand an. Beispielsweise wird bei jedem Frame gepr\u00fcft, ob der 10-Sekunden-Timer abgelaufen ist, und falls ja, wechselt der W\u00e4chter vom Zustand Idling in den Zustand Patrolling. Ebenso \u00fcberpr\u00fcft der Zustand Attacking die Gesundheit des Agenten - ist diese niedrig, wechselt er in den Zustand Fleeing.<\/p>\n<p>Das betrifft die Verarbeitung der \u00dcberg\u00e4nge zwischen Zust\u00e4nden, aber wie sieht es mit dem Verhalten aus, das mit den Zust\u00e4nden selbst verbunden ist? Bei der Implementierung des tats\u00e4chlichen Verhaltens f\u00fcr einen bestimmten Zustand gibt es normalerweise zwei Arten von \u201eHooks\u201c, bei denen wir Aktionen der FSM zuweisen:<\/p>\n<ul>\n<li>Aktionen, die wir regelm\u00e4\u00dfig f\u00fcr den aktuellen Zustand ausf\u00fchren.<\/li>\n<li>Aktionen, die wir beim \u00dcbergang von einem Zustand in einen anderen durchf\u00fchren.<\/li>\n<\/ul>\n<p>\nBeispiele f\u00fcr den ersten Typ. Im Zustand Patrolling bewegt sich der Agent in jedem Frame entlang des Patrouillenpfades. Im Zustand Attacking wird in jedem Frame versucht, einen Angriff zu starten oder in einen Zustand zu wechseln, wenn dies m\u00f6glich ist.<\/p>\n<p>Beim zweiten Typ betrachten wir den \u00dcbergang: \u201eWenn der Feind sichtbar ist und zu stark, dann wechsle in den Zustand Finding Help.\u201c Der Agent muss entscheiden, wohin er gehen soll, um Hilfe zu holen, und diese Information speichern, damit der Zustand Finding Help wei\u00df, wo er sich hinwenden kann. Sobald Hilfe gefunden ist, wechselt der Agent zur\u00fcck in den Zustand Attacking. In diesem Moment m\u00f6chte er seinem Verb\u00fcndeten von der Bedrohung berichten, weshalb die Aktion NotifyFriendOfThreat entstehen kann.<\/p>\n<p>Und erneut k\u00f6nnen wir dieses System durch die Linse des Zyklus Sense \/ Think \/ Act betrachten. Sense zeigt sich in den Daten, die f\u00fcr die Logik des \u00dcbergangs verwendet werden. Think besteht aus den \u00dcberg\u00e4ngen, die in jedem Zustand verf\u00fcgbar sind. Und Act wird durch Aktionen realisiert, die periodisch innerhalb des Zustands oder bei \u00dcberg\u00e4ngen zwischen Zust\u00e4nden durchgef\u00fchrt werden.<\/p>\n<p>St\u00e4ndige Abfragen der \u00dcbergangsbedingungen k\u00f6nnen teuer sein. Wenn jeder Agent zum Beispiel bei jedem Frame komplexe Berechnungen anstellt, um zu bestimmen, ob er Feinde sieht und ob er vom Zustand Patrouillieren zum Angreifen \u00fcbergehen kann, ben\u00f6tigt das viel Rechenzeit. <\/p>\n<p>Wesentliche \u00c4nderungen im Zustand der Welt k\u00f6nnen als Ereignisse betrachtet werden, die verarbeitet werden, sobald sie eintreten. Anstatt dass die FSM bei jedem Frame pr\u00fcft, ob die Bedingung \"Kann mein Agent den Spieler sehen?\" vorliegt, kann ein separates System eingerichtet werden, das die Pr\u00fcfungen seltener durchf\u00fchrt (z.B. 5 Mal pro Sekunde). Das Ergebnis w\u00e4re \"Spieler gesehen\", wenn die Pr\u00fcfung erfolgreich ist. <\/p>\n<p>Dies wird an die FSM \u00fcbergeben, die nun in den Zustand \"Spieler gesehen, Ereignis empfangen\" wechseln und entsprechend reagieren muss. Das endg\u00fcltige Verhalten bleibt gleich, abgesehen von einer nahezu unmerklichen Verz\u00f6gerung vor der Antwort. Die Leistung hat sich jedoch durch die Trennung des Teils Sense in einen separaten Teil des Programms verbessert.<\/p>\n<h3>Hierarchische finite Zustandsmaschine<\/h3>\n<p>\nMit gro\u00dfen FSM zu arbeiten, ist jedoch nicht immer bequem. Wenn wir den Angriffsstatus erweitern m\u00f6chten, indem wir ihn durch separate MeleeAttacking (Nahkampf) und RangedAttacking (Fernkampf) ersetzen, m\u00fcssen wir die \u00dcberg\u00e4nge aus allen anderen Zust\u00e4nden \u00e4ndern, die zum Zustand Attacking (Angreifen) f\u00fchren (sowohl die aktuellen als auch zuk\u00fcnftige).<\/p>\n<p>Sie haben sicherlich bemerkt, dass unser Beispiel viele doppelte \u00dcberg\u00e4nge enth\u00e4lt. Die meisten \u00dcberg\u00e4nge im Zustand Idling sind identisch mit den \u00dcberg\u00e4ngen im Zustand Patrolling. Es w\u00e4re vorteilhaft, nicht redundant zu sein, insbesondere wenn wir weitere \u00e4hnliche Zust\u00e4nde hinzuf\u00fcgen. Es macht Sinn, Idling und Patrolling unter einem gemeinsamen Label 'nicht k\u00e4mpfend' zu gruppieren, bei dem es nur einen gemeinsamen Satz von \u00dcberg\u00e4ngen zu k\u00e4mpfenden Zust\u00e4nden gibt. Wenn wir dieses Label als Zustand betrachten, werden Idling und Patrolling zu Unterzust\u00e4nden. Ein Beispiel f\u00fcr die Verwendung einer separaten \u00dcbergangstabelle f\u00fcr den neuen nicht k\u00e4mpfenden Unterzustand:<\/p>\n<p><i>Hauptzust\u00e4nde:<\/i><br \/>\n<img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/d86dd918acbe81b9bf22c2fb34aecee3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<i>Zustand au\u00dferhalb des Kampfes:<\/i><br \/>\n<img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/9d5bc2053010a32c5f68d7f0192c04ed.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUnd in Form eines Diagramms:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/0ccf95ecafa9ce2a6ea5b5b9833ddc4f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDies ist dasselbe System, jedoch mit einem neuen nicht-k\u00e4mpferischen Zustand, der das Idling und Patrolling umfasst. Jeder Zustand enth\u00e4lt eine FSM mit Unterzust\u00e4nden (und diese Unterzust\u00e4nde enthalten wiederum eigene FSMs \u2013 und so weiter, wie viele Sie ben\u00f6tigen), was uns zur Hierarchical Finite State Machine oder HFSM (hierarchische endliche Automate) f\u00fchrt. Durch die Gruppierung des nicht-k\u00e4mpferischen Zustands haben wir viele redundante \u00dcberg\u00e4nge entfernt. Das Gleiche k\u00f6nnen wir f\u00fcr alle neuen Zust\u00e4nde mit gemeinsamen \u00dcberg\u00e4ngen tun. Wenn wir beispielsweise in Zukunft den Zustand Attacking auf die Zust\u00e4nde MeleeAttacking und MissileAttacking erweitern, werden diese Unterzust\u00e4nde sein, die basierend auf der Entfernung zum Feind und dem Vorhandensein von Munition untereinander wechseln. So k\u00f6nnen komplexe Verhaltensmodelle und Untermodelle mit minimalen redundanten \u00dcberg\u00e4ngen dargestellt werden.<\/p>\n<h3>Verhaltensbaum<\/h3>\n<p>\nMit HFSM lassen sich komplexe Verhaltensmuster einfach erstellen. Dennoch gibt es eine kleine Schwierigkeit: Die Entscheidungsfindung in Form von \u00dcbergangsregeln ist eng mit dem aktuellen Zustand verbunden. In vielen Spielen ist genau das erforderlich. Eine sorgf\u00e4ltige Nutzung der Zustandshierarchie kann die Anzahl der Wiederholungen bei \u00dcberg\u00e4ngen verringern. Manchmal sind jedoch Regeln erforderlich, die unabh\u00e4ngig vom aktuellen Zustand funktionieren oder die in nahezu allen Zust\u00e4nden angewendet werden. Zum Beispiel, wenn die Gesundheit des Agents auf 25% f\u00e4llt, m\u00f6chten Sie, dass er unabh\u00e4ngig davon, ob er k\u00e4mpft, herumsitzt oder spricht, wegl\u00e4uft \u2014 daf\u00fcr m\u00fcssen Sie diese Bedingung in jeden Zustand einf\u00fcgen. Wenn Ihr Designer sp\u00e4ter den Schwellenwert f\u00fcr niedrige Gesundheit von 25% auf 10% \u00e4ndern m\u00f6chte, muss wieder daran gearbeitet werden.<\/p>\n<p>Idealerweise ben\u00f6tigen wir f\u00fcr diese Situation ein System, in dem die Entscheidungen dar\u00fcber, \u201ein welchem Zustand man sich befinden soll\u201c, au\u00dferhalb der Zust\u00e4nde selbst liegen, um \u00c4nderungen nur an einem Ort vorzunehmen und die \u00dcbergangsbedingungen nicht zu beeinflussen. Hier kommen Verhaltenstrees ins Spiel.<\/p>\n<p>Es gibt verschiedene M\u00f6glichkeiten, sie umzusetzen, aber das Grundprinzip ist f\u00fcr alle \u00e4hnlich und \u00e4hnelt einem Entscheidungsbaum: Der Algorithmus beginnt mit dem \"Wurzel\"-Knoten, und im Baum gibt es Knoten, die entweder Entscheidungen oder Aktionen darstellen. Allerdings gibt es einige wichtige Unterschiede:<\/p>\n<ul>\n<li>Jetzt liefern die Knoten eines von drei Werten zur\u00fcck: Succeeded (wenn die Arbeit erfolgreich war), Failed (wenn sie nicht gestartet werden konnte) oder Running (wenn sie noch l\u00e4uft und kein Endergebnis vorliegt).<\/li>\n<li>Es gibt keine Entscheidungsknoten mehr, um zwischen zwei Alternativen zu w\u00e4hlen. Stattdessen gibt es Decorator-Knoten, die einen einzigen Kindknoten haben. Wenn sie erfolgreich sind, f\u00fchren sie ihren einzigen Kindknoten aus.<\/li>\n<li>Die Knoten, die Aktionen ausf\u00fchren, geben den Wert Running zur\u00fcck, um die durchgef\u00fchrten Aktionen darzustellen.<\/li>\n<\/ul>\n<p>\nDieses kleine Set an Knoten kann kombiniert werden, um eine Vielzahl komplexer Verhaltensmodelle zu erstellen. Stellen wir uns das HFSM des W\u00e4chters aus dem vorherigen Beispiel in Form eines Verhaltensbaums vor:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/5eaa5c725e4ada8285f16f95bb206d53.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMit dieser Struktur sollte es keinen klaren \u00dcbergang von den Zust\u00e4nden Idling\/Patrolling in den Zustand Attacking oder in andere Zust\u00e4nde geben. Wenn der Feind sichtbar ist und die Gesundheit des Charakters niedrig ist, bleibt die Ausf\u00fchrung im Knoten Fleeing stehen, egal welchen Knoten er zuvor ausgef\u00fchrt hat \u2013 Patrolling, Idling, Attacking oder einen anderen.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/e1c1dcc2055174aa7cfa846364b1709a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVerhaltenb\u00e4ume sind komplex \u2013 es gibt viele M\u00f6glichkeiten, sie zusammenzustellen, und das Finden der richtigen Kombination von Dekoratoren und zusammengesetzten Knoten kann problematisch sein. Es gibt auch Fragen, wie oft der Baum \u00fcberpr\u00fcft werden sollte \u2013 wollen wir jeden Teil durchlaufen oder nur, wenn sich eine der Bedingungen ge\u00e4ndert hat? Wie speichert man den Zustand, der sich auf die Knoten bezieht \u2013 wie erkennt man, wann wir 10 Sekunden im Zustand Idling waren oder wie wei\u00df man, welche Knoten beim letzten Mal ausgef\u00fchrt wurden, um die Sequenz richtig zu verarbeiten?<\/p>\n<p>Deshalb gibt es viele Implementierungen. In einigen Systemen haben Dekorationsknoten eingebaute Dekoratoren ersetzt. Diese bewerten den Baum bei \u00c4nderungen der Bedingungen des Dekorators neu, helfen beim Verbinden von Knoten und bieten regelm\u00e4\u00dfige Aktualisierungen.<\/p>\n<h3>Nutzungsbasiertes System<\/h3>\n<p>\nEinige Spiele verf\u00fcgen \u00fcber eine Vielzahl unterschiedlicher Mechaniken. Es ist vorteilhaft, wenn sie alle Vorteile einfacher und allgemeiner \u00dcbergangsregeln nutzen, aber nicht zwingend in Form eines vollst\u00e4ndigen Verhaltensbaums. Anstatt \u00fcber einen klaren Satz von Entscheidungen oder einen Baum m\u00f6glicher Aktionen zu verf\u00fcgen, ist es einfacher, alle Aktionen zu studieren und den aktuell passendsten auszuw\u00e4hlen.<\/p>\n<p>Ein utilitaristisches System unterst\u00fctzt genau dabei. Es handelt sich um ein System, in dem der Agent eine Vielzahl von Aktionen hat und selbst ausw\u00e4hlt, welche er ausf\u00fchrt, basierend auf der relativen N\u00fctzlichkeit jeder einzelnen. Dabei ist N\u00fctzlichkeit ein willk\u00fcrliches Ma\u00df daf\u00fcr, wie wichtig oder w\u00fcnschenswert die Ausf\u00fchrung dieser Aktion f\u00fcr den Agenten ist. <\/p>\n<p>Der Agent kann die berechnete N\u00fctzlichkeit einer Handlung basierend auf dem aktuellen Zustand und der Umgebung \u00fcberpr\u00fcfen und jederzeit den am besten geeigneten anderen Zustand ausw\u00e4hlen. Dies \u00e4hnelt einem FSM, abgesehen davon, dass die \u00dcberg\u00e4nge durch die Bewertung jedes potenziellen Zustands, einschlie\u00dflich des aktuellen, bestimmt werden. Beachten Sie, dass wir die n\u00fctzlichste Aktion f\u00fcr den \u00dcbergang w\u00e4hlen (oder bleiben, wenn wir sie bereits ausgef\u00fchrt haben). F\u00fcr mehr Vielfalt k\u00f6nnte dies eine gewichtete, aber zuf\u00e4llige Auswahl aus einer kleinen Liste sein.<\/p>\n<p>Das System weist einen zuf\u00e4lligen Bereich von N\u00fctzlichkeitswerten zu \u2013 zum Beispiel von 0 (v\u00f6llig unerw\u00fcnscht) bis 100 (vollst\u00e4ndig w\u00fcnschenswert). Jede Aktion hat eine Reihe von Parametern, die die Berechnung dieses Wertes beeinflussen. Zur\u00fcck zu unserem Beispiel mit dem W\u00e4chter:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/085fb2c197bde93d78455d18e63c9c25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u00dcberg\u00e4nge zwischen Aktionen sind unklar \u2013 jeder Zustand kann auf jeden anderen folgen. Die Priorit\u00e4ten der Aktionen basieren auf den zur\u00fcckgegebenen Nutzwerten. Wenn der Feind sichtbar und stark ist und die Gesundheit des Charakters niedrig ist, geben sowohl Fliehen als auch Hilfe finden hohe, nicht null Werte zur\u00fcck. Dabei wird Hilfe finden immer h\u00f6her bewertet. \u00c4hnlich erhalten nicht-k\u00e4mpferische Aktionen niemals mehr als 50, weshalb sie immer unter den k\u00e4mpferischen Aktionen liegen werden. Dies sollte bei der Erstellung von Aktionen und der Berechnung ihrer N\u00fctzlichkeit ber\u00fccksichtigt werden.<\/p>\n<p>In unserem Beispiel geben die Aktionen entweder einen festen Wert oder einen von zwei festen Werten zur\u00fcck. Ein realistisches System w\u00fcrde jedoch eine Bewertung aus einem kontinuierlichen Wertebereich zur\u00fcckgeben. Zum Beispiel liefert die Aktion Fliehen h\u00f6here Nutzenwerte, wenn die Gesundheit des Agenten niedrig ist, w\u00e4hrend die Aktion Angreifen niedrigere Werte zur\u00fcckgibt, wenn der Gegner zu stark ist. Daher hat die Aktion Fliehen Vorrang vor Angreifen, wenn der Agent glaubt, dass er nicht genug Gesundheit hat, um den Gegner zu besiegen. Dies erm\u00f6glicht es, die Priorit\u00e4ten der Aktionen basierend auf verschiedenen Kriterien zu \u00e4ndern, was diesen Ansatz flexibler und variabler macht als ein Verhaltensbaum oder eine FSM.<\/p>\n<p>Jede Aktion hat viele Bedingungen zur Berechnung des Programms. Diese k\u00f6nnen in einer Skriptsprache oder als Reihe von mathematischen Formeln verfasst werden. In Die Sims, das den Tagesablauf eines Charakters simuliert, wird eine zus\u00e4tzliche Ebene der Berechnungen hinzugef\u00fcgt \u2013 der Agent erh\u00e4lt eine Reihe von \u201eMotivationen\u201c, die die N\u00fctzlichkeitseinsch\u00e4tzungen beeinflussen. Wenn der Charakter hungrig ist, wird er im Laufe der Zeit noch hungriger, und das Ergebnis der Handlung EatFood wird steigen, bis der Charakter diese Handlung ausf\u00fchrt, wodurch der Hunger gesenkt und der Wert von EatFood auf null zur\u00fcckgesetzt wird. <\/p>\n<p>Die Idee, Aktionen auf der Grundlage eines Bewertungssystems auszuw\u00e4hlen, ist ziemlich einfach, weshalb ein utilitaristisches System als Teil des Entscheidungsprozesses von KI verwendet werden kann, anstatt es vollst\u00e4ndig zu ersetzen. Ein Entscheidungbaum kann die N\u00fctzlichkeitsbewertung von zwei Kindknoten anfordern und den h\u00f6her bewerteten ausw\u00e4hlen. In \u00e4hnlicher Weise kann ein Verhaltensbaum einen zusammengesetzten Nutzenknoten haben, der die N\u00fctzlichkeit der Aktionen bewertet, um zu entscheiden, welches Kindlement ausgef\u00fchrt werden soll.<\/p>\n<h2>Bewegung und Navigation<\/h2>\n<p>\nIn den vorherigen Beispielen hatten wir eine Plattform, die wir nach links oder rechts bewegten, und einen W\u00e4chter, der patrouillierte oder angreift. Aber wie genau k\u00fcmmern wir uns um die Bewegung des Agenten \u00fcber einen bestimmten Zeitraum? Wie legen wir die Geschwindigkeit fest, wie vermeiden wir Hindernisse und wie planen wir die Route, wenn es schwieriger ist, das Ziel zu erreichen, als einfach geradeaus zu gehen? Lassen Sie uns das genauer betrachten.<\/p>\n<h3>Verwaltung<\/h3>\n<p>\nZu Beginn nehmen wir an, dass jeder Agent eine Geschwindigkeitsgr\u00f6\u00dfe hat, die umfasst, wie schnell er sich bewegt und in welche Richtung. Diese kann in Metern pro Sekunde, Kilometern pro Stunde, Pixeln pro Sekunde usw. gemessen werden. In Bezug auf den Zyklus Sense\/Think\/Act k\u00f6nnen wir uns vorstellen, dass der Teil Think die Geschwindigkeit ausw\u00e4hlt und der Teil Act diese Geschwindigkeit auf den Agenten anwendet. In Spielen gibt es normalerweise ein physikalisches System, das diese Aufgabe f\u00fcr Sie \u00fcbernimmt, indem es die Geschwindigkeitswerte jedes Objekts analysiert und anpasst. Daher kann die KI mit einer einzigen Aufgabe betraut werden \u2013 zu entscheiden, welche Geschwindigkeit der Agent haben sollte. Wenn bekannt ist, wo sich der Agent befinden soll, muss er in die richtige Richtung mit der festgelegten Geschwindigkeit bewegt werden. Eine sehr triviale Gleichung:<\/p>\n<p><i>desired_travel = destination_position \u2013 agent_position<\/i><\/p>\n<p>Stellen Sie sich eine 2D-Welt vor. Der Agent befindet sich an Punkt (-2,-2), das Ziel irgendwo im Nordosten bei Punkt (30, 20). Der notwendige Weg f\u00fcr den Agenten, um dorthin zu gelangen, betr\u00e4gt (32, 22). Angenommen, diese Positionen werden in Metern gemessen \u2013 wenn wir die Geschwindigkeit des Agenten mit 5 Metern pro Sekunde annehmen, w\u00fcrden wir unseren Bewegungsvektor skalieren und eine Geschwindigkeit von etwa (4,12, 2,83) erhalten. Mit diesen Parametern w\u00fcrde der Agent das Ziel in fast 8 Sekunden erreichen.<\/p>\n<p>Die Werte k\u00f6nnen jederzeit neu berechnet werden. Wenn der Agent sich auf halbem Weg zum Ziel bef\u00e4nde, w\u00e4re die Bewegung die H\u00e4lfte der Strecke, aber da die maximale Geschwindigkeit des Agenten 5 m\/s betr\u00e4gt (wie wir zuvor festgestellt haben), bleibt die Geschwindigkeit gleich. Dies funktioniert auch f\u00fcr sich bewegende Ziele, sodass der Agent kleine Anpassungen vornehmen kann, w\u00e4hrend sich diese bewegen.<\/p>\n<p>Wir m\u00f6chten jedoch mehr Variabilit\u00e4t \u2014 zum Beispiel die Geschwindigkeit langsam erh\u00f6hen, um eine Figur zu simulieren, die aus dem Stand in den Lauf \u00fcbergeht. Ebenso kann dies am Ende vor dem Anhalten erfolgen. Diese Funktionen sind als Steering-Verhalten bekannt, von denen jedes einen spezifischen Namen besitzt: Seek (Suchen), Flee (Fliehen), Arrival (Ankommen) usw. Die Idee dahinter ist, dass Beschleunigungskr\u00e4fte auf die Geschwindigkeit des Agenten angewendet werden k\u00f6nnen, basierend auf dem Vergleich der Position des Agenten und der aktuellen Geschwindigkeit mit dem Zielort, um verschiedene Bewegungsarten zur Zielerreichung zu nutzen.<\/p>\n<p>Jedes Verhalten hat ein leicht anderes Ziel. Seek und Arrival sind Methoden, um den Agenten zu einem Zielpunkt zu bewegen. Obstacle Avoidance (\u00dcberwindung von Hindernissen) und Separation (Trennung) passen die Bewegung des Agenten an, um Hindernisse auf dem Weg zum Ziel zu umgehen. Alignment (Ausrichtung) und Cohesion (Zusammenhalt) sorgen daf\u00fcr, dass die Agenten zusammenbleiben, w\u00e4hrend sie sich bewegen. Eine beliebige Anzahl verschiedener Steuerungsverhalten kann summiert werden, um einen einzigen Pfadvektor unter Ber\u00fccksichtigung aller Faktoren zu erhalten. Ein Agent, der die Verhaltensweisen Arrival, Separation und Obstacle Avoidance nutzt, um sich von W\u00e4nden und anderen Agenten fernzuhalten. Dieser Ansatz funktioniert gut in offenen Umgebungen ohne unn\u00f6tige Details. <\/p>\n<p>In schwierigeren Bedingungen funktioniert die Kombination verschiedener Verhaltensweisen schlechter \u2013 zum Beispiel kann ein Agent in einer Wand stecken bleiben aufgrund eines Konflikts zwischen Arrival und Obstacle Avoidance. Daher m\u00fcssen wir Optionen in Betracht ziehen, die komplexer sind als einfach die Addition aller Werte. Eine Methode besteht darin, anstelle der Addition der Ergebnisse jedes Verhaltens die Bewegung in verschiedene Richtungen zu betrachten und die beste Option zu w\u00e4hlen. <\/p>\n<p>In einer komplexen Umgebung mit Sackgassen und der Entscheidung, in welche Richtung man gehen soll, ben\u00f6tigen wir jedoch etwas noch Fortgeschrittenes.<\/p>\n<h3>Pfadfindung<\/h3>\n<p>\nSteuerverhalten eignet sich hervorragend f\u00fcr die einfache Fortbewegung im Freien (z. B. auf einem Fu\u00dfballfeld oder in einer Arena), wo der Weg von A nach B direkt ist und nur minimale Abweichungen um Hindernisse erforderlich sind. F\u00fcr komplexere Routen ben\u00f6tigen wir Pathfinding, das eine Methode zur Erkundung der Welt und zur Entscheidungsfindung \u00fcber den besten Weg durch sie ist.<\/p>\n<p>Der einfachste Weg besteht darin, ein Gitter auf jedes Quadrat neben dem Agenten zu legen und zu bewerten, in welchen davon Bewegungen erlaubt sind. Wenn eines von ihnen das Ziel ist, folgen Sie von dort aus dem Weg von jedem Quadrat zu dem zuvorigen, bis Sie den Anfang erreichen. Das ist der Weg. Andernfalls wiederholen Sie den Prozess mit den n\u00e4chstgelegenen anderen Quadraten, bis Sie das Ziel finden oder keine Quadrate mehr vorhanden sind (was bedeutet, dass kein m\u00f6glicher Weg existiert). Das ist formal bekannt als Breadth-First Search oder BFS (Breitensuche). In jedem Schritt wird in alle Richtungen geschaut (daher \u201eBreite\u201c). Der Suchraum \u00e4hnelt einer Wellenfront, die sich bewegt, bis das gesuchte Ziel erreicht ist \u2013 das Suchgebiet dehnt sich bei jedem Schritt aus, bis der Endpunkt erreicht ist, wonach der Weg zum Anfang zur\u00fcckverfolgt werden kann.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/d367e62bc53033b05388538649853a41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nInfolge dessen erhalten Sie eine Liste der Quadrate, anhand derer der ben\u00f6tigte Weg erstellt wird. Das ist der Pfad (pathfinding) \u2013 eine Liste der Orte, die der Agent besuchen wird, w\u00e4hrend er zum Ziel gelangt.<\/p>\n<p>Da wir die Position jedes Quadrats auf der Welt kennen, k\u00f6nnen wir Steuerungsverhalten nutzen, um den Weg von Knoten 1 zu Knoten 2 und dann von Knoten 2 zu Knoten 3 und so weiter zu bewegen. Die einfachste Option besteht darin, sich auf das Zentrum des n\u00e4chsten Quadrats zuzubewegen, aber noch besser ist es, in der Mitte der Kante zwischen dem aktuellen Quadrat und dem n\u00e4chsten zu halten. Dadurch kann der Agent an scharfen Kurven die Ecken abschneiden.<\/p>\n<p>Der BFS-Algorithmus hat auch Nachteile \u2013 er untersucht genauso viele Quadrate in die \"falsche\" Richtung wie in die \"richtige\". Hier kommt ein komplexerer Algorithmus ins Spiel, der A* (A-Stern) hei\u00dft. Er funktioniert ebenfalls, aber anstatt blind die Nachbarquadrate (dann die Nachbarn der Nachbarn, dann die Nachbarn der Nachbarn der Nachbarn und so weiter) zu erkunden, erstellt er eine Liste von Knoten und sortiert sie so, dass der n\u00e4chste untersuchte Knoten immer der ist, der zur k\u00fcrzesten Route f\u00fchrt. Die Knoten werden anhand einer Heuristik sortiert, die zwei Dinge ber\u00fccksichtigt \u2013 die \"Kosten\" der hypothetischen Route zum gew\u00fcnschten Quadrat (einschlie\u00dflich aller Bewegungs- oder Umzugskosten) und eine Sch\u00e4tzung, wie weit dieses Quadrat vom Ziel entfernt ist (was die Suche in die richtige Richtung lenkt).<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/1cab4f53fa5af6b31d352c7bcf453d7e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn diesem Beispiel wird gezeigt, dass der Agent jeweils ein Quadrat erkundet, wobei er immer das vielversprechendste benachbarte Quadrat ausw\u00e4hlt. Der resultierende Pfad ist derselbe wie bei BFS, aber es wurden dabei weniger Quadrate ber\u00fccksichtigt \u2013 was sich erheblich auf die Leistung des Spiels auswirkt.<\/p>\n<h3>Bewegung ohne Raster<\/h3>\n<p>\nDie meisten Spiele sind jedoch nicht in einem Raster angeordnet, und oft ist es nicht m\u00f6glich, ein solches Raster ohne Verlust an Realismus einzuf\u00fchren. Kompromisse sind erforderlich. Wie gro\u00df sollten die Quadrate sein? Zu gro\u00df \u2013 und sie k\u00f6nnen enge Korridore oder Kurven nicht korrekt darstellen, zu klein \u2013 und es gibt zu viele Quadrate zu durchsuchen, was letztendlich viel Zeit in Anspruch nimmt.<\/p>\n<p>Das erste, was zu verstehen ist \u2013 das Gitter stellt ein Netzwerk aus verbundenen Knoten dar. Die Algorithmen A* und BFS arbeiten im Wesentlichen mit Graphen und sind unabh\u00e4ngig von unserem Gitter. Wir k\u00f6nnten Knoten \u00fcberall im Spielraum platzieren: Solange eine Verbindung zwischen zwei verbundenen Knoten besteht, sowie zwischen dem Start- und dem Endpunkt und mindestens einem der Knoten, wird der Algorithmus genauso gut funktionieren wie zuvor. Oft wird dies als Wegpunkt-System (waypoint) bezeichnet, da jeder Knoten eine bedeutende Position in der Welt darstellt, die Teil einer beliebigen Anzahl von hypothetischen Wegen sein kann.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/d87e9d4bb2a2fc713d32abc158506eaa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Beispiel 1: Ein Knoten in jedem Quadrat. Die Suche beginnt beim Knoten, in dem sich der Agent befindet, und endet beim Knoten des gew\u00fcnschten Quadrats.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/b535a5db805efdc427d7c5724b866982.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Beispiel 2: Ein kleinerer Knoten-Satz (Wegpunkte). Die Suche beginnt im Quadrat mit dem Agenten, durchl\u00e4uft die erforderliche Anzahl an Knoten und setzt sich dann bis zum Ziel fort.<\/i><\/p>\n<p>Dies ist ein sehr flexibles und leistungsstarkes System. Allerdings ist Vorsicht geboten, wenn es darum geht, wo und wie Wegpunkte gesetzt werden; andernfalls k\u00f6nnten die Agenten den n\u00e4chstgelegenen Punkt einfach nicht sehen und ihren Weg nicht beginnen. Es w\u00e4re einfacher, wenn wir Wegpunkte automatisch basierend auf der Geometrie der Welt platzieren k\u00f6nnten.<\/p>\n<p>Hier kommt das Navigationsnetz oder navmesh ins Spiel. Dabei handelt es sich in der Regel um ein 2D-Netz aus Dreiecken, das auf die Geometrie der Welt projiziert wird \u2013 \u00fcberall dort, wo Agenten sich bewegen d\u00fcrfen. Jedes der Dreiecke im Netz wird zu einem Knoten im Graphen und hat bis zu drei benachbarte Dreiecke, die als benachbarte Knoten im Graphen fungieren. <\/p>\n<p>Dieses Bild ist ein Beispiel aus der Unity-Engine \u2013 sie hat die Geometrie der Welt analysiert und das navmesh erstellt (auf dem Screenshot in hellblauer Farbe). Jedes Polygon im navmesh ist ein Bereich, auf dem ein Agent stehen oder von einem Polygon zu einem anderen wechseln kann. In diesem Beispiel sind die Polygone kleiner als die Etagen, auf denen sie sich befinden \u2013 dies wurde gemacht, um die Gr\u00f6\u00dfen des Agents zu ber\u00fccksichtigen, die \u00fcber seine nominelle Position hinausgehen.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/845705ba7b9a9d469203aedf7942da41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir k\u00f6nnen einen Pfad durch dieses Netzwerk suchen, indem wir erneut den A*-Algorithmus verwenden. Dies wird uns einen nahezu perfekten Pfad in einer Welt bieten, die die gesamte Geometrie ber\u00fccksichtigt, ohne zus\u00e4tzliche Knoten oder Wegpunkte zu erfordern.<\/p>\n<p>Pathfinding ist ein zu umfangreiches Thema, das nicht in einem einzigen Abschnitt behandelt werden kann. Wenn Sie es ausf\u00fchrlicher studieren m\u00f6chten, kann Ihnen dabei <noindex><a rel=\"nofollow\" href=\"https:\/\/www.redblobgames.com\/pathfinding\/a-star\/introduction.html\">die Website von Amit Patel helfen.<\/a><\/noindex>.<\/p>\n<h2>Planung<\/h2>\n<p>\nWir haben beim Pathfinding festgestellt, dass es manchmal nicht ausreicht, einfach eine Richtung zu w\u00e4hlen und loszulaufen \u2013 wir m\u00fcssen den richtigen Weg w\u00e4hlen und mehrere Abbiegungen machen, um unser Ziel zu erreichen. Wir k\u00f6nnen diese Idee zusammenfassen: Das Erreichen eines Ziels ist nicht nur der n\u00e4chste Schritt, sondern eine gesamte Abfolge von Handlungen, bei der es manchmal erforderlich ist, ein paar Schritte vorauszuschauen, um zu wissen, wie der erste Schritt aussehen sollte. Dies nennt man Planung. Pathfinding kann als eine der Erg\u00e4nzungen zur Planung betrachtet werden. In Bezug auf unseren Sense\/Think\/Act-Zyklus ist dies der Teil, wo der Teil Think mehrere Teile Act f\u00fcr die Zukunft plant.<\/p>\n<p>Lassen Sie uns ein Beispiel aus dem Kartenspiel Magic: The Gathering nehmen. Wir ziehen zuerst mit diesem Kartenset:<\/p>\n<ul>\n<li>Swamp \u2013 erzeugt 1 schwarze Mana (Landkarte).<\/li>\n<li>Forest \u2014 gibt 1 gr\u00fcnes Mana (Landkarte).<\/li>\n<li>Fugitive Wizard \u2014 ben\u00f6tigt 1 blaues Mana f\u00fcr den Beschw\u00f6rungszauber.<\/li>\n<li>Elvish Mystic \u2014 ben\u00f6tigt 1 gr\u00fcnes Mana f\u00fcr den Beschw\u00f6rungszauber.<\/li>\n<\/ul>\n<p>\nDie verbleibenden drei Karten ignorieren wir, um es einfacher zu machen. Nach den Regeln darf der Spieler pro Zug 1 Landkarte spielen und kann diese Karte \u201etappen\u201c, um Mana daraus zu gewinnen, und dann Zauberspr\u00fcche (einschlie\u00dflich der Beschw\u00f6rung von Kreaturen) entsprechend der Menge an Mana verwenden. In dieser Situation wei\u00df der menschliche Spieler, dass er Forest spielen, 1 gr\u00fcnes Mana \u201etappen\u201c und dann Elvish Mystic beschw\u00f6ren muss. Aber wie kann der Spiel-Ideen-Algorithmus das herausfinden?<\/p>\n<h3>Einfache Planung<\/h3>\n<p>\nEin trivialer Ansatz w\u00e4re, jede Aktion nacheinander auszuprobieren, bis keine geeigneten mehr vorhanden sind. Betrachtet man die Karten, sieht die KI, dass sie Swamp spielen kann. Und sie spielt es. Gibt es noch andere Aktionen in dieser Runde? Sie kann weder Elvish Mystic noch Fugitive Wizard beschw\u00f6ren, da f\u00fcr deren Beschw\u00f6rung entsprechend gr\u00fcnes und blaues Mana erforderlich ist, w\u00e4hrend Swamp nur schwarzes Mana bietet. Au\u00dferdem kann sie Forest nicht mehr spielen, da sie bereits Swamp gespielt hat. So hat die Spiel-KI nach den Regeln gespielt, jedoch nicht optimal. Es gibt Verbesserungsm\u00f6glichkeiten.<\/p>\n<p>Die Planung kann eine Liste von Aktionen finden, die das Spiel in den gew\u00fcnschten Zustand versetzen. So wie jedes Quadrat auf dem Pfad Nachbarn hatte (im Pathfinding), hat auch jede Aktion im Plan Nachbarn oder Nachfolger. Wir k\u00f6nnen diese Aktionen und die folgenden Schritte suchen, bis wir den gew\u00fcnschten Zustand erreichen.<\/p>\n<p>In unserem Beispiel ist das gew\u00fcnschte Ergebnis \u201eein Wesen zu beschw\u00f6ren, wenn m\u00f6glich\u201c. Zu Beginn des Zuges sehen wir nur zwei m\u00f6gliche Aktionen, die durch die Spielregeln erlaubt sind:<\/p>\n<p><i>1. Schlage einen S\u00fcmpf (Ergebnis: S\u00fcmpf im Spiel)<br \/>\n2. Schlage einen Wald (Ergebnis: Wald im Spiel)<\/i><\/p>\n<p>Jede get\u00e4tigte Aktion kann zu weiteren Aktionen f\u00fchren und andere schlie\u00dfen, wiederum abh\u00e4ngig von den Spielregeln. Stellen Sie sich vor, wir haben den S\u00fcmpf gespielt \u2014 damit wird der S\u00fcmpf als n\u00e4chster Schritt entfernt (wir haben ihn bereits gespielt), auch der Wald wird entfernt (da gem\u00e4\u00df den Regeln nur eine Landkarte pro Zug ausgespielt werden kann). Daraufhin f\u00fcgt die KI als n\u00e4chsten Schritt das Erhalten von 1 schwarzer Mana hinzu, da es keine anderen Optionen gibt. Wenn sie weitergeht und den S\u00fcmpf aktiviert, erh\u00e4lt sie 1 Einheit schwarze Mana und kann damit nichts anstellen.<\/p>\n<p><i>1. Schlage einen S\u00fcmpf (Ergebnis: S\u00fcmpf im Spiel)<br \/>\n 1.1 \u00abTappen\u00bb Sumpf (Ergebnis: Sumpf \u00abgetappt\u00bb, +1 Einheit schwarzes Mana)<br \/>\n Keine verf\u00fcgbaren Aktionen \u2013 ENDE<br \/>\n2. Schlage einen Wald (Ergebnis: Wald im Spiel)<\/i><\/p>\n<p>Die Liste der Aktionen ist kurz, wir sind in eine Sackgasse geraten. Wir wiederholen den Prozess f\u00fcr die n\u00e4chste Aktion. Wir spielen Wald, aktivieren die Aktion \u201e1 gr\u00fcnes Mana erhalten\u201c, die wiederum die dritte Aktion \u00f6ffnet \u2013 den Elbischen Mystiker herbeirufen.<\/p>\n<p><i>1. Schlage einen S\u00fcmpf (Ergebnis: S\u00fcmpf im Spiel)<br \/>\n 1.1 \u00abTappen\u00bb Sumpf (Ergebnis: Sumpf \u00abgetappt\u00bb, +1 Einheit schwarzes Mana)<br \/>\n Keine verf\u00fcgbaren Aktionen \u2013 ENDE<br \/>\n2. Schlage einen Wald (Ergebnis: Wald im Spiel)<br \/>\n 2.1 \u00abTappen\u00bb Wald (Ergebnis: Wald \u00abgetappt\u00bb, +1 Einheit gr\u00fcnes Mana)<br \/>\n 2.1.1 Elbischen Mystiker herbeirufen (Ergebnis: Elbischer Mystiker im Spiel, -1 Einheit gr\u00fcnes Mana)<br \/>\n Keine verf\u00fcgbaren Aktionen \u2013 ENDE<\/i><\/p>\n<p>Schlie\u00dflich haben wir alle m\u00f6glichen Aktionen untersucht und einen Plan gefunden, um ein Wesen herbeizurufen.<\/p>\n<p>Dies ist ein stark vereinfachtes Beispiel. Es ist ratsam, den bestm\u00f6glichen Plan auszuw\u00e4hlen, anstatt irgendeinen, der bestimmten Kriterien entspricht. In der Regel kann man potenzielle Pl\u00e4ne anhand des Endergebnisses oder des kumulierten Nutzens ihrer Ausf\u00fchrung bewerten. Man kann sich 1 Punkt f\u00fcr das Spielen von L\u00e4nderkarten und 3 Punkte f\u00fcr das Herbeirufen eines Wesens gutschreiben. Das Spielen eines Sumpfs w\u00fcrde 1 Punkt bringen. Aber Wald spielen \u2192 Wald tappen \u2192 Elbischen Mystiker herbeirufen, w\u00fcrde sofort 4 Punkte bringen. <\/p>\n<p>So funktioniert die Planung in Magic: The Gathering, und dieselbe Logik kann auch in anderen Situationen angewendet werden. Zum Beispiel, einen Bauern zu ziehen, um Platz f\u00fcr einen L\u00e4ufer im Schach zu schaffen. Oder sich hinter einer Wand zu verstecken, um in XCOM sicher zu schie\u00dfen. Kurz gesagt, das Prinzip ist klar.<\/p>\n<h3>Verbesserte Planung<\/h3>\n<p>\nManchmal gibt es zu viele potenzielle Aktionen, als dass man jede m\u00f6gliche Option in Betracht ziehen k\u00f6nnte. Zur\u00fcck zum Beispiel mit Magic: The Gathering: Angenommen, man hat mehrere Landkarten und Kreaturen auf der Hand \u2013 die Anzahl der m\u00f6glichen Zugkombinationen k\u00f6nnte in die Zehner gehen. Es gibt mehrere Ans\u00e4tze zur L\u00f6sung des Problems.<\/p>\n<p>Die erste Methode ist das Backwards Chaining. Anstatt alle Kombinationen zu durchlaufen, ist es besser, mit dem Endergebnis zu beginnen und einen direkten Pfad zu suchen. Anstatt vom Wurzelknoten des Baumes zu einem bestimmten Blatt zu gehen, bewegen wir uns in umgekehrter Richtung \u2013 vom Blatt zur\u00fcck zur Wurzel. Diese Methode ist einfacher und schneller.<\/p>\n<p>Wenn der Gegner 1 Lebenspunkt hat, kann man den Plan \"1 oder mehr Schadenspunkte verursachen\" finden. Um dies zu erreichen, m\u00fcssen eine Reihe von Bedingungen erf\u00fcllt werden: <\/p>\n<p>1. Ein Zauber kann Schaden anrichten \u2014 er muss in der Hand sein.<br \/>\n2. Um einen Zauber zu wirken \u2014 wird Mana ben\u00f6tigt.<br \/>\n3. Um Mana zu erhalten \u2014 muss eine Landkarte ausgespielt werden.<br \/>\n4. Um eine Landkarte auszuspielen \u2014 muss sie in der Hand sein.<\/p>\n<p>Ein anderer Ansatz ist die Best-First-Suche. Anstatt alle Wege zu \u00fcberpr\u00fcfen, w\u00e4hlen wir den passendsten aus. Oft f\u00fchrt diese Methode zu einem optimalen Plan ohne \u00fcberfl\u00fcssige Suchkosten. A* ist eine Form der Best-First-Suche \u2014 indem sie von Anfang an die vielversprechendsten Routen erkundet, kann sie bereits den besten Weg finden, ohne die anderen Optionen pr\u00fcfen zu m\u00fcssen.<\/p>\n<p>Eine interessante und immer beliebter werdende Variante der Best-First-Suche ist die Monte Carlo Tree Search. Anstatt zu erraten, welche Pl\u00e4ne besser sind als andere bei der Auswahl jeder nachfolgenden Aktion, w\u00e4hlt der Algorithmus in jedem Schritt zuf\u00e4llige Nachfolger, bis er ein Ende erreicht (wenn der Plan zu einem Sieg oder einer Niederlage f\u00fchrt). Anschlie\u00dfend wird das Endergebnis verwendet, um das \u00abGewicht\u00bb der vorherigen Optionen zu erh\u00f6hen oder zu senken. Durch mehrmaliges Wiederholen dieses Prozesses bietet der Algorithmus eine gute Einsch\u00e4tzung, welcher n\u00e4chste Schritt besser ist, selbst wenn sich die Situation \u00e4ndert (wenn der Gegner Ma\u00dfnahmen ergreift, um den Spieler zu behindern). <\/p>\n<p>Im Kontext des Game Planning ist es unm\u00f6glich, Goal-Oriented Action Planning oder GOAP (zielorientierte Aktionsplanung) zu ignorieren. Dies ist eine weit verbreitete und diskutierte Methode, aber abgesehen von einigen besonderen Details ist es im Grunde genommen eine Form des Backwards Chaining, \u00fcber die wir zuvor gesprochen haben. Wenn die Aufgabe darin besteht, den Spieler zu 'eliminieren' und der Spieler sich hinter einem Deckung befindet, k\u00f6nnte der Plan folgenderma\u00dfen aussehen: Mit einer Granate vernichten \u2192 sie holen \u2192 werfen.<\/p>\n<p>Es gibt in der Regel mehrere Ziele, jedes mit seiner eigenen Priorit\u00e4t. Wenn das Ziel mit der h\u00f6chsten Priorit\u00e4t nicht erreicht werden kann (keine Handlungskombination f\u00fchrt zu einem Plan, um den Spieler zu eliminieren, weil der Spieler nicht sichtbar ist), wird die KI zu Zielen mit niedrigerer Priorit\u00e4t zur\u00fcckkehren.<\/p>\n<h2>Training und Anpassung<\/h2>\n<p>\nWir haben bereits erw\u00e4hnt, dass Spiel-KIs in der Regel kein maschinelles Lernen verwenden, da dies nicht geeignet ist, um Agenten in Echtzeit zu steuern. Das bedeutet jedoch nicht, dass wir nichts aus diesem Bereich \u00fcbernehmen k\u00f6nnen. Wir w\u00fcnschen uns einen Gegner in einem Shooter, von dem man lernen kann. Zum Beispiel, um die besten Positionen auf der Karte zu erkennen. Oder einen Gegner im Kampfspiel, der oft verwendete Kombinationen des Spielers blockiert und so motiviert, andere Techniken zu verwenden. In solchen Situationen kann maschinelles Lernen sehr n\u00fctzlich sein.<\/p>\n<h3>Statistiken und Wahrscheinlichkeiten<\/h3>\n<p>\nBevor wir zu komplexeren Beispielen \u00fcbergehen, wollen wir zun\u00e4chst absch\u00e4tzen, wie weit wir mit einigen einfachen Messungen und deren Verwendung f\u00fcr Entscheidungen kommen k\u00f6nnen. Zum Beispiel, wie k\u00f6nnen wir in Echtzeit herausfinden, ob ein Spieler in den ersten Minuten des Spiels einen Angriff starten kann und welche Verteidigungsstrategie wir dagegen vorbereiten sollten? Wir k\u00f6nnen die bisherigen Erfahrungen des Spielers analysieren, um zu verstehen, wie seine zuk\u00fcnftige Reaktion aussehen k\u00f6nnte. Zun\u00e4chst haben wir keine Ausgangsdaten, aber wir k\u00f6nnen sie sammeln \u2013 jedes Mal, wenn die KI gegen einen Menschen spielt, k\u00f6nnte sie die Zeit bis zum ersten Angriff aufzeichnen. Nach mehreren Sitzungen w\u00fcrden wir den Durchschnittswert der Zeit erhalten, nach der ein Spieler in Zukunft angreifen wird.<\/p>\n<p>Mittelwerte bringen jedoch auch ein Problem mit sich: Wenn ein Spieler 20 Mal \u201arushte\u2018 und 20 Mal langsam spielte, w\u00fcrden die ben\u00f6tigten Werte irgendwo in der Mitte liegen, was uns wenig n\u00fctzlich w\u00e4re. Eine L\u00f6sung besteht darin, die Eingabedaten zu begrenzen \u2013 wir k\u00f6nnten die letzten 20 Zeitwerte heranziehen.<\/p>\n<p>Ein \u00e4hnlicher Ansatz wird verwendet, um die Wahrscheinlichkeit bestimmter Aktionen zu bewerten, wobei angenommen wird, dass die fr\u00fcheren Vorlieben eines Spielers in der Zukunft gleich bleiben. Wenn ein Spieler uns f\u00fcnfmal mit einem Feuerball, zweimal mit Blitz und einmal im Nahkampf angreift, ist es offensichtlich, dass er Feuerball bevorzugt. Lassen Sie uns extrapolieren und die Wahrscheinlichkeit der Verwendung verschiedener Waffen sehen: Feuerball = 62,5 %, Blitz = 25 % und Nahkampf = 12,5 %. Unsere Spiel-KI muss sich auf den Schutz vor Feuer vorbereiten.<\/p>\n<p>Eine weitere interessante Methode ist die Verwendung des Naive Bayes Classifier (naiver Bayes-Klassifikator), um gro\u00dfe Mengen an Eingabedaten zu analysieren und die Situation zu klassifizieren, damit die KI entsprechend reagiert. Bayes-Klassifikatoren sind besonders bekannt f\u00fcr ihren Einsatz in Spamfiltern. Dort analysieren sie W\u00f6rter, vergleichen sie mit vorherigen Vorkommen dieser W\u00f6rter (in Spam-Nachrichten oder nicht) und ziehen R\u00fcckschl\u00fcsse auf eingehende E-Mails. Wir k\u00f6nnen dasselbe auch mit weniger Eingabedaten tun. Basierend auf all den n\u00fctzlichen Informationen, die die KI sieht (z. B. welche feindlichen Einheiten erstellt wurden, welche Zauber sie verwenden oder welche Technologien sie erforscht haben), und dem endg\u00fcltigen Ergebnis (Krieg oder Frieden, \u201eRush\u201c oder verteidigen usw.) werden wir das richtige Verhalten der KI ausw\u00e4hlen.<\/p>\n<p>Diese Ausbildungsans\u00e4tze sind zwar ausreichend, jedoch ist es vorteilhaft, sie auf der Grundlage der Testergebnisse zu verwenden. Die KI wird lernen, sich an die verschiedenen Strategien anzupassen, die Ihre Playtester genutzt haben. Eine KI, die sich nach der Ver\u00f6ffentlichung an den Spieler anpasst, kann zu vorhersehbar oder im Gegenteil zu schwierig zu besiegen werden.<\/p>\n<h3>Anpassung basierend auf Werten<\/h3>\n<p>\nAngesichts des Inhalts unserer Spielwelt und der Regeln k\u00f6nnen wir die Menge an Werten ver\u00e4ndern, die die Entscheidungen beeinflussen, anstatt einfach nur die Eingabewerte zu verwenden. So gehen wir vor:<\/p>\n<ul>\n<li>Lassen Sie die KI Daten zum Zustand der Welt und zu Schl\u00fcsselmomenten w\u00e4hrend des Spiels sammeln (wie oben angegeben).<\/li>\n<li>\u00c4ndern wir einige wichtige Werte basierend auf diesen Daten.<\/li>\n<li>Setzen wir unsere Entscheidungen um, die auf der Verarbeitung oder Bewertung dieser Werte basieren.<\/li>\n<\/ul>\n<p>\nZum Beispiel hat der Agent mehrere R\u00e4ume zur Auswahl auf der Karte eines Ego-Shooters. Jeder Raum hat seinen eigenen Wert, der bestimmt, wie w\u00fcnschenswert es ist, ihn zu besuchen. Die KI w\u00e4hlt zuf\u00e4llig aus, in welchen Raum sie gehen m\u00f6chte, basierend auf diesem Wert. Dann merkt sich der Agent, in welchem Raum er get\u00f6tet wurde, und reduziert dessen Wert (d.h. die Wahrscheinlichkeit, dass er dorthin zur\u00fcckkehrt). \u00c4hnlich verh\u00e4lt es sich in der umgekehrten Situation: Wenn der Agent viele Gegner vernichtet, steigt der Wert des Raums.<\/p>\n<h3>Markow-Modell<\/h3>\n<p>\nWas w\u00e4re, wenn wir die gesammelten Daten zur Vorhersage nutzen? Wenn wir uns jeden Raum merken, in dem wir w\u00e4hrend eines bestimmten Zeitraums einen Spieler gesehen haben, k\u00f6nnen wir vorhersagen, in welchen Raum der Spieler gehen k\u00f6nnte. Indem wir die Bewegungen des Spielers durch die R\u00e4ume (Werte) verfolgen und aufzeichnen, k\u00f6nnen wir deren Verhalten prognostizieren.<\/p>\n<p>Nehmen wir an, es gibt drei R\u00e4ume: einen roten, einen gr\u00fcnen und einen blauen. Und au\u00dferdem die Beobachtungen, die wir w\u00e4hrend einer Spielsitzung aufgezeichnet haben:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/6e90a365b72a176c36c9a14213baaafc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDie Anzahl der Beobachtungen f\u00fcr jeden Raum ist nahezu gleich \u2013 wo wir den besten Platz f\u00fcr einen Hinterhalt einrichten k\u00f6nnen, wissen wir noch nicht. Die Datensammlung wird zudem durch das Respawning der Spieler erschwert, die gleichm\u00e4\u00dfig auf der Karte erscheinen. Doch die Informationen \u00fcber den n\u00e4chsten Raum, in den sie nach dem Auftauchen auf der Karte gehen, sind bereits n\u00fctzlich.<\/p>\n<p>Es ist offensichtlich, dass der gr\u00fcne Raum bei den Spielern beliebt ist \u2013 die Mehrheit der Personen aus dem roten Raum wechselt dorthin, wobei 50 % weiterhin dort bleiben. Der blaue Raum hingegen erfreut sich keiner Beliebtheit; kaum jemand betritt ihn, und wenn doch, verweilen sie nicht lange. <\/p>\n<p>Die Daten zeigen uns etwas Wichtigeres: Wenn ein Spieler sich im blauen Raum befindet, ist der n\u00e4chste Raum, in dem wir ihn wahrscheinlich sehen werden, rot und nicht gr\u00fcn. Obwohl der gr\u00fcne Raum beliebter ist als der rote, \u00e4ndert sich die Situation, wenn der Spieler im blauen Raum ist. Der n\u00e4chste Zustand (also der Raum, in den der Spieler wechseln wird) h\u00e4ngt vom vorherigen Zustand (also dem Raum, in dem sich der Spieler derzeit befindet) ab. Durch die Untersuchung dieser Abh\u00e4ngigkeiten k\u00f6nnen wir genauere Vorhersagen treffen, als wenn wir die Beobachtungen unabh\u00e4ngig voneinander z\u00e4hlen w\u00fcrden.<\/p>\n<p>Die Vorhersage des zuk\u00fcnftigen Zustands basierend auf Daten des vergangenen Zustands wird als Markov-Modell bezeichnet, w\u00e4hrend solche Beispiele (mit R\u00e4umen) Markov-Ketten genannt werden. Da diese Modelle die Wahrscheinlichkeit von \u00c4nderungen zwischen aufeinanderfolgenden Zust\u00e4nden darstellen, werden sie visuell als FSM mit Wahrscheinlichkeiten f\u00fcr jeden \u00dcbergang angezeigt. Zuvor verwendeten wir FSM, um den Verhaltenszustand des Agenten darzustellen, aber dieses Konzept gilt f\u00fcr jeden Zustand, unabh\u00e4ngig davon, ob er mit dem Agenten verbunden ist oder nicht. In diesem Fall stellen die Zust\u00e4nde den Raum dar, den der Agent einnimmt:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/edb32dff7a3298b19c3fa4d66f48e9f4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDies ist eine einfache M\u00f6glichkeit, die relative Wahrscheinlichkeit von Zustands\u00e4nderungen darzustellen, die es der KI erm\u00f6glicht, den n\u00e4chsten Zustand vorherzusagen. Man kann mehrere Schritte im Voraus vorhersagen.<\/p>\n<p>Wenn sich der Spieler im gr\u00fcnen Raum befindet, betr\u00e4gt die Wahrscheinlichkeit 50 %, dass er bei der n\u00e4chsten Beobachtung dort bleibt. Aber wie hoch ist die Wahrscheinlichkeit, dass er auch danach noch dort ist? Es gibt nicht nur die Wahrscheinlichkeit, dass der Spieler nach zwei Beobachtungen im gr\u00fcnen Raum bleibt, sondern auch die M\u00f6glichkeit, dass er gegangen ist und zur\u00fcckgekehrt ist. Hier ist eine neue Tabelle, die diese neuen Informationen ber\u00fccksichtigt:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/f87afff68b066a879661e37f68654ae2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAus der Tabelle geht hervor, dass die Wahrscheinlichkeit, den Spieler nach zwei Beobachtungen im gr\u00fcnen Raum zu sehen, 51 % betr\u00e4gt. Davon 21 %, dass er aus dem roten Raum kommt, 5 %, dass der Spieler zwischenzeitlich den blauen Raum besucht hat, und 25 %, dass der Spieler \u00fcberhaupt nicht aus dem gr\u00fcnen Raum gegangen ist.<\/p>\n<p>Die Tabelle ist ein einfaches visuelles Werkzeug \u2013 das Verfahren erfordert nur, dass man die Wahrscheinlichkeiten in jedem Schritt multipliziert. Das bedeutet, dass Sie weit in die Zukunft blicken k\u00f6nnen, mit einer Ausnahme: Wir gehen davon aus, dass die Chance, einen Raum zu betreten, ausschlie\u00dflich von dem aktuellen Raum abh\u00e4ngt. Dies wird als Markow-Eigenschaft bezeichnet \u2013 der zuk\u00fcnftige Zustand h\u00e4ngt nur von der Gegenwart ab. Doch das ist nicht hundertprozentig genau. Spieler k\u00f6nnen Entscheidungen basierend auf anderen Faktoren \u00e4ndern: Gesundheitslevel oder Anzahl der Munition. Da wir diese Werte nicht festhalten, werden unsere Vorhersagen weniger pr\u00e4zise sein.<\/p>\n<h3>N-Gramme<\/h3>\n<p>\nWie sieht es mit dem Beispiel eines Kampfspiels und der Vorhersage von Komboangriffen des Spielers aus? Dasselbe! Aber anstelle eines einzelnen Zustands oder Ereignisses werden wir ganze Sequenzen untersuchen, aus denen der Komboangriff besteht.<\/p>\n<p>Eine M\u00f6glichkeit, dies zu tun, besteht darin, jede Eingabe (beispielsweise Kick, Punch oder Block) im Puffer zu speichern und den gesamten Puffer als Ereignis aufzuzeichnen. Wenn der Spieler wiederholt Kick, Kick, Punch dr\u00fcckt, um den SuperDeathFist-Angriff auszuf\u00fchren, speichert das KI-System alle Eingaben im Puffer und merkt sich die letzten drei, die in jedem Schritt verwendet werden.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man KI f\u00fcr Spiele erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger\" src=\"\/wp-content\/uploads\/2019\/11\/9a95226ae155dca5e45a66d4440f3cd4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Fett markierte Zeilen, wenn der Spieler die SuperDeathFist-Attacke ausf\u00fchrt.)<\/p>\n<p>Die KI wird alle M\u00f6glichkeiten sehen, wenn der Spieler Kick gefolgt von einem weiteren Kick ausw\u00e4hlt, und danach bemerken, dass die n\u00e4chste Eingabe immer Punch ist. Das erm\u00f6glicht dem Agenten, die SuperDeathFist-Kombo vorherzusagen und sie gegebenenfalls zu blockieren.<\/p>\n<p>Diese Abfolgen werden N-Gramme (N-grams) genannt, wobei N die Anzahl der gespeicherten Elemente ist. Im vorherigen Beispiel handelte es sich um ein 3-Gramm (Trigramm), was bedeutet: Die ersten beiden Aufzeichnungen werden verwendet, um die dritte vorherzusagen. In einer 5-Gramm sagen die ersten vier Aufzeichnungen die f\u00fcnfte vorher und so weiter.<\/p>\n<p>Der Entwickler muss die Gr\u00f6\u00dfe der N-Gramme sorgf\u00e4ltig w\u00e4hlen. Eine kleinere Zahl von N ben\u00f6tigt weniger Speicher, speichert aber auch weniger Historie. Zum Beispiel wird ein 2-Gramm (Bigramm) Kick, Kick oder Kick, Punch aufzeichnen, kann jedoch Kick, Kick, Punch nicht speichern, weshalb die KI nicht auf die SuperDeathFist-Kombo reagiert.<\/p>\n<p>Auf der anderen Seite erfordern gro\u00dfe Zahlen mehr Speicher, und es wird schwieriger f\u00fcr die KI, zu lernen, da es viel mehr m\u00f6gliche Optionen gibt. Wenn Sie drei m\u00f6gliche Eingaben wie Kick, Punch oder Block hatten und wir ein 10-Gramm-Modell verwendet haben, ergibt sich etwa 60.000 verschiedene Optionen.<\/p>\n<p>Das Bigramm-Modell ist eine einfache Markov-Kette \u2014 jedes Paar \"vergangener Zustand \/ aktueller Zustand\" stellt ein Bigramm dar, und Sie k\u00f6nnen den zweiten Zustand basierend auf dem ersten vorhersagen. 3-Gramm- und gr\u00f6\u00dfere N-Gramm-Modelle k\u00f6nnen ebenfalls als Markov-Ketten betrachtet werden, bei denen alle Elemente (au\u00dfer dem letzten im N-Gramm) zusammen den ersten Zustand bilden, w\u00e4hrend das letzte Element den zweiten Zustand darstellt. Das Beispiel mit dem Kampfspiel zeigt die \u00dcbergangswahrscheinlichkeit vom Zustand Kick und Kick zu Kick und Punch. Wenn wir mehrere Aufzeichnungen der Eingabevergangenheit als eine Einheit betrachten, transformieren wir im Wesentlichen die Eingabesequenz in einen Teil eines Gesamtzustands. Dies gibt uns die Markov-Eigenschaft, die es erm\u00f6glicht, Markov-Ketten zu verwenden, um die n\u00e4chste Eingabe vorherzusagen und zu raten, welcher Kombinationszug als n\u00e4chstes kommt.<\/p>\n<h2>Fazit<\/h2>\n<p>\nWir haben \u00fcber die g\u00e4ngigsten Werkzeuge und Ans\u00e4tze in der Entwicklung von K\u00fcnstlicher Intelligenz gesprochen. Au\u00dferdem haben wir Situationen er\u00f6rtert, in denen sie angewendet werden m\u00fcssen und wo sie besonders n\u00fctzlich sind. <\/p>\n<p>Das sollte ausreichen, um die grundlegenden Dinge im Bereich des Game AI zu verstehen. Nat\u00fcrlich ist das jedoch bei weitem nicht alles. Zu den weniger popul\u00e4ren, aber nicht weniger effektiven Methoden geh\u00f6ren:<\/p>\n<ul>\n<li>Optimierungsalgorithmen, einschlie\u00dflich Hill Climbing, Gradient Descent und genetischen Algorithmen.<\/li>\n<li>Wettbewerbsf\u00e4hige Such-\/Planungsalgorithmen (Minimax und Alpha-Beta-Pruning).<\/li>\n<li>Klassifikationsmethoden (Perzeptronen, neuronale Netze und Support Vector Machines).<\/li>\n<li>Systeme zur Verarbeitung von Wahrnehmung und Ged\u00e4chtnis von Agenten.<\/li>\n<li>Architektonische Ans\u00e4tze zur KI (hybride Systeme, Teilmengen von Architekturen und andere Methoden zur \u00dcberlagerung von KI-Systemen).<\/li>\n<li>Animationswerkzeuge (Planung und Koordinierung von Bewegungen).<\/li>\n<li>Leistungsfaktoren (Detailierungsgrad, Anytime-Algorithmen und Timeslicing).<\/li>\n<\/ul>\n<p>\nInternetressourcen zu diesem Thema:<\/p>\n<p>1. Auf GameDev.net gibt es <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gamedev.net\/articles\/programming\/artificial-intelligence\/\">einen Bereich mit Artikeln und Tutorials zu KI.<\/a><\/noindex>, sowie <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gamedev.net\/forums\/forum\/6-artificial-intelligence\/\">Forum<\/a><\/noindex>.<br \/>\n2. <noindex><a rel=\"nofollow\" href=\"http:\/\/aigamedev.com\/\">AiGameDev.com<\/a><\/noindex> enth\u00e4lt eine Vielzahl von Pr\u00e4sentationen und Artikeln zu einem breiten Spektrum von Themen im Bereich der Entwicklung von Game AI.<br \/>\n3. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gdcvault.com\/\">Der GDC Vault<\/a><\/noindex> beinhaltet Themen vom GDC AI Summit, von denen viele kostenlos verf\u00fcgbar sind.<br \/>\n4. N\u00fctzliche Materialien finden Sie auch auf der Website <noindex><a rel=\"nofollow\" href=\"http:\/\/gameai.com\/\">AI Game Programmers Guild<\/a><\/noindex>.<br \/>\n5. Tommy Thompson, KI-Forscher und Spieleentwickler, erstellt Videos auf dem YouTube-Kanal <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/user\/tthompso\">AI and Games<\/a><\/noindex> mit Erkl\u00e4rungen und Untersuchungen zur KI in kommerziellen Spielen.<\/p>\n<p>B\u00fccher zu dem Thema:<\/p>\n<p>1. Die Buchreihe Game AI Pro besteht aus Sammlungen kurzer Artikel, die erkl\u00e4ren, wie man spezifische Funktionen implementiert oder bestimmte Probleme l\u00f6st.<\/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: Gesammeltes Wissen von Game AI-Profis<\/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: Gesammeltes Wissen von Game AI-Profis<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2KF4irS\">Game AI Pro 3: Gesammeltes Wissen von Game AI-Profis<\/a><\/noindex><\/p>\n<p>2. Die Reihe AI Game Programming Wisdom ist der Vorl\u00e4ufer der Serie Game AI Pro. Sie enth\u00e4lt \u00e4ltere Methoden, die jedoch bis heute fast alle relevant sind.<\/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\">Artificial Intelligence: A Modern Approach<\/a><\/noindex> ist eines der grundlegenden Werke f\u00fcr alle, die sich mit dem allgemeinen Bereich der k\u00fcnstlichen Intelligenz auseinandersetzen m\u00f6chten. Dieses Buch behandelt nicht die Spielentwicklung \u2014 es lehrt die grundlegenden Prinzipien der KI.<br \/>\n<br \/>Quelle: <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-novosti-interneta"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - 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 \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\" \/>\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\/de\/blog\/novosti-interneta\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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 \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/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\udd47So erstellen Sie KI f\u00fcr Spiele: Ein Leitfaden f\u00fcr Anf\u00e4nger | ProHoster","description":"Ich bin auf ein interessantes Material \u00fcber K\u00fcnstliche Intelligenz in Spielen gesto\u00dfen. Es erkl\u00e4rt die grundlegenden Konzepte der KI anhand einfacher Beispiele und enth\u00e4lt viele n\u00fctzliche Werkzeuge und Methoden f\u00fcr eine komfortable Entwicklung und Planung. Auch wie, wo und wann man sie verwenden kann, ist dabei. Die meisten Beispiele sind in Pseudocode verfasst, sodass keine tiefen Programmierkenntnisse erforderlich sind. Unter dem Beitrag finden Sie 35","canonical_url":"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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 \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","og:url":"https:\/\/prohoster.info\/de\/blog\/novosti-interneta\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/52118","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=52118"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/52118\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=52118"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=52118"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=52118"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}