{"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\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","title":{"rendered":"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" 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 grundlegende Dinge \u00fcber KI anhand einfacher Beispiele und enth\u00e4lt viele n\u00fctzliche Werkzeuge und Methoden f\u00fcr die bequeme Entwicklung und Gestaltung. Wo, wie und wann man sie einsetzen kann, wird ebenfalls behandelt.<\/p>\n<p>Die meisten Beispiele sind in Pseudocode verfasst, daher sind keine tiefen Programmierkenntnisse erforderlich. Unter dem Beitrag sind 35 Seiten Text mit Bildern und GIFs, also bereitet euch vor.<\/p>\n<p>UPD. Entschuldigung, aber ich habe bereits meine eigene \u00dcbersetzung dieses Artikels auf Habr gemacht. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/PatientZero\/\">PatientZero<\/a><\/noindex>. Man kann seine Version lesen <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/420219\/\">hier<\/a><\/noindex>, aber aus irgendeinem Grund ist der Artikel an mir vorbeigegangen (ich habe die Suche benutzt, aber etwas lief schief). Da ich in einem Blog schreibe, der sich mit Game Development besch\u00e4ftigt, habe ich beschlossen, meine \u00dcbersetzung f\u00fcr die Abonnenten zu hinterlassen (einige Punkte habe ich anders formuliert, andere wurden absichtlich auf Anraten der Entwickler weggelassen).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Was ist KI?<\/h2>\n<p>\nSpiel-KI konzentriert sich darauf, welche Aktionen ein Objekt basierend auf den Bedingungen, in denen es sich befindet, ausf\u00fchren sollte. Dies wird normalerweise als Steuerung \u201eintelligenter Agenten\u201c bezeichnet, wobei der Agent eine Spielfigur, ein Fahrzeug, ein Bot oder manchmal etwas Abstrakteres ist: eine ganze Gruppe von Entit\u00e4ten oder sogar eine Zivilisation. In jedem Fall handelt es sich um etwas, das seine Umgebung wahrnehmen, Entscheidungen darauf basierend treffen und entsprechend handeln muss. Dies wird als Zyklus von Sense\/Think\/Act (Wahrnehmen\/Denken\/Handeln) bezeichnet:<\/p>\n<ul>\n<li>Sense: Der Agent findet oder erh\u00e4lt Informationen \u00fcber Dinge in seiner Umgebung, die sein Verhalten beeinflussen k\u00f6nnten (drohende Gefahren in der N\u00e4he, Sammelobjekte, interessante Orte zur Erkundung).<\/li>\n<li>Think: Der Agent entscheidet, wie er reagieren soll (pr\u00fcft, ob es sicher genug ist, Objekte zu sammeln, oder ob er zuerst k\u00e4mpfen\/sich verstecken sollte).<\/li>\n<li>Act: Der Agent f\u00fchrt Aktionen aus, um die vorherige Entscheidung umzusetzen (beginnt, sich auf den Gegner oder das Objekt zuzubewegen).<\/li>\n<li>\u2026die Situation hat sich jetzt aufgrund der Aktionen der Charaktere ver\u00e4ndert, 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. Autonome Fahrzeuge machen zum Beispiel Bilder der Stra\u00dfe, kombinieren sie mit Radar- und LiDAR-Daten und interpretieren diese. Normalerweise \u00fcbernimmt das maschinelles Lernen, das Eingabedaten verarbeitet und ihnen Bedeutung verleiht, indem es semantische Informationen wie \u201eDa ist ein weiteres Auto 20 Yards vor Ihnen\u201c extrahiert. Dies sind sogenannte Klassifikationsprobleme.<\/p>\n<p>Spiele ben\u00f6tigen kein komplexes System zur Informationsgewinnung, da der Gro\u00dfteil der Daten bereits ein integraler Bestandteil ist. Es ist nicht notwendig, Algorithmen zur Bildverarbeitung einzusetzen, um festzustellen, ob ein Gegner vor einem steht \u2014 das Spiel wei\u00df bereits Bescheid und \u00fcbermittelt 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 beachtet werden m\u00fcssen:<\/p>\n<ul>\n<li>Die KI muss nicht im Voraus trainiert werden, wie es bei einem Machine-Learning-Algorithmus der Fall ist. Es ist sinnlos, w\u00e4hrend der Entwicklung ein neuronales Netzwerk zu schreiben, um Dutzende von Tausenden von Spielern zu beobachten und den besten Spielansatz gegen sie zu erlernen. Warum? Weil das Spiel nicht ver\u00f6ffentlicht ist und es keine Spieler gibt.<\/li>\n<li>Das Spiel soll unterhalten und herausfordern, deshalb sollten die Agenten nicht den besten Ansatz gegen Menschen finden.<\/li>\n<li>Die Agenten m\u00fcssen realistisch wirken, damit die Spieler das Gef\u00fchl haben, gegen echte Menschen zu spielen. Das Programm AlphaGo hat den Menschen \u00fcbertroffen, aber die gew\u00e4hlten Z\u00fcge waren fernab des traditionellen Verst\u00e4ndnisses des Spiels. Wenn ein Spiel einen menschlichen Gegner imitiert, sollte es dieses Gef\u00fchl nicht haben. Der Algorithmus muss angepasst werden, damit er plausible Entscheidungen trifft und nicht perfekte.<\/li>\n<li>Die KI muss in Echtzeit arbeiten. Das bedeutet, dass der Algorithmus die CPU nicht \u00fcber l\u00e4ngere Zeitr\u00e4ume monopolartig f\u00fcr Entscheidungsfindungen nutzen kann. Selbst 10 Millisekunden daf\u00fcr sind zu lang, da den meisten Spielen ausreichend 16 bis 33 Millisekunden zur Verf\u00fcgung stehen, um die gesamte Verarbeitung durchzuf\u00fchren und zum n\u00e4chsten Grafikframe \u00fcberzugehen.<\/li>\n<li>Ideal w\u00e4re es, wenn zumindest ein Teil des Systems datengetrieben gesteuert wird, damit auch \u201eNicht-Coder\u201c \u00c4nderungen vornehmen k\u00f6nnen und Anpassungen schneller erfolgen.<\/li>\n<\/ul>\n<p>\nLassen Sie uns die KI-Ans\u00e4tze betrachten, die den gesamten Zyklus Sinn\/Denk\/Handeln abdecken.<\/p>\n<h3>Grundlegende Entscheidungen treffen<\/h3>\n<p>\nLass uns mit einem einfachen Spiel beginnen \u2013 Pong. Ziel: Bewege das Paddle so, dass der Ball davon abprallt und nicht daran vorbeifliegt. Es ist wie Tennis, bei dem du verlierst, wenn du den Ball nicht zur\u00fcckspielst. Hier hat die KI eine relativ einfache Aufgabe \u2013 zu entscheiden, in welche Richtung sie das Paddle bewegen soll.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" 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, das Paddle unter dem Ball zu positionieren.<\/p>\n<p>Ein einfacher Algorithmus daf\u00fcr, in Pseudocode geschrieben:<\/p>\n<p><i>f\u00fcr jedes Frame\/Update, w\u00e4hrend das Spiel l\u00e4uft:<br \/>\nwenn der Ball links vom Paddle ist:<br \/>\n bewege das Paddle nach links<br \/>\nsonst, wenn der Ball rechts vom Paddle ist:<br \/>\n bewege das Paddle nach rechts<\/i><\/p>\n<p>Wenn das Paddle 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 die Daten und m\u00f6glichen Aktionen f\u00fcr den Agenten nicht viele sind.<\/p>\n<p>Dieser Ansatz ist so einfach, dass der gesamte Zyklus Sense\/Think\/Act kaum wahrnehmbar ist. Aber er ist vorhanden:<\/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 das Paddle ist, also fragt die KI danach. <\/li>\n<li>Der Teil Think wird ebenfalls durch zwei if-Operatoren dargestellt. Sie verk\u00f6rpern zwei Entscheidungen, die in diesem Fall sich gegenseitig ausschlie\u00dfen. Infolge dessen wird eine von drei Aktionen gew\u00e4hlt \u2013 das Paddle nach links bewegen, nach rechts bewegen oder nichts tun, wenn es bereits richtig 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 das Paddle sofort oder mit einer bestimmten Geschwindigkeit bewegen. <\/li>\n<\/ul>\n<p>\nSolche Ans\u00e4tze werden reaktiv genannt \u2013 es gibt eine einfache Regelset (in diesem Fall if-Operatoren im Code), die auf den aktuellen Zustand der Welt reagieren und handeln.<\/p>\n<h3>Entscheidungsbaum<\/h3>\n<p>\nDas Beispiel mit dem Spiel Pong entspricht tats\u00e4chlich dem formalen Konzept der KI, das Entscheidungsbaum genannt wird. Der Algorithmus durchl\u00e4uft ihn, um zu einem \u201eBlatt\u201c zu gelangen \u2013 eine Entscheidung dar\u00fcber, welche Aktion zu ergreifen ist.<\/p>\n<p>Lass uns ein Flussdiagramm des Entscheidungsbaums f\u00fcr unseren Paddle-Algorithmus erstellen:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/d3b7290ba93144967cd849416cd5eef3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJeder Teil des Baumes wird als Node (Knoten) bezeichnet \u2013 die KI verwendet die Graphentheorie zur Beschreibung solcher Strukturen. Es gibt zwei Arten von Knoten:<\/p>\n<ul>\n<li>Entscheidungsknoten: eine Wahl zwischen zwei Alternativen basierend auf der \u00dcberpr\u00fcfung einer Bedingung, wobei jede Alternative als eigener 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 (dem \u201eWurzel\u201c-Knoten des Baums). Er trifft entweder eine Entscheidung, zu welchem Kindknoten er wechseln soll, oder f\u00fchrt eine im Knoten gespeicherte Aktion aus und beendet sich.<\/p>\n<p>Was ist also der Vorteil, wenn der Entscheidungsbaum die gleiche Funktion wie die if-Anweisungen im vorherigen Abschnitt erf\u00fcllt? Hier gibt es ein allgemeines System, bei 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 repr\u00e4sentieren, ohne hart kodiert zu werden. Stellen wir es in Tabellenform dar:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" 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 zum Lesen von Zeilen. Erstellen Sie einen Knoten f\u00fcr jede von ihnen, verbinden Sie die Entscheidungslogik basierend auf der zweiten Spalte und die Kindknoten basierend auf der dritten und vierten Spalte. Sie m\u00fcssen weiterhin die Bedingungen und Aktionen programmieren, aber jetzt wird die Struktur des Spiels komplexer. Sie f\u00fcgen zus\u00e4tzliche Entscheidungen und Aktionen hinzu und konfigurieren dann die gesamte KI, indem Sie einfach die Textdatei mit der Baumdefinition bearbeiten. \u00dcbergeben Sie die Datei dann an den Spieldesigner, 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 Beispielsets erstellt werden (z. B. unter Verwendung des ID3-Algorithmus). Dadurch werden sie zu einem effizienten und leistungsstarken Werkzeug zur Klassifizierung von Situationen basierend auf erhaltenen Daten. Dennoch gehen wir \u00fcber ein einfaches System hinaus, das von Agenten zur Auswahl von Aktionen verwendet wird.<\/p>\n<h3>Szenarien<\/h3>\n<p>\nWir haben das System des Entscheidungsbaums behandelt, das zuvor definierte Bedingungen und Aktionen verwendete. Der Mensch, der die KI entwirft, kann den Baum so organisieren, wie er m\u00f6chte, muss jedoch weiterhin auf den Programmierer angewiesen sein, der alles programmiert hat. Was w\u00e4re, wenn wir dem Designer Werkzeuge an die Hand geben k\u00f6nnten, um seine eigenen 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 erstellen, in dem der Designer die Bedingungen zur \u00dcberpr\u00fcfung dieser Werte aufzeichnet. Dann k\u00f6nnte die Datenstruktur des Entscheidungsbaums folgenderma\u00dfen aussehen:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/8e77f7c3410d097e8b7d8e1209355cc6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIm Grunde genommen ist es dasselbe wie in der ersten Tabelle, aber die L\u00f6sungen haben ihren eigenen Code, der dem bedingten Teil eines if-Operators \u00e4hnelt. Im Code w\u00fcrde dies in der zweiten Spalte f\u00fcr Entscheidungsneigungen abgerufen werden, aber anstelle nach einer bestimmten Bedingung f\u00fcr die Ausf\u00fchrung (Ist der Ball links vom Paddle?) zu suchen, bewertet es den 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) \u00fcbernehmen und Variablen erstellen, die im Skript verf\u00fcgbar sind (ball.position). Dar\u00fcber hinaus ist die Skriptsprache einfacher als C++. Sie ben\u00f6tigt keinen vollst\u00e4ndigen Kompilierungsprozess, was sie ideal f\u00fcr schnelle Anpassungen der Spiel-Logik macht und es \u00abNicht-Entwicklern\u00bb erm\u00f6glicht, selbst die gew\u00fcnschten Funktionen zu erstellen.<\/p>\n<p>Im obigen Beispiel wird die Skriptsprache nur zur Bewertung des bedingten Ausdrucks verwendet, kann jedoch auch f\u00fcr Aktionen genutzt werden. Zum Beispiel k\u00f6nnten die Daten Move Paddle Right zu einer Skriptanweisung werden (ball.position.x += 10). So kann auch die Aktion im Skript definiert werden, ohne dass das Programmieren von Move Paddle Right notwendig ist.<\/p>\n<p>Man k\u00f6nnte noch weiter gehen und den Entscheidungsbaum vollst\u00e4ndig in der Skriptsprache schreiben. Das w\u00e4re Code in Form von fest programmierten (hardcoded) Bedingungsanweisungen, die jedoch in externen Skriptdateien gespeichert sind, d.h. sie k\u00f6nnen ge\u00e4ndert werden, ohne das gesamte Programm neu zu kompilieren. Oftmals kann die Skriptdatei w\u00e4hrend des Spiels ver\u00e4ndert werden, um verschiedene KI-Reaktionen schnell zu testen.<\/p>\n<h3>Reaktion auf Ereignisse<\/h3>\n<p>\nDie obigen Beispiele passen perfekt zu Pong. Sie durchlaufen kontinuierlich den Zyklus Sense\/Think\/Act und handeln basierend auf dem letzten Zustand der Welt. In komplexeren Spielen muss jedoch auf einzelne Ereignisse reagiert werden, nicht alles auf einmal bewertet werden. In diesem Fall ist Pong kein passendes Beispiel mehr. W\u00e4hlen wir ein anderes. <\/p>\n<p>Stellen Sie sich einen Shooter vor, bei dem die Feinde unbeweglich sind, bis sie den Spieler entdecken, woraufhin sie je nach ihrer \u00abSpezialisierung\u00bb handeln: Manche werden versuchen, direkt anzugreifen, andere werden aus der Distanz angreifen. Das ist immer noch ein grundlegendes Reaktionssystem \u2014 \u00abWenn der Spieler gesehen wird, dann tu etwas\u00bb \u2014 aber es kann logisch in das Ereignis Player Seen (Spieler gesehen) und die Reaktion (W\u00e4hlen Sie eine Antwort und f\u00fchren Sie sie aus) unterteilt werden.<\/p>\n<p>Das bringt uns zu dem 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 es sieht, wird das Ereignis 'Spieler gesehen' ausgel\u00f6st. Der Code hat einen separaten Abschnitt, in dem steht: \"Wenn das Ereignis 'Spieler gesehen' eintritt, mache \", wobei  die Aktion ist, die Sie ben\u00f6tigen, um auf die Teile Think und Act zuzugreifen. So stellen Sie die Reaktionen auf das Ereignis 'Spieler gesehen' ein: f\u00fcr einen 'rushing' Charakter - ChargeAndAttack, und f\u00fcr einen Sniper - HideAndSnipe. Diese Verbindungen k\u00f6nnen in einer Datendatei erstellt werden, um eine schnelle Bearbeitung zu erm\u00f6glichen, ohne das Programm neu zu kompilieren. Hier kann auch eine Skriptsprache verwendet werden.<\/p>\n<h2>Komplexe Entscheidungen treffen<\/h2>\n<p>\nObwohl einfache Reaktionssysteme sehr effektiv sind, gibt es viele Situationen, in denen sie nicht ausreichen. Manchmal m\u00fcssen unterschiedliche Entscheidungen getroffen werden, basierend darauf, was der Agent gerade tut, aber es ist schwierig, dies als Bedingung darzustellen. Manchmal gibt es zu viele Bedingungen, um sie effektiv in einem Entscheidungsbaum oder Skript darzustellen. Manchmal muss bewertet werden, wie sich die Situation \u00e4ndern k\u00f6nnte, bevor eine Entscheidung \u00fcber den n\u00e4chsten Schritt getroffen wird. F\u00fcr diese Probleme sind komplexere Ans\u00e4tze erforderlich.<\/p>\n<h3>Endlicher Automat<\/h3>\n<p>\nEin Finite State Machine (FSM) ist eine M\u00f6glichkeit zu sagen, dass unser Agent sich derzeit in einem von mehreren m\u00f6glichen Zust\u00e4nden befindet und dass er von einem Zustand in einen anderen \u00fcbergehen kann. Es gibt eine bestimmte Anzahl solcher Zust\u00e4nde - daher der Name. Ein gutes Beispiel aus dem Leben ist eine Ampel. An verschiedenen Orten gibt es unterschiedliche Lichtfolgen, aber das Prinzip ist dasselbe - jeder Zustand stellt etwas dar (Halt, Gehe usw.). Die Ampel befindet sich immer zu einem bestimmten Zeitpunkt in genau einem Zustand und wechselt basierend auf einfachen Regeln von einem zum anderen.<\/p>\n<p>Mit NPCs in Spielen sieht es \u00e4hnlich aus. Nehmen wir zum 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 f\u00fcr den Wechsel seines Zustands:<\/p>\n<ul>\n<li>Wenn der W\u00e4chter einen 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 dem Status des W\u00e4chters und verschiedene \u00dcberpr\u00fcfungen schreiben: Ist ein Feind in der N\u00e4he? Welches Gesundheitsniveau hat das NPC usw.? F\u00fcgen wir ein paar weitere Zust\u00e4nde hinzu:<\/p>\n<ul>\n<li>Inaktivit\u00e4t (Idling) \u2013 zwischen den Patrouillen.<\/li>\n<li>Suche (Searching) \u2013 wenn ein gesichteter Feind sich versteckt hat.<\/li>\n<li>Hilfe anfordern (Finding Help) \u2013 wenn ein Feind gesehen wird, aber zu stark ist, um alleine gegen ihn zu k\u00e4mpfen.<\/li>\n<\/ul>\n<p>\nDie Wahl f\u00fcr jeden von ihnen ist eingeschr\u00e4nkt \u2013 zum Beispiel wird der W\u00e4chter nicht nach einem versteckten Feind suchen, wenn er wenig Gesundheit hat.<\/p>\n<p>Letztlich kann eine riesige Liste von &bdquo;wenn&ldquo; &lt;x \u0438 y, \u043d\u043e \u043d\u0435 z&gt;, dann &lt;p&gt;zu umfangreich werden, daher sollten wir eine Methode formal definieren, die es uns erm&ouml;glicht, die Zust&auml;nde und die &Uuml;berg&auml;nge zwischen den Zust&auml;nden im Kopf zu behalten. Dazu ber&uuml;cksichtigen wir alle Zust&auml;nde und notieren unter jedem Zustand eine Liste aller &Uuml;berg&auml;nge zu anderen Zust&auml;nden, einschlie&szlig;lich der erforderlichen Bedingungen.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/ba4c401aa20de3d22d2478cba5a4b1ec.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDies ist eine Zustands\u00fcbergangstabelle \u2013 eine umfassende Methode zur Darstellung von FSM. Wir zeichnen ein Diagramm und erhalten einen vollst\u00e4ndigen \u00dcberblick dar\u00fcber, wie sich das Verhalten von NPCs ver\u00e4ndert.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/b4182359983cf573872dacc575af13dc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas Diagramm spiegelt das Wesen der Entscheidungsfindung f\u00fcr diesen Agenten basierend auf der aktuellen Situation wider. Jede Pfeil zeigt einen \u00dcbergang zwischen den Zust\u00e4nden, wenn die Bedingung daneben wahr ist.<\/p>\n<p>Bei jedem Update \u00fcberpr\u00fcfen wir den aktuellen Zustand des Agenten, durchsehen die Liste der \u00dcberg\u00e4nge, und wenn die Bedingungen f\u00fcr den \u00dcbergang erf\u00fcllt sind, nimmt er einen neuen Zustand an. Zum Beispiel wird bei jedem Frame \u00fcberpr\u00fcft, ob der 10-Sekunden-Timer abgelaufen ist, und wenn ja, wechselt der W\u00e4chter vom Zustand Idling in Patrolling. Ebenso \u00fcberpr\u00fcft der Zustand Attacking die Gesundheit des Agenten \u2013 wenn sie niedrig ist, wechselt er in den Zustand Fleeing.<\/p>\n<p>Das betrifft die Verarbeitung von \u00dcberg\u00e4ngen zwischen Zust\u00e4nden, aber was ist mit dem Verhalten, das mit den Zust\u00e4nden selbst verbunden ist? Wenn es um die Implementierung des tats\u00e4chlichen Verhaltens f\u00fcr einen bestimmten Zustand geht, 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 bei einem \u00dcbergang von einem Zustand in einen anderen unternehmen.<\/li>\n<\/ul>\n<p>\nBeispiele f\u00fcr den ersten Typ. Der Zustand Patrolling wird jeden Frame den Agenten entlang des Patrouillenwegs bewegen. Der Zustand Attacking wird jeden Frame versuchen, einen Angriff zu beginnen oder in einen Zustand \u00fcberzugehen, wenn dies m\u00f6glich ist.<\/p>\n<p>F\u00fcr den zweiten Typ betrachten wir den \u00dcbergang: \u201eWenn der Feind sichtbar ist und der Feind zu stark ist, dann wechsle in den Zustand Finding Help. Der Agent muss w\u00e4hlen, wo er Hilfe suchen m\u00f6chte, und diese Information speichern, damit der Zustand Finding Help wei\u00df, wohin er sich wenden kann. Sobald Hilfe gefunden ist, wechselt der Agent zur\u00fcck in den Zustand Attacking. In diesem Moment m\u00f6chte er seinen Verb\u00fcndeten \u00fcber die Bedrohung informieren, weshalb die Aktion NotifyFriendOfThreat auftreten kann.<\/p>\n<p>Und erneut k\u00f6nnen wir dieses System durch die Linse des Zyklus Sense \/ Think \/ Act betrachten. Sense wird in den Daten verk\u00f6rpert, die von der \u00dcbergangslogik verwendet werden. Think sind die \u00dcberg\u00e4nge, die in jedem Zustand verf\u00fcgbar sind. Und Act erfolgt durch die Aktionen, die periodisch innerhalb eines Zustands oder bei \u00dcberg\u00e4ngen zwischen Zust\u00e4nden ausgef\u00fchrt werden.<\/p>\n<p>Manchmal kann die kontinuierliche Abfrage von \u00dcbergangsbedingungen kostspielig sein. Wenn jeder Agent zum Beispiel in jedem Frame komplexe Berechnungen durchf\u00fchren muss, um zu bestimmen, ob er Feinde sieht und zu erkennen, ob er von Patrolling zu Attacking wechseln kann \u2013 das kostet viel Rechenzeit. <\/p>\n<p>Wichtige Ver\u00e4nderungen des Weltzustands k\u00f6nnen als Ereignisse betrachtet werden, die verarbeitet werden, sobald sie auftreten. Anstatt dass die FSM in jedem Frame die \u00dcbergangsbedingung \u201eKann mein Agent den Spieler sehen?\u201c pr\u00fcft, k\u00f6nnte man ein separates System einrichten, das die Pr\u00fcfungen seltener durchf\u00fchrt (zum Beispiel 5 Mal pro Sekunde). Das Ergebnis k\u00f6nnte Player Seen sein, wenn die Pr\u00fcfung bestanden wird. <\/p>\n<p>Dies wird an die FSM \u00fcbergeben, die jetzt in den Zustand Player Seen event received \u00fcbergehen und entsprechend reagieren muss. Das endg\u00fcltige Verhalten bleibt gleich, abgesehen von einer nahezu unmerklichen Verz\u00f6gerung bei der Antwort. Die Leistung hat sich jedoch verbessert, da ein Teil des Sense in einen separaten Teil des Programms ausgelagert wurde.<\/p>\n<h3>Hierarchische endliche Zustandsmaschine<\/h3>\n<p>\nEs ist jedoch nicht immer bequem, mit gro\u00dfen FSM zu arbeiten. 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, die in den Zustand Attacking f\u00fchren (aktuelle und zuk\u00fcnftige), \u00e4ndern.<\/p>\n<p>Sie haben sicherlich bemerkt, dass in unserem Beispiel viele redundante \u00dcberg\u00e4nge vorkommen. Die meisten \u00dcberg\u00e4nge im Zustand Idling sind identisch mit den \u00dcberg\u00e4ngen im Zustand Patrolling. Es w\u00e4re besser, nicht zu wiederholen, insbesondere wenn wir mehr \u00e4hnliche Zust\u00e4nde hinzuf\u00fcgen. Es macht Sinn, Idling und Patrolling unter einem gemeinsamen Etikett \u201enicht k\u00e4mpferisch\u201c zu gruppieren, wobei es nur einen gemeinsamen Satz von \u00dcberg\u00e4ngen zu k\u00e4mpferischen Zust\u00e4nden gibt. Wenn wir dieses Etikett 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\u00e4mpferischen Unterzustand:<\/p>\n<p><i>Hauptzust\u00e4nde:<\/i><br \/>\n<img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/d86dd918acbe81b9bf22c2fb34aecee3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<i>Zustand au\u00dfer Gefecht:<\/i><br \/>\n<img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" 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 eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/0ccf95ecafa9ce2a6ea5b5b9833ddc4f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEs ist dasselbe System, aber mit einem neuen nicht k\u00e4mpferischen Zustand, der Idling und Patrolling umfasst. Mit jedem Zustand, der eine FSM mit Unterzust\u00e4nden enth\u00e4lt (und diese Unterzust\u00e4nde ihrerseits eigene FSMs haben \u2013 so viele, wie Sie ben\u00f6tigen), erhalten wir eine Hierarchical Finite State Machine oder HFSM (hierarchische endliche Zustandsmaschine). Durch die Gruppierung des nicht k\u00e4mpferischen Zustands haben wir eine Menge \u00fcberfl\u00fcssiger \u00dcberg\u00e4nge eliminiert. Dasselbe k\u00f6nnen wir f\u00fcr zuk\u00fcnftige Zust\u00e4nde mit gemeinsamen \u00dcberg\u00e4ngen tun. Wenn wir beispielsweise den Zustand Attacking in die Zust\u00e4nde MeleeAttacking und MissileAttacking erweitern, werden sie zu Unterzust\u00e4nden, die auf der Grundlage der Entfernung zum Feind und der Verf\u00fcgbarkeit von Munition zwischen einander wechseln. Dadurch k\u00f6nnen komplexe Verhaltensmodelle und Unterverhaltensmodelle mit minimalen redundanten \u00dcberg\u00e4ngen dargestellt werden.<\/p>\n<h3>Verhaltenbaum<\/h3>\n<p>\nMit HFSM werden komplexe Verhaltenskombinationen auf einfache Weise erstellt. Es gibt jedoch eine kleine Schwierigkeit, da die Entscheidungsfindung in Form von \u00dcbergangsregeln eng mit dem aktuellen Zustand verbunden ist. In vielen Spielen ist das genau das, was ben\u00f6tigt wird. Eine sorgf\u00e4ltige Nutzung der Zustandshierarchie kann jedoch die Anzahl der Wiederholungen bei \u00dcberg\u00e4ngen verringern. Manchmal sind jedoch Regeln erforderlich, die unabh\u00e4ngig vom aktuellen Zustand funktionieren oder die in fast allen Zust\u00e4nden angewendet werden. Wenn beispielsweise die Gesundheit des Agenten auf 25 % gefallen ist, m\u00f6chten Sie, dass er unabh\u00e4ngig davon, ob er im Kampf war, unt\u00e4tig war oder sprach, wegl\u00e4uft \u2013 Sie m\u00fcssen 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, m\u00fcssen Sie sich wieder damit besch\u00e4ftigen.<\/p>\n<p>Idealerweise ben\u00f6tigt man f\u00fcr diese Situation ein System, in dem Entscheidungen dar\u00fcber, \"in welchem Zustand man sich befinden soll\", au\u00dferhalb der eigentlichen Zust\u00e4nde liegen, sodass \u00c4nderungen nur an einem Ort vorgenommen werden und die \u00dcbergangsbedingungen nicht ber\u00fchrt werden. Hier kommen Verhaltensb\u00e4ume ins Spiel.<\/p>\n<p>Es gibt mehrere M\u00f6glichkeiten zu implementieren, aber der Kern ist f\u00fcr alle ungef\u00e4hr gleich und \u00e4hnelt einem Entscheidungsbaum: Der Algorithmus beginnt mit einem \"Wurzel\"-Knoten, und im Baum befinden sich Knoten, die entweder Entscheidungen oder Aktionen repr\u00e4sentieren. Es gibt jedoch einige wichtige Unterschiede:<\/p>\n<ul>\n<li>Jetzt geben die Knoten eines von drei Werten zur\u00fcck: Succeeded (wenn die Aufgabe erf\u00fcllt wurde), Failed (wenn sie nicht gestartet werden kann) oder Running (wenn sie noch l\u00e4uft und kein endg\u00fcltiges Ergebnis vorliegt).<\/li>\n<li>Es gibt keine Entscheidungsknoten mehr, um zwischen zwei Alternativen zu w\u00e4hlen. Stattdessen gibt es Decorator-Knoten mit einem einzigen Kindknoten. Wenn sie Succeed, f\u00fchren sie ihren einzigen Kindknoten aus.<\/li>\n<li>Knoten, die Aktionen ausf\u00fchren, geben den Wert Running zur\u00fcck, um die laufenden Aktionen darzustellen.<\/li>\n<\/ul>\n<p>\nDieser kleine Satz von Knoten kann kombiniert werden, um eine gro\u00dfe Anzahl komplexer Verhaltensmodelle zu erstellen. Stellen wir uns das HFSM eines W\u00e4chters aus dem vorherigen Beispiel in Form eines Verhaltensbaums vor:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/5eaa5c725e4ada8285f16f95bb206d53.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMit dieser Struktur sollte es keinen expliziten \u00dcbergang von den Zust\u00e4nden Idling\/Patrolling zum Zustand Attacking oder zu anderen geben. Wenn der Feind sichtbar ist und die Gesundheit des Charakters niedrig, wird die Ausf\u00fchrung am Knoten Fleeing angehalten, unabh\u00e4ngig davon, welchen Knoten er zuvor ausgef\u00fchrt hat \u2013 Patrolling, Idling, Attacking oder einen anderen.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/e1c1dcc2055174aa7cfa846364b1709a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVerhaltensb\u00e4ume sind komplex \u2013 es gibt viele M\u00f6glichkeiten, sie zu erstellen, und das richtige Zusammenspiel von Dekoratoren und zusammengesetzten Knoten zu finden, kann problematisch sein. Es gibt auch Fragen dazu, wie oft der Baum \u00fcberpr\u00fcft werden sollte \u2013 wollen wir ihn bei jedem Teil durchlaufen oder nur, wenn sich eine der Bedingungen \u00e4ndert? Wie speichert man den Zustand, der sich auf die Knoten bezieht \u2013 wie wissen wir, wann wir 10 Sekunden im Zustand Idling waren oder wie wissen wir, welche Knoten zuletzt ausgef\u00fchrt wurden, um die Sequenz korrekt zu verarbeiten?<\/p>\n<p>Deshalb gibt es zahlreiche Implementierungen. In einigen Systemen wurden die Decorator-Knoten durch eingebaute Dekoratoren ersetzt. Diese evaluieren den Baum erneut, wenn sich die Bedingungen des Dekorators \u00e4ndern, helfen beim Anh\u00e4ngen an Knoten und bieten zeitliche Aktualisierungen.<\/p>\n<h3>Utility-basiertes System<\/h3>\n<p>\nEinige Spiele verf\u00fcgen \u00fcber zahlreiche verschiedene Mechaniken. Es ist w\u00fcnschenswert, dass sie alle Vorteile einfacher und allgemeiner \u00dcbergangsregeln erhalten, es ist jedoch nicht unbedingt notwendig, diese in Form eines vollst\u00e4ndigen Verhaltensbaums darzustellen. Anstatt eine klare Auswahl oder einen Baum m\u00f6glicher Aktionen zu haben, ist es einfacher, alle Aktionen zu studieren und die am besten geeignete f\u00fcr den aktuellen Moment auszuw\u00e4hlen.<\/p>\n<p>Ein utilitaristisches System hilft dabei genau. Es handelt sich um ein System, in dem der Agent viele Handlungen hat und selbst ausw\u00e4hlt, welche er basierend auf der relativen N\u00fctzlichkeit jedes einzelnen ausf\u00fchren m\u00f6chte. Wo N\u00fctzlichkeit eine willk\u00fcrliche Ma\u00dfzahl daf\u00fcr ist, wie wichtig oder w\u00fcnschenswert es f\u00fcr den Agenten ist, diese Aktion auszuf\u00fchren. <\/p>\n<p>Basierend auf dem aktuellen Zustand und der Umgebung kann der Agent die gesch\u00e4tzte N\u00fctzlichkeit einer Aktion \u00fcberpr\u00fcfen und jederzeit den am besten passenden anderen Zustand w\u00e4hlen. Dies \u00e4hnelt einem FSM, mit dem Unterschied, dass die \u00dcberg\u00e4nge durch Bewertungen f\u00fcr jeden potenziellen Zustand, 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). Um mehr Vielfalt zu bieten, kann dies eine gewichtete, aber zuf\u00e4llige Auswahl aus einer kleinen Liste sein.<\/p>\n<p>Das System ordnet willk\u00fcrlich einen Wertebereich f\u00fcr die N\u00fctzlichkeit zu \u2013 zum Beispiel von 0 (v\u00f6llig unerw\u00fcnscht) bis 100 (vollst\u00e4ndig erw\u00fcnscht). Jedes Handeln hat eine Reihe von Parametern, die sich auf die Berechnung dieses Wertes auswirken. Wenn wir zu unserem Beispiel mit dem Wachmann zur\u00fcckkehren:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/085fb2c197bde93d78455d18e63c9c25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u00dcberg\u00e4nge zwischen Aktionen sind mehrdeutig \u2013 jeder Zustand kann auf einen beliebigen anderen folgen. Die Priorit\u00e4ten der Handlungen basieren auf den zur\u00fcckgegebenen N\u00fctzlichkeitswerten. Wenn der Feind sichtbar ist und dieser Feind stark ist, w\u00e4hrend die Gesundheit des Charakters niedrig ist, werden sowohl Fleeing als auch FindingHelp hohe, von Null verschiedene Werte zur\u00fcckgeben. Dabei wird FindingHelp immer h\u00f6her bewertet. \u00c4hnlich werden nicht-k\u00e4mpferische Aktionen niemals mehr als 50 zur\u00fcckgeben, weshalb sie immer unter den k\u00e4mpferischen liegen. Dies muss bei der Erstellung von Handlungen und der Berechnung ihrer N\u00fctzlichkeit ber\u00fccksichtigt werden.<\/p>\n<p>In unserem Beispiel geben die Aktionen entweder einen festen konstanten Wert oder einen von zwei festen Werten zur\u00fcck. Ein realistischeres System w\u00fcrde die R\u00fcckgabe einer Bewertung aus einem kontinuierlichen Wertebereich vorsehen. Zum Beispiel liefert die Aktion Fliehen h\u00f6here Nutzwerte, wenn die Gesundheit des Agenten niedrig ist, w\u00e4hrend die Aktion Angreifen niedrigere Werte zur\u00fcckgibt, wenn der Feind zu stark ist. Aus diesem Grund hat die Aktion Fliehen Vorrang vor Angreifen in jeder Situation, in der der Agent das Gef\u00fchl hat, nicht gen\u00fcgend Gesundheit zu haben, um den Gegner zu besiegen. Dies erlaubt es, die Priorit\u00e4ten der Aktionen basierend auf einer beliebigen Anzahl von Kriterien zu \u00e4ndern, was diesen Ansatz flexibler und variabler macht als ein Verhaltensbaum oder FSM.<\/p>\n<p>Jede Aktion hat viele Bedingungen zur Berechnung des Programms. Diese k\u00f6nnen in einer Skriptsprache oder in Form einer Reihe von mathematischen Formeln geschrieben werden. In Die Sims, das den Tagesablauf eines Charakters modelliert, wird eine zus\u00e4tzliche Ebene der Berechnungen hinzugef\u00fcgt \u2013 der Agent erh\u00e4lt eine Reihe von \u201eMotivationen\u201c, die die Nutzwertbewertungen beeinflussen. Wenn der Charakter hungrig ist, wird er im Laufe der Zeit noch hungriger, und das Ergebnis der Nutzwertbewertung der Aktion Essen wird steigen, bis der Charakter diese ausf\u00fchrt, wodurch der Hunger gesenkt wird und der Wert f\u00fcr Essen auf null zur\u00fcckkehrt. <\/p>\n<p>Die Idee, Handlungen auf der Grundlage eines Bewertungssystems auszuw\u00e4hlen, ist ziemlich einfach, daher kann das nutzwertbasierte System als Teil der Entscheidungsprozesse der KI verwendet werden, anstatt sie vollst\u00e4ndig zu ersetzen. Ein Entscheidungsbaum kann den Nutzwert von zwei Kindknoten abfragen und den h\u00f6heren ausw\u00e4hlen. In \u00e4hnlicher Weise kann ein Verhaltensbaum einen zusammengesetzten Knoten f\u00fcr die Bewertung der Nutzwerte von Handlungen haben, um zu entscheiden, welches untergeordnete Element 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 bewegt haben, und einen W\u00e4chter, der patrouillierte oder angriff. Aber wie genau behandeln wir die Bewegung des Agenten \u00fcber einen bestimmten Zeitraum? Wie legen wir die Geschwindigkeit fest, wie vermeiden wir Hindernisse und wie planen wir eine Route, wenn es schwieriger ist, das Ziel zu erreichen, als einfach geradeaus zu gehen? Lassen Sie uns das betrachten.<\/p>\n<h3>Verwaltung<\/h3>\n<p>\nIn der Anfangsphase gehen wir davon aus, dass jeder Agent einen Geschwindigkeitswert hat, der beinhaltet, wie schnell er sich bewegt und in welche Richtung. Dies kann in Metern pro Sekunde, Kilometern pro Stunde, Pixel pro Sekunde usw. gemessen werden. Wenn wir uns an den Zyklus Sense\/Think\/Act erinnern, 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 den Geschwindigkeitswert jedes Objekts ber\u00fccksichtigt und anpasst. Daher kann die KI mit der Aufgabe betraut werden, zu entscheiden, welche Geschwindigkeit der Agent haben sollte. Wenn bekannt ist, wo sich der Agent befinden soll, kann er in die richtige Richtung mit einer festgelegten Geschwindigkeit bewegt werden. Eine sehr triviale Gleichung:<\/p>\n<p><i>desired_travel = ziel_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 nord\u00f6stlich an Punkt (30, 20), und der notwendige Weg f\u00fcr den Agenten, um dort zu sein, ist (32, 22). Angenommen, diese Positionen werden in Metern gemessen \u2013 wenn wir die Geschwindigkeit des Agenten auf 5 Meter pro Sekunde ansetzen, dann skalieren wir unseren Bewegungsvektor und erhalten eine Geschwindigkeit von etwa (4,12, 2,83). Mit diesen Parametern w\u00fcrde der Agent sein Ziel in fast 8 Sekunden erreichen.<\/p>\n<p>Die Werte k\u00f6nnen jederzeit neu berechnet werden. Wenn der Agent auf halbem Weg zum Ziel war, w\u00e4re die Bewegung die H\u00e4lfte der L\u00e4nge, aber da die maximale Geschwindigkeit des Agenten 5 m\/s betr\u00e4gt (das haben wir oben festgelegt), bleibt die Geschwindigkeit gleich. Das funktioniert auch f\u00fcr sich bewegende Ziele, sodass der Agent kleine Anpassungen vornehmen kann, w\u00e4hrend diese sich bewegen.<\/p>\n<p>Aber wir m\u00f6chten mehr Variabilit\u00e4t \u2013 zum Beispiel die Geschwindigkeit langsam erh\u00f6hen, um einen Charakter zu simulieren, der sich aus einer stehenden Position in einen Lauf bewegt. Das Gleiche kann auch am Ende vor dem Anhalten gemacht werden. Diese Funktionen sind bekannt als Steering Behaviours, von denen jede spezifische Namen hat: Seek (Suchen), Flee (Fliehen), Arrival (Ankunft) usw. Die Idee 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 Ziel, um verschiedene Methoden zur Bewegung in Richtung des Ziels zu nutzen.<\/p>\n<p>Jedes Verhalten hat ein etwas anderes Ziel. Seek und Arrival sind Methoden, um den Agenten zu einem Zielpunkt zu bewegen. Obstacle Avoidance (Hindernisvermeidung) und Separation (Trennung) korrigieren die Bewegung des Agenten, um Hindernisse auf dem Weg zum Ziel zu umgehen. Alignment (Ausrichtung) und Cohesion (Zusammenhalt) halten die Agenten w\u00e4hrend der Bewegung zusammen. Eine beliebige Anzahl verschiedener Steering Behaviours kann summiert werden, um einen einzigen Bewegungsvektor unter Ber\u00fccksichtigung aller Faktoren zu erhalten. Ein Agent verwendet die Verhaltensweisen Arrival, Separation und Obstacle Avoidance, um Abstand zu W\u00e4nden und anderen Agenten zu halten. Dieser Ansatz funktioniert gut in offenen Locations ohne \u00fcberfl\u00fcssige Details. <\/p>\n<p>In schwierigeren Bedingungen funktioniert das Addieren verschiedener Verhaltensweisen schlechter \u2013 zum Beispiel kann ein Agent an einer Wand stecken bleiben aufgrund eines Konflikts zwischen Arrival und Obstacle Avoidance. Daher m\u00fcssen komplexere Optionen als nur das Addieren aller Werte in Betracht gezogen werden. Eine M\u00f6glichkeit ist, anstatt die Ergebnisse jedes Verhaltens zu addieren, die Bewegung in verschiedene Richtungen zu betrachten und die beste Option auszuw\u00e4hlen. <\/p>\n<p>In einer komplexen Umgebung mit Sackgassen und Entscheidungen \u00fcber die Richtung, in die man gehen soll, ben\u00f6tigen wir jedoch etwas noch Fortgeschrittenes.<\/p>\n<h3>Wegsuche<\/h3>\n<p>\nSteering Behaviours eignen sich hervorragend f\u00fcr einfache Bewegungen in offenem Gel\u00e4nde (Fu\u00dfballfeld oder Arena), wo es von A nach B in gerader Linie mit geringf\u00fcgigen Abweichungen um Hindernisse geht. F\u00fcr komplexe Routen ben\u00f6tigen wir Pathfinding, das eine Methode ist, die Welt zu erkunden und eine Route durch sie zu bestimmen.<\/p>\n<p>Die einfachste Methode besteht darin, ein Raster \u00fcber jedes Quadrat neben dem Agenten zu legen und zu bewerten, in welchen er sich bewegen darf. Wenn eines davon das Ziel ist, folgen Sie ihm, indem Sie von jedem Quadrat zu dem vorhergehenden zur\u00fcckverfolgen, bis Sie den Anfang erreichen. Das ist der Weg. Andernfalls wiederholen Sie den Vorgang mit den n\u00e4chstgelegenen anderen Quadraten, bis Sie das Ziel finden oder alle Quadrate aufgebraucht sind (was bedeutet, dass kein m\u00f6glicher Weg besteht). Dies wird formal als Breadth-First Search oder BFS (Breitensuche) bezeichnet. Bei jedem Schritt schaut es in alle Richtungen (deshalb<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/d367e62bc53033b05388538649853a41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn der Folge erhalten Sie eine Liste von Quadraten, aus denen die ben\u00f6tigte Route besteht. Das ist der Pfad (von hier, pathfinding) - eine Liste der Orte, die der Agent besuchen wird, um zum Ziel zu gelangen.<\/p>\n<p>Angesichts dessen, dass wir die Position jedes Quadrats in der Welt kennen, k\u00f6nnen wir Steering-Bewegungen verwenden, um dem Pfad zu folgen - von Knoten 1 zu Knoten 2, dann von Knoten 2 zu Knoten 3 und so weiter. Die einfachste Variante besteht darin, zum Zentrum des n\u00e4chsten Quadrats zu steuern, aber noch besser w\u00e4re es, an der Mitte der Kante zwischen dem aktuellen Quadrat und dem n\u00e4chsten zu halten. Dadurch kann der Agent an scharfen Kurven die Ecken schneiden.<\/p>\n<p>Der BFS-Algorithmus hat auch Nachteile - er untersucht genauso viele Quadrate in die \"falsche\" Richtung wie in die \"richtige\". Hier kommt ein komplexerer Algorithmus namens A* (A Stern) ins Spiel. Er funktioniert \u00e4hnlich, aber anstatt blind die benachbarten Quadrate zu durchsuchen (dann die Nachbarn der Nachbarn, dann die Nachbarn der Nachbarn der Nachbarn und so weiter), sammelt er die Knoten in einer Liste und sortiert sie so, dass der n\u00e4chste untersuchte Knoten immer der ist, der den k\u00fcrzesten Weg f\u00fchrt. Die Knoten werden basierend auf einer Heuristik sortiert, die zwei Dinge ber\u00fccksichtigt: die \u201eKosten\u201c des hypothetischen Pfades zum gew\u00fcnschten Quadrat (einschlie\u00dflich aller Bewegungs- und Reisekosten) 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 eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" 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 und dabei immer das am vielversprechendsten erscheinende Nachbarquadrat ausw\u00e4hlt. Der resultierende Pfad ist derselbe wie bei BFS, aber es wurden weniger Quadrate betrachtet \u2013 was f\u00fcr die Leistung des Spiels von gro\u00dfer Bedeutung ist.<\/p>\n<h3>Bewegung ohne Raster<\/h3>\n<p>\nAber die meisten Spiele sind nicht im Raster angeordnet, und oft ist es nicht m\u00f6glich, dies ohne Einbu\u00dfen an der Realit\u00e4tsn\u00e4he zu tun. Es sind Kompromisse erforderlich. Wie gro\u00df sollten die Quadrate sein? Zu gro\u00df \u2013 und sie k\u00f6nnen enge Korridore oder Kurven nicht richtig darstellen, zu klein \u2013 es gibt zu viele Quadrate, die durchsucht werden m\u00fcssen, was viel Zeit in Anspruch nehmen kann.<\/p>\n<p>Das erste, was man verstehen sollte, ist, dass ein Raster uns einen Graphen verbundener Knoten liefert. Die Algorithmen A* und BFS arbeiten tats\u00e4chlich mit Graphen und k\u00fcmmern sich \u00fcberhaupt nicht um unser Raster. Wir k\u00f6nnten Knoten an beliebigen Stellen der Spielwelt setzen: Solange eine Verbindung zwischen zwei verbundenen Knoten und auch zwischen dem Start- und dem Endpunkt sowie mindestens einem der Knoten besteht, funktioniert der Algorithmus genauso gut wie zuvor. Oft wird dies als Wegpunkt-System bezeichnet, da jeder Knoten eine signifikante Position in der Welt darstellt, die Teil beliebig vieler hypothetischer Wege sein kann.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" 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 aus dem Knoten, in dem sich der Agent befindet, und endet im Knoten des gew\u00fcnschten Quadrats.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/b535a5db805efdc427d7c5724b866982.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Beispiel 2: Ein kleinerer Satz von Knoten (Wegpunkten). Die Suche beginnt im Quadrat mit dem Agenten, verl\u00e4uft \u00fcber die erforderliche Anzahl von Knoten und setzt sich dann bis zum Ziel fort.<\/i><\/p>\n<p>Dies ist ein recht flexibles und leistungsf\u00e4higes System. Aber es ist Vorsicht geboten, wo und wie Wegpunkte platziert werden, sonst sehen die Agenten m\u00f6glicherweise einfach den n\u00e4chstgelegenen Punkt nicht und k\u00f6nnen 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 Navigation Mesh oder Navmesh ins Spiel. Dies ist normalerweise ein 2D-Netzwerk von Dreiecken, das auf die Geometrie der Welt gelegt wird \u2013 \u00fcberall dort, wo es dem Agenten erlaubt ist zu gehen. Jedes der Dreiecke im Netz wird zu einem Knoten im Graphen und hat bis zu drei benachbarte Dreiecke, die zu benachbarten Knoten im Graphen werden. <\/p>\n<p>Dieses Bild ist ein Beispiel aus der Unity-Engine \u2013 es hat die Geometrie der Welt analysiert und ein Navmesh erstellt (auf dem Screenshot in hellblau dargestellt). Jedes Polygon im Navmesh ist ein Bereich, auf dem ein Agent stehen oder von einem Polygon zum anderen bewegen kann. In diesem Beispiel sind die Polygone kleiner als die Etagen, auf denen sie sich befinden \u2013 dies wurde gemacht, um die Gr\u00f6\u00dfe des Agents zu ber\u00fccksichtigen, der \u00fcber seine nominelle Position hinausgehen kann.<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/845705ba7b9a9d469203aedf7942da41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir k\u00f6nnen den Weg durch dieses Netz suchen, indem wir erneut den A*-Algorithmus verwenden. Dies wird uns einen nahezu perfekten Weg in der Welt bieten, der die gesamte Geometrie ber\u00fccksichtigt und dabei keine \u00fcberfl\u00fcssigen Knoten und Wegpunkte ben\u00f6tigt.<\/p>\n<p>Pathfinding ist ein zu umfangreiches Thema, um nur einen Abschnitt eines Artikels dar\u00fcber zu haben. Wenn Sie es detaillierter studieren m\u00f6chten, finden Sie Hilfe auf der <noindex><a rel=\"nofollow\" href=\"https:\/\/www.redblobgames.com\/pathfinding\/a-star\/introduction.html\">Webseite von Amit Patel<\/a><\/noindex>.<\/p>\n<h2>Planung<\/h2>\n<p>\nWir haben bei Pathfinding festgestellt, dass es manchmal nicht ausreicht, einfach eine Richtung zu w\u00e4hlen und zu gehen \u2013 wir m\u00fcssen einen Weg w\u00e4hlen und mehrere Abzweigungen machen, um das gew\u00fcnschte Ziel zu erreichen. Wir k\u00f6nnen diese Idee zusammenfassen: Das Erreichen eines Ziels ist nicht nur der n\u00e4chste Schritt, sondern eine ganze Abfolge, bei der es manchmal erforderlich ist, einige Schritte vorausschauen, um herauszufinden, wie der erste Schritt aussehen sollte. Dies wird als Planung bezeichnet. Pathfinding kann als eine von mehreren Erg\u00e4nzungen zur Planung angesehen werden. Aus der Sicht unseres Sense\/Think\/Act-Zyklus ist es der Teil, in dem das Denken mehrere Teile des Handelns f\u00fcr die Zukunft plant.<\/p>\n<p>Nehmen wir als Beispiel das Kartenspiel Magic: The Gathering. Wir ziehen zuerst mit diesem Kartensatz auf der Hand:<\/p>\n<ul>\n<li>Sumpf \u2013 gibt 1 schwarze Mana (Landkarte).<\/li>\n<li>Wald \u2013 gibt 1 gr\u00fcne Mana (Landkarte).<\/li>\n<li>Fl\u00fcchtiger Zauberer \u2013 ben\u00f6tigt 1 blaue Mana zum Beschw\u00f6ren.<\/li>\n<li>Elfen-Mystiker \u2013 ben\u00f6tigt 1 gr\u00fcne Mana zum Beschw\u00f6ren.<\/li>\n<\/ul>\n<p>\nDie verbleibenden drei Karten ignorieren wir, um es einfacher zu machen. Nach den Regeln darf der Spieler 1 Landkarte pro Zug spielen, er kann diese Karte \u201etap\u201c (um Mana daraus zu ziehen), und anschlie\u00dfend die Zauber (einschlie\u00dflich der Beschw\u00f6rung von Kreaturen) entsprechend der verf\u00fcgbaren Mana verwenden. In dieser Situation wei\u00df der menschliche Spieler, dass er den Wald spielen, 1 gr\u00fcne Mana \u201etap\u201c und dann den Elfen-Mystiker beschw\u00f6ren muss. Aber wie kann der Spiel-IA das herausfinden?<\/p>\n<h3>Einfache Planung<\/h3>\n<p>\nDer triviale Ansatz besteht darin, jede Handlung der Reihe nach auszuprobieren, bis keine passenden mehr \u00fcbrig sind. Der KI sieht anhand der Karten, dass sie Swamp spielen kann. Und sie spielt es. Gibt es noch andere Handlungen in diesem Zug? Sie kann weder Elvish Mystic noch Fugitive Wizard beschw\u00f6ren, da f\u00fcr deren Beschw\u00f6rung jeweils gr\u00fcne und blaue Mana erforderlich sind, w\u00e4hrend Swamp nur schwarze Mana erzeugt. Und sie kann bereits keinen Forest mehr spielen, weil sie Swamp bereits gespielt hat. So hat die spielende KI gem\u00e4\u00df den Regeln gehandelt, aber schlecht. Dieses Vorgehen kann verbessert werden.<\/p>\n<p>Die Planung kann eine Liste von Handlungen finden, die das Spiel in den gew\u00fcnschten Zustand versetzen. So wie jede Quadrate auf dem Weg Nachbarn hatte (im Pathfinding), hat jede Handlung im Plan ebenfalls Nachbarn oder Nachfolger. Wir k\u00f6nnen diese Handlungen und die n\u00e4chsten Handlungen suchen, bis wir den gew\u00fcnschten Zustand erreichen.<\/p>\n<p>In unserem Beispiel ist das gew\u00fcnschte Ergebnis \u201eein Wesen beschw\u00f6ren, wenn dies m\u00f6glich ist\u201c. Zu Beginn des Zugs sehen wir nur zwei m\u00f6gliche Handlungen, die den Regeln des Spiels entsprechen:<\/p>\n<p><i>1. Swamp spielen (Ergebnis: Swamp im Spiel)<br \/>\n2. Forest spielen (Ergebnis: Forest im Spiel)<\/i><\/p>\n<p>Jede ausgef\u00fchrte Handlung kann zu weiteren Handlungen f\u00fchren und andere schlie\u00dfen, wiederum abh\u00e4ngig von den Regeln des Spiels. Stellen Sie sich vor, wir haben Swamp gespielt \u2013 dies entfernt Swamp als n\u00e4chsten Schritt (wir haben es bereits gespielt), au\u00dferdem entfernt es Forest (da gem\u00e4\u00df den Regeln in einem Zug nur eine L\u00e4nderkarte gespielt werden kann). Danach f\u00fcgt die KI als n\u00e4chsten Schritt das Erhalten von 1 schwarzer Mana hinzu, da es keine anderen Optionen gibt. Wenn sie weitermachen und Swamp tappen w\u00e4hlt, erh\u00e4lt sie 1 Einheit schwarze Mana und kann damit nichts tun.<\/p>\n<p><i>1. Swamp spielen (Ergebnis: Swamp im Spiel)<br \/>\n 1.1 Swamp \u201etappt\u201c (Ergebnis: Swamp \u201egetappt\u201c, +1 Einheit schwarze Mana)<br \/>\n Keine verf\u00fcgbaren Handlungen \u2013 ENDE<br \/>\n2. Forest spielen (Ergebnis: Forest im Spiel)<\/i><\/p>\n<p>Die Liste der Handlungen ist kurz geworden, wir sind an einem toten Punkt angekommen. Wir wiederholen den Prozess f\u00fcr die n\u00e4chste Handlung. Wir spielen Forest, \u00f6ffnen die Handlung \u201e1 gr\u00fcne Mana erhalten\u201c, die ihrerseits die dritte Handlung \u2013 das Beschw\u00f6ren von Elvish Mystic \u2013 er\u00f6ffnet.<\/p>\n<p><i>1. Swamp spielen (Ergebnis: Swamp im Spiel)<br \/>\n 1.1 Swamp \u201etappt\u201c (Ergebnis: Swamp \u201egetappt\u201c, +1 Einheit schwarze Mana)<br \/>\n Keine verf\u00fcgbaren Handlungen \u2013 ENDE<br \/>\n2. Forest spielen (Ergebnis: Forest im Spiel)<br \/>\n 2.1 Forest \u201etappt\u201c (Ergebnis: Forest \u201egetappt\u201c, +1 Einheit gr\u00fcne Mana)<br \/>\n 2.1.1 Elvish Mystic beschw\u00f6ren (Ergebnis: Elvish Mystic im Spiel, -1 Einheit gr\u00fcne Mana)<br \/>\n Keine verf\u00fcgbaren Handlungen \u2013 ENDE<\/i><\/p>\n<p>Schlie\u00dflich haben wir alle m\u00f6glichen Handlungen untersucht und einen Plan gefunden, der ein Wesen beschw\u00f6rt.<\/p>\n<p>Dies ist ein sehr vereinfachtes Beispiel. Es ist ratsam, den bestm\u00f6glichen Plan zu w\u00e4hlen und nicht einfach irgendetwas, das bestimmten Kriterien entspricht. Oft kann man potenzielle Pl\u00e4ne anhand des Endergebnisses oder des Gesamtnutzens ihrer Ausf\u00fchrung bewerten. Man kann sich 1 Punkt f\u00fcr das Spielen einer Landkarte und 3 Punkte f\u00fcr das Beschw\u00f6ren eines Wesens gutschreiben. Das Spielen von Swamp w\u00e4re ein Plan, der 1 Punkt einbringt. Und das Spielen von Forest \u2192 Tap the Forest \u2192 beschw\u00f6ren von Elvish Mystic \u2013 bringt sofort 4 Punkte. <\/p>\n<p>So funktioniert das Planen in Magic: The Gathering, aber dasselbe Prinzip l\u00e4sst sich auch auf andere Situationen anwenden. Zum Beispiel, einen Bauern zu bewegen, um Platz f\u00fcr den Zug eines L\u00e4ufers im Schach zu schaffen. Oder sich hinter einer Wand zu verstecken, um in XCOM sicher zu schie\u00dfen. Im Grunde versteht ihr das Wesentliche.<\/p>\n<h3>Verbessertes Planen<\/h3>\n<p>\nManchmal gibt es zu viele potenzielle Aktionen, um jede m\u00f6gliche Option zu betrachten. Zur\u00fcck zum Beispiel mit Magic: The Gathering: Angenommen, im Spiel hast du mehrere Landkarten und Kreaturen auf der Hand \u2013 die Anzahl m\u00f6glicher Spielkombinationen kann in die Dutzende gehen. Es gibt mehrere L\u00f6sungsans\u00e4tze f\u00fcr dieses Problem.<\/p>\n<p>Der erste Ansatz ist das Backwards Chaining (R\u00fcckw\u00e4rtsverkn\u00fcpfung). Anstatt alle Kombinationen durchzugehen, ist es besser, mit dem Endergebnis zu beginnen und zu versuchen, einen direkten Pfad zu finden. Anstatt den Weg von der Wurzel eines Baumes zu einem bestimmten Blatt zu verfolgen, bewegen wir uns in umgekehrter Richtung \u2013 vom Blatt zur Wurzel. Diese Methode ist einfacher und schneller.<\/p>\n<p>Wenn der Gegner 1 Lebenspunkt hat, kann man einen Plan finden, um \u201e1 oder mehr Schadenspunkte zuzuf\u00fcgen\u201c. Um dies zu erreichen, m\u00fcssen einige Bedingungen erf\u00fcllt sein: <\/p>\n<p>1. Der Schaden kann durch einen Zauberspruch verursacht werden \u2013 dieser muss auf der Hand sein.<br \/>\n2. Um einen Zauberspruch zu wirken \u2013 braucht man Mana.<br \/>\n3. Um Mana zu erhalten \u2013 muss man eine Landkarte ausspielen.<br \/>\n4. Um eine Landkarte auszuspielen \u2013 muss man sie auf der Hand haben.<\/p>\n<p>Eine andere Methode ist der Best-First Search (Besten-Erstsuche). Anstatt alle Wege zu durchforsten, w\u00e4hlen wir den vielversprechendsten aus. Diese Methode liefert in der Regel den optimalen Plan ohne unn\u00f6tige Suchkosten. A* ist eine Form des Besten-Erstsuchens \u2013 indem er vielversprechende Routen von Anfang an erforscht, kann er den besten Weg finden, ohne andere Optionen \u00fcberpr\u00fcfen zu m\u00fcssen.<\/p>\n<p>Eine interessante und zunehmend beliebte Variante der besten ersten Suche ist die Monte Carlo Tree Search. Anstatt zu erraten, welche Pl\u00e4ne besser sind als andere, w\u00e4hlt der Algorithmus bei jedem Schritt zuf\u00e4llige Nachfolger, bis er das Ende erreicht (wenn der Plan zu einem Sieg oder einer Niederlage f\u00fchrt). Das endg\u00fcltige Ergebnis wird dann verwendet, um die Bewertung des \u201eGewichts\u201c der vorherigen Optionen zu erh\u00f6hen oder zu senken. Durch mehrmaliges Wiederholen dieses Prozesses gibt der Algorithmus eine gute Einsch\u00e4tzung ab, 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>In der Erz\u00e4hlung \u00fcber Planung in Spielen kommt man nicht ohne Goal-Oriented Action Planning oder GOAP (zielorientierte Aktionsplanung) aus. Dies ist eine weit verbreitete und diskutierte Methode, aber abgesehen von einigen unterscheidenden Details handelt es sich im Wesentlichen um eine Methode des r\u00fcckw\u00e4rts gerichteten Denkens, die wir zuvor erw\u00e4hnt haben. Wenn die Aufgabe lautet \u201eden Spieler eliminieren\u201c und der Spieler sich hinter einer Deckung befindet, k\u00f6nnte der Plan so aussehen: zerst\u00f6re mit einer Granate \u2192 hole sie \u2192 wirf sie.<\/p>\n<p>Normalerweise gibt es mehrere Ziele, jedes mit seiner eigenen Priorit\u00e4t. Wenn das Ziel mit der h\u00f6chsten Priorit\u00e4t nicht erreicht werden kann (da keine Kombination von Aktionen einen Plan \u201eden Spieler eliminieren\u201c erstellt, weil der Spieler nicht sichtbar ist), kehrt die KI zu den Zielen mit niedrigerer Priorit\u00e4t zur\u00fcck.<\/p>\n<h2>Training und Anpassung<\/h2>\n<p>\nWir haben bereits erw\u00e4hnt, dass KI in Spielen normalerweise kein maschinelles Lernen verwendet, da es nicht geeignet ist, um Agenten in Echtzeit zu steuern. Aber das bedeutet nicht, dass man aus diesem Bereich nichts lernen kann. Wir w\u00fcnschen uns einen Gegner in einem Shooter, von dem man etwas lernen kann. Zum Beispiel \u00fcber die besten Positionen auf der Karte. Oder einen Gegner in einem Kampfspiel, der h\u00e4ufig verwendete Kombinationen des Spielers blockieren w\u00fcrde, was dazu anregt, andere zu verwenden. Maschinelles Lernen kann in solchen Situationen also sehr n\u00fctzlich sein.<\/p>\n<h3>Statistik und Wahrscheinlichkeiten<\/h3>\n<p>\nBevor wir zu komplexen Beispielen \u00fcbergehen, lassen Sie uns \u00fcberlegen, wie weit wir gehen k\u00f6nnen, indem wir einige einfache Messungen vornehmen und diese zur Entscheidungsfindung nutzen. Zum Beispiel, die Echtzeit-Strategie \u2013 wie k\u00f6nnen wir feststellen, ob ein Spieler in den ersten Minuten des Spiels einen Angriff starten kann und welche Verteidigung wir dagegen aufbauen sollten? Wir k\u00f6nnen die bisherigen Erfahrungen des Spielers analysieren, um zu verstehen, wie seine zuk\u00fcnftige Reaktion aussehen k\u00f6nnte. Zun\u00e4chst einmal haben wir keine solchen Ausgangsdaten, aber wir k\u00f6nnen sie sammeln \u2013 jedes Mal, wenn die KI gegen einen Menschen spielt, kann sie die Zeit des ersten Angriffs aufzeichnen. Nach mehreren Sitzungen erhalten wir den Durchschnittswert der Zeit, nach der der Spieler in der Zukunft angreifen wird.<\/p>\n<p>Es gibt jedoch auch ein Problem mit Durchschnittswerten: Wenn ein Spieler 20 Mal \u201erushte\u201c und 20 Mal langsam spielte, dann werden die ben\u00f6tigten Werte irgendwo in der Mitte liegen, was uns nichts N\u00fctzliches bringt. Eine m\u00f6gliche L\u00f6sung besteht darin, die Eingangsdaten zu begrenzen \u2013 wir k\u00f6nnen die letzten 20 Angriffe ber\u00fccksichtigen.<\/p>\n<p>Ein \u00e4hnlicher Ansatz wird verwendet, um die Wahrscheinlichkeit bestimmter Aktionen abzusch\u00e4tzen, wobei davon ausgegangen wird, dass die fr\u00fcheren Vorlieben des Spielers auch in Zukunft bestehen bleiben. Wenn ein Spieler uns f\u00fcnf Mal mit Feuerb\u00e4llen angreift, zwei Mal mit Blitz und ein Mal im Nahkampf, ist offensichtlich, dass er Feuerb\u00e4lle bevorzugt. Wir extrapolieren und sehen die Wahrscheinlichkeit, verschiedene Waffen zu verwenden: Feuerball = 62,5 %, Blitz = 25 % und Nahkampf = 12,5 %. Unsere Spiel-KI muss sich auf den Schutz gegen Feuer vorbereiten.<\/p>\n<p>Eine weitere interessante Methode ist die Verwendung des Naive Bayes Classifier, um gro\u00dfe Mengen an Eingabedaten zu analysieren und die Situation zu klassifizieren, damit die KI entsprechend reagiert. Bayes-Klassifikatoren sind am bekanntesten f\u00fcr ihren Einsatz in Spamfiltern f\u00fcr E-Mails. Dort untersuchen sie W\u00f6rter, vergleichen sie mit ihren vorherigen Vorkommen (ob in Spam oder nicht) und ziehen Schl\u00fcsse \u00fcber eingehende Nachrichten. Wir k\u00f6nnen dasselbe tun, sogar mit weniger Eingabedaten. Basierend auf allen n\u00fctzlichen Informationen, die die KI sieht (z. B. welche feindlichen Einheiten erstellt wurden, welche Zauber sie einsetzen oder welche Technologien sie erforschen), und dem endg\u00fcltigen Ergebnis (Krieg oder Frieden, \u201erushen\u201c oder verteidigen usw.) \u2013 w\u00e4hlen wir das angemessene Verhalten der KI aus.<\/p>\n<p>Alle diese Lernmethoden sind ausreichend, aber es ist ratsam, sie auf Basis von Testergebnissen zu verwenden. KI wird lernen, sich an die verschiedenen Strategien anzupassen, die Ihre Playtester verwendet haben. Eine KI, die sich nach dem Release an den Spieler anpasst, kann zu vorhersehbar oder umgekehrt 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 der Werte \u00e4ndern, die die Entscheidungsfindung beeinflussen, anstatt nur die Eingabedaten zu verwenden. So machen wir das:<\/p>\n<ul>\n<li>Lassen Sie die KI Daten \u00fcber den Zustand der Welt und wichtige Ereignisse w\u00e4hrend des Spiels sammeln (wie oben angegeben).<\/li>\n<li>Wir werden einige wichtige Werte (value) basierend auf diesen Daten \u00e4ndern.<\/li>\n<li>Wir setzen 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 er f\u00fcr einen Besuch ist. Die KI w\u00e4hlt zuf\u00e4llig, in welchen Raum sie gehen soll, basierend auf dem Wert. Der Agent merkt sich dann, in welchem Raum er get\u00f6tet wurde, und reduziert dessen Wert (die Wahrscheinlichkeit, dass er zur\u00fcckkommt). Analog f\u00fcr die umgekehrte Situation \u2013 wenn der Agent viele Gegner vernichtet, steigt der Wert des Raums.<\/p>\n<h3>Markov-Modell<\/h3>\n<p>\nWas, wenn wir die gesammelten Daten zur Vorhersage verwenden? Wenn wir uns an jeden Raum erinnern, in dem wir den Spieler \u00fcber einen bestimmten Zeitraum gesehen haben, k\u00f6nnen wir vorhersagen, in welchen Raum der Spieler wechseln k\u00f6nnte. Indem wir die Bewegungen des Spielers durch die R\u00e4ume (values) verfolgen und aufzeichnen, k\u00f6nnen wir diese vorhersagen.<\/p>\n<p>Nehmen wir drei R\u00e4ume: rot, gr\u00fcn und blau. Und die Beobachtungen, die wir w\u00e4hrend der Betrachtung der Spielsitzung aufgezeichnet haben:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" 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 einen guten Platz f\u00fcr einen Hinterhalt schaffen k\u00f6nnen, wissen wir immer noch nicht. Die Sammlung von Statistiken wird auch durch das Respawning der Spieler erschwert, die gleichm\u00e4\u00dfig auf der gesamten Karte erscheinen. Aber die Daten \u00fcber den n\u00e4chsten Raum, in den sie nach ihrem Erscheinen auf der Karte eintreten \u2013 sind bereits hilfreich.<\/p>\n<p>Es ist offensichtlich, dass der gr\u00fcne Raum die Spieler ansprechend findet \u2013 die Mehrheit der Leute wandert von rot dorthin, wobei 50 % von ihnen dort verweilen. Der blaue Raum hingegen erfreut sich keiner Beliebtheit, dort gehen fast keine Leute hin, und wenn sie es tun, verweilen sie nicht. <\/p>\n<p>Doch die Daten zeigen uns etwas Wichtigeres \u2013 wenn sich ein Spieler im blauen Raum aufh\u00e4lt, wird der n\u00e4chste Raum, in dem wir ihn wahrscheinlich sehen, der rote und nicht der gr\u00fcne sein. Trotz der Tatsache, dass 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 wechselt) h\u00e4ngt vom vorherigen Zustand (also dem Raum, in dem sich der Spieler derzeit befindet) ab. Aufgrund der Abh\u00e4ngigkeitsanalysen werden wir genauere Prognosen machen, als wenn wir einfach 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, und solche Beispiele (mit R\u00e4umen) werden Markov-Ketten genannt. Da diese Modelle die Wahrscheinlichkeit von \u00c4nderungen zwischen aufeinanderfolgenden Zust\u00e4nden darstellen, werden sie visuell in Form eines FSM mit Wahrscheinlichkeiten um jeden \u00dcbergang dargestellt. Fr\u00fcher haben wir FSM verwendet, um den Verhaltenszustand darzustellen, in dem sich der Agent befand, aber dieses Konzept erstreckt sich auf jeden Zustand, unabh\u00e4ngig davon, ob er mit dem Agenten in Verbindung steht oder nicht. In diesem Fall stellen die Zust\u00e4nde den Raum dar, den der Agent besetzt:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" 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, das n\u00e4chste Zustand zu prognostizieren. Man kann mehrere Schritte im Voraus vorhersagen.<\/p>\n<p>Wenn sich der Spieler im gr\u00fcnen Raum befindet, besteht eine 50 %ige Chance, dass er beim n\u00e4chsten Beobachtung dort bleibt. Aber wie hoch ist die Wahrscheinlichkeit, dass er auch danach noch dort ist? Es gibt nicht nur die Chance, dass der Spieler nach zwei Beobachtungen im gr\u00fcnen Raum geblieben ist, sondern auch die M\u00f6glichkeit, dass er weggegangen und zur\u00fcckgekehrt ist. Hier ist eine neue Tabelle unter Ber\u00fccksichtigung der neuen Daten:<\/p>\n<p><img decoding=\"async\" alt=\"Wie man eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/f87afff68b066a879661e37f68654ae2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nHieraus ergibt sich, dass die Chance, den Spieler nach zwei Beobachtungen im gr\u00fcnen Raum zu sehen, bei 51 % liegt \u2013 21 %, dass er aus dem roten Raum kommt, 5 %, dass der Spieler dazwischen den blauen Raum besucht hat, und 25 %, dass der Spieler den gr\u00fcnen Raum \u00fcberhaupt nicht verlassen hat.<\/p>\n<p>Eine Tabelle ist ein einfaches visuelles Werkzeug \u2013 das Verfahren erfordert nur die Multiplikation von Wahrscheinlichkeiten in jedem Schritt. Das bedeutet, dass Sie weit in die Zukunft schauen k\u00f6nnen, mit einer Ausnahme: Wir nehmen an, dass die Chance, den Raum zu betreten, vollst\u00e4ndig von dem aktuellen Raum abh\u00e4ngt. Dies wird als Markowsches Eigentum (Markov Property) bezeichnet \u2013 der zuk\u00fcnftige Zustand h\u00e4ngt nur vom aktuellen ab. Aber das ist nicht hundertprozentig genau. Spieler k\u00f6nnen Entscheidungen je nach anderen Faktoren \u00e4ndern: Gesundheitszustand oder Anzahl der Munition. Da wir diese Werte nicht festhalten, werden unsere Prognosen weniger genau sein.<\/p>\n<h3>N-Gramme<\/h3>\n<p>\nWas ist mit dem Beispiel eines Kampfspiels und der Vorhersage von Kombinationsz\u00fcgen des Spielers? Dasselbe! Statt eines einzelnen Zustands oder Ereignisses untersuchen wir ganze Sequenzen, aus denen der Kombinationsangriff besteht.<\/p>\n<p>Eine M\u00f6glichkeit, dies zu tun, besteht darin, jede Eingabe (wie Kick, Punch oder Block) im Puffer zu speichern und den gesamten Puffer als ein Ereignis aufzuzeichnen. Der Spieler dr\u00fcckt also wiederholt Kick, Kick, Punch, um den SuperDeathFist-Angriff auszuf\u00fchren. Das KI-System speichert 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 eine Spiel-KI erstellt: ein Leitfaden f\u00fcr Einsteiger\" src=\"\/wp-content\/uploads\/2019\/11\/9a95226ae155dca5e45a66d4440f3cd4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Die Zeilen sind fett hervorgehoben, wenn der Spieler den SuperDeathFist-Angriff ausf\u00fchrt.)<\/p>\n<p>Die KI wird alle Varianten sehen, bei denen der Spieler Kick gew\u00e4hlt hat, gefolgt von einem weiteren Kick, und dann bemerken, dass die n\u00e4chste Eingabe immer Punch ist. Dies erm\u00f6glicht es dem Agenten, den SuperDeathFist-Kombinationsangriff vorherzusagen und ihn zu blockieren, wenn m\u00f6glich.<\/p>\n<p>Diese Ereignisse werden als N-Gramme (N-grams) bezeichnet, wobei N die Anzahl der gespeicherten Elemente ist. Im vorherigen Beispiel handelte es sich um ein 3-Gramm (Trigramm), was bedeutet: Die ersten beiden Eintr\u00e4ge werden verwendet, um den dritten vorherzusagen. Entsprechend sagen in einem 5-Gramm die ersten vier Eintr\u00e4ge den f\u00fcnften vor und so weiter.<\/p>\n<p>Der Entwickler muss die Gr\u00f6\u00dfe der N-Gramme sorgf\u00e4ltig ausw\u00e4hlen. Eine kleinere Zahl von N ben\u00f6tigt weniger Speicher, speichert jedoch auch eine k\u00fcrzere Geschichte. Zum Beispiel wird ein 2-Gramm (Bigramm) Kick, Kick oder Kick, Punch aufzeichnen, kann jedoch Kick, Kick, Punch nicht speichern, sodass die KI nicht auf den SuperDeathFist-Kombinationsangriff reagieren wird.<\/p>\n<p>Andererseits ben\u00f6tigen gro\u00dfe Zahlen mehr Speicher und es wird f\u00fcr die KI schwieriger, zu lernen, da es viel mehr m\u00f6gliche Varianten gibt. Wenn Sie drei m\u00f6gliche Eingaben wie Kick, Punch oder Block hatten und wir ein 10-Gramm verwendet haben, ergeben sich etwa 60.000 verschiedene Varianten.<\/p>\n<p>Das Bigram-Modell ist eine einfache Markow-Kette \u2013 jedes Paar \u201evorheriger Zustand \/ aktueller Zustand\u201c ist ein Bigramm, und Sie k\u00f6nnen den zweiten Zustand anhand des ersten vorhersagen. Trigramme und gr\u00f6\u00dfere N-Gramme k\u00f6nnen ebenfalls als Markow-Ketten betrachtet werden, wobei alle Elemente (au\u00dfer dem letzten im N-Gramm) zusammen den ersten Zustand bilden und das letzte Element den zweiten. Ein Beispiel aus dem Kampfspiel zeigt die Wahrscheinlichkeit des \u00dcbergangs vom Zustand Kick und Kick zu den Zust\u00e4nden Kick und Punch. Wenn wir mehrere Aufzeichnungen der Eingangsvergangenheit als eine Einheit betrachten, verwandeln wir im Wesentlichen die Eingabesequenz in einen Teil des gesamten Zustands. Dies gibt uns die Markow-Eigenschaft, die es erm\u00f6glicht, Markow-Ketten zur Vorhersage der n\u00e4chsten Eingabe zu verwenden und zu erraten, 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 k\u00fcnstlicher Intelligenz gesprochen. Au\u00dferdem haben wir die Situationen untersucht, in denen sie angewendet werden sollten und wo sie besonders n\u00fctzlich sind. <\/p>\n<p>Das sollte ausreichen, um die Grundlagen im Gaming-AI zu verstehen. Aber nat\u00fcrlich ist das bei weitem nicht alles. Zu den weniger verbreiteten, aber nicht weniger effektiven Methoden geh\u00f6ren:<\/p>\n<ul>\n<li>Optimierungsalgorithmen, einschlie\u00dflich Hill Climbing, Gradientenabstieg und genetische Algorithmen<\/li>\n<li>Wettbewerbsalgorithmen f\u00fcr Suche \/ Planung (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 f\u00fcr KI (hybride Systeme, Untergruppen von Architekturen und andere M\u00f6glichkeiten zur \u00dcberlappung von KI-Systemen)<\/li>\n<li>Animationswerkzeuge (Planung und Koordination von Bewegungen)<\/li>\n<li>Leistungsfaktoren (Detailgrad, Anytime-Algorithmen und Timeslicing)<\/li>\n<\/ul>\n<p>\nInternetressourcen zum 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 im Bereich der Entwicklung von Gaming-AI.<br \/>\n3. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gdcvault.com\/\">Das 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, ver\u00f6ffentlicht 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 Analysen von KI in kommerziellen Spielen.<\/p>\n<p>B\u00fccher zu diesem Thema:<\/p>\n<p>1. Die Buchreihe Game AI Pro besteht aus Sammlungen kurzer Artikel, die erkl\u00e4ren, wie bestimmte Funktionen implementiert oder spezifische Probleme gel\u00f6st werden k\u00f6nnen.<\/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: Gesammelte Weisheit von Game AI-Experten<\/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: Gesammelte Weisheit von Game AI-Experten<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/amzn.to\/2KF4irS\">Game AI Pro 3: Gesammelte Weisheit von Game AI-Experten<\/a><\/noindex><\/p>\n<p>2. Die Reihe AI Game Programming Wisdom ist der Vorg\u00e4nger der Reihe Game AI Pro. Sie enth\u00e4lt \u00e4ltere Methoden, aber fast alle sind auch heute noch relevant.<\/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> \u2014 ist einer der Grundlagenliteraturen f\u00fcr alle, die sich mit dem allgemeinen Bereich der k\u00fcnstlichen Intelligenz vertraut machen m\u00f6chten. Dieses Buch handelt nicht von der Spieleentwicklung \u2013 es lehrt die grundlegenden Grundlagen 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-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e\u0431.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T10:59:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Wie man einen Spiel-IU erstellt: Ein Leitfaden f\u00fcr Anf\u00e4nger | ProHoster","description":"Ich bin auf ein interessantes Material gesto\u00dfen \u00fcber.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/news\/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.","og:url":"https:\/\/prohoster.info\/de\/blog\/news\/kak-sozdat-igrovoj-ii-gajd-dlya-nachinayushhih","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T21:00:00+00:00","article:modified_time":"2020-02-18T10:59:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52118","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 02:32:21","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:49:49","updated":"2026-01-24 02:32:21","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/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}]}}