Als ich AI für rundenbasierte Strategie schrieb

Hallo allerseits. Ich denke, dass aus der Überschrift klar hervorgeht, dass wir über die Schaffung künstlicher Intelligenz (im Folgenden einfach KI) sprechen werden, darüber, welche Entscheidungen getroffen wurden und was letztendlich passiert ist. Aber zuerst müssen Sie sich auf den neuesten Stand bringen.

Das Spiel ist in der Programmiersprache Lua geschrieben, daher werde ich Codebeispiele in dieser Sprache geben.

Ich werde einige Details des Spiels beschreiben, die für die KI wichtig sind:

  1. Das Spiel ist eine rundenbasierte Strategie. Zuerst geht der Spieler, dann führt die KI ihre Aktionen für jedes Land aus. Die KI funktioniert nur, wenn Sie auf Weiter verschieben klicken und keine Ahnung haben, was zu einem anderen Zeitpunkt passiert.
  2. Das Spiel hat eine Karte, auf der Sie Truppen rekrutieren / bewegen / einsetzen können. Die KI muss es analysieren und die notwendigen Entscheidungen treffen.
  3. Im Spiel können Sie Frieden schließen / Krieg erklären / einen Nichtangriffspakt unterzeichnen / Allianzen schließen und beenden. Die KI muss damit umgehen können.
  4. Technologie und politische Institutionen stehen nur dem Spieler zur Verfügung. KI-Boni ändern sich im Gegensatz zum Spieler nicht zu Beginn des Spiels.

Die Funktion, die für den Start des nächsten Zuges verantwortlich ist, sieht folgendermaßen aus:

function next_step() --     --   ,    for k, v in pairs(game_data.lands) do calc_ai(k) end --  End 

Sie müssen die magische Funktion calc_ai bemerkt haben, die für alle Aktionen von Bots verantwortlich ist. Sie sehen noch ein interessantes Detail: Die Funktion wird für jedes Land abwechselnd ausgeführt.

Nun beantworten wir die Frage, was in calc_ai passiert.

 function calc_ai(land) if land == game_data.player_land or land == "Undeveloped_land" or not game_data.lands[land] then return end --    ,     for k, v in pairs(game_data.lands) do local option = math.random() --  ,       . if k == game_data.player_land then ai_data = fixed_ai_data[game_data.difficulty].player else ai_data = fixed_ai_data[game_data.difficulty] end end move_army( math.random(), land) --  balance_army( math.random(), land) --   end 

Bis wir tief verstehen, wie KI Entscheidungen in der Politik trifft, stellen wir Folgendes fest:

  1. Es wird überprüft, ob die KI nicht versehentlich für den Spieler oder für das unverständliche unentwickelte Land geht. Dies ist nur Land ohne Land (Tatsächlich sollte eine Provinz immer ein Land haben, dem es gehört, daher ist Undeveloped_land die Bezeichnung in erster Linie für das Spiel).
  2. Die KI wählt verschiedene Tische für die Interaktion mit dem Land aus, je nachdem, ob der Spieler es kontrolliert oder nicht.
  3. KI bewegt zuerst die Armee und stellt erst dann ein.

fixed_ai_data - die Tabelle selbst. Es wird so benannt, weil es sich nicht ändert (genauer gesagt, die Variable bezieht sich immer auf die Stammtabelle).
ai_data - die Tabelle selbst, die sich ändert, je nachdem, ob der Bot mit dem Spieler ai_data oder nicht (die Variable bezieht sich einfach auf die gewünschte Tabelle).

Tatsächlich hat das Spiel nur eine Tabelle, die sich auf KI bezieht, und es sieht so aus:

 local ai = { standard = { peace = { conquer = 0.0001, war = 0.0002, war_neighbour = 0.004, pact = 0.005, agree_pact = 0.018, alliance = 0.001, alliance_small = 0.002, agree_alliance = 0.002, kick = 0.0005, envy = 0.02 }, war = { agree_peace = 0.005, }, player = { peace = { war = 0.0002, war_neighbour = 0.002, pact = 0.008, agree_pact = 0.08, alliance = 0.001, alliance_small = 0.002, agree_alliance = 0.002, kick = 0.0005, support = 0.005, voluntary_support = 0.002, envy = 0.01 }, war = { agree_peace = 0.02, } }, bonuses = { population_increase = 1.4, money_increase = 1.5, upgrade_province = 0.005 } }, } 

standard - Schwierigkeitsgrad. Es gibt verschiedene Schwierigkeitsgrade und die Werte in verschiedenen Tabellen variieren.

peace , war - Zustand des Landes. Der peace wird für jede Aktion verwendet, der Kriegstisch nur für Aktionen mit dem Feind.

Die dritte player enthält die peace und war mit den geänderten Werten. Wie Sie bereits wissen, kann ein KI-Spiel eine andere Einstellung zu Spieler und Bot haben.

Ich denke, die Werte in den Tabellen sind namentlich klar. Aber auf jeden Fall werden wir einige davon betrachten.

In der Zwischenzeit müssen wir herausfinden, wie die KI im Spiel funktioniert. Hier ist alles einfach, je nach Status kann der Bot einen beliebigen Wert aus der Liste auswählen. Die obigen Zahlen geben die Eintrittswahrscheinlichkeit jedes Ereignisses an. Betrachten Sie ein Beispiel:
pact = 0.005 - bedeutet, dass ein Land mit einer Chance von 0,005 einem anderen Land den Abschluss eines Nichtangriffspakts anbietet. Ja, alles ist einfach. Sie können sagen: "Wie können Sie dann spielen, wenn Sie wissen, dass die KI alles zufällig macht?" Eigentlich ist es nicht ganz so und wir werden dies etwas später analysieren.

Schauen Sie sich in der Zwischenzeit folgende Funktion an:

 function get_answer(option,state) local sum_option = 0 for k, v in pairs(state) do sum_option = sum_option + v if option < sum_option then return k end end if sum_option > 1 then print("AI Error, sum_option > 1") end end 

option - Zufallszahl von 0 bis 1
state - Staat des Landes
Die Funktion get_answer einfach eine zufällige Aktion zurück. Warum wird es benötigt und warum können Sie nicht einfach die option <Handlungsmöglichkeit aktivieren? Ich denke, es ist nicht notwendig, dies zu erklären.

Diese Funktion wird in allen möglichen Aktionen für AI überprüft:

 if __ and get_answer(option, ai_data.peace) == "pact" then _ end 

Alles ist einfach. Dies scheint beendet zu sein, aber nein.

Lassen Sie uns einige Punkte klarstellen:

  1. KI erklärt Nachbarn und war_neighbour mit unterschiedlichen Chancen den war ( war , war_neighbour )
  2. Kleine Länder treten eher Gewerkschaften bei als große ( alliance , alliance_small )
  3. KI hat Neid. Der Name ist nicht ganz klar, aber dies ist eine Chance, mit der das Land den Krieg nach den Maßstäben der Spielmacht für zu stark erklären wird.
  4. Wir haben die Bonustabelle vergessen. Es speichert Werte, die in keiner Weise mit der Haltung gegenüber anderen Ländern zusammenhängen, beispielsweise einen Bonus auf das Bevölkerungswachstum oder eine Chance zur Verbesserung der Provinz.

Dies endete nicht dort (es sei denn, Sie waren natürlich interessiert). Es ist seltsam, wenn ein Land ohne Grund den Krieg erklärt, und noch seltsamer, wenn es nicht für diesen Krieg bereit ist. Daher hat die KI im Spiel Strategien. Ich werde erklären, dass das Land anstelle eines Überraschungsangriffs in den meisten Fällen eine Strategie startet.

Jedes Land in der Sicherungsdatei hat die folgenden Felder:

  • strategy - Kennung der Strategie. Es passiert:
    1. retreat - ein Land reduziert seine Armee, um Geld zu sparen.
    2. recruit - das Land beschäftigt die maximale Armee.
  • target ist das Ziel. Dies ist jedes Land, in dem unsere KI beschlossen hat, den Krieg zu erklären, aber eine Strategie begonnen hat.
  • ultimatum - keine, wenn es kein Ultimatum gibt, Daten zum Ultimatum, falls vorhanden.
  • value - Die Anzahl der Züge vor der Kriegserklärung. Ich könnte mir leider keinen besseren Variablennamen einfallen lassen.

Das heißt, wenn KI eine Strategie startet, dann:

  1. Reduziert seine Armee und spart Geld.
  2. Stellt die höchstmögliche Armee ein.
  3. Erklärt dem Spieler den Krieg.



Mit einer gewissen Chance kann ein Land ein Ultimatum stellen, bei dessen Umsetzung der Krieg abgebrochen wird. Zum Beispiel:
Reduzieren Sie Ihre Armee in der Provinz Lipetsk auf 5.000, sonst erklären wir Ihnen den Krieg.

Aus dem Witzigen: Es gibt einen interessanten Fehler oder sogar einen Fehler, wenn das Land verlangt, die Armee in der Provinz zu reduzieren, und der Spieler schafft es, das Ultimatum zu verlieren, bis es abläuft. Die KI berücksichtigt die Provinz nicht und erklärt den Krieg, wenn das Ultimatum nicht eingehalten wird.



Es gibt zwei Variablen, die für die Chance verantwortlich sind, den Spieler zu unterstützen (Gold an den Spieler übertragen). Der erste funktioniert immer, mit Ausnahme des Kriegszustands mit dem Land, für das er berechnet wurde. Und die zweite, mit großer Bedeutung, wird berücksichtigt, wenn es einen gemeinsamen Feind gibt.

Es wurden auch verschiedene Variablen hinzugefügt, zum Beispiel Angst (wie viel die feindliche Armee über ihre eigene hinausgehen sollte, damit die KI anfängt, über die Welt nachzudenken). All dies geschieht, um die Handlungen der KI logischer und verständlicher erscheinen zu lassen. Aber jetzt wissen wir, dass dies tatsächlich ein gewöhnlicher getarnter Unfall ist.

Mir ist auch aufgefallen, dass die Spieler der KI wirklich einige für ihn ungewöhnliche Eigenschaften verleihen. Wenn zum Beispiel ein Spieler zu einem bestimmten Zeitpunkt mehreren Ländern den Krieg erklärt, wird er zunächst denken, dass dies eine Verschwörung gegen ihn ist und nicht nur ein Zufall. Und wenn der Spieler einen Vorschlag zum Abschluss eines Nichtangriffspakts erhält, wird er denken, dass der Nachbar Angst um sein Land hat. Dies ist aber leider nicht der Fall. Die Realität ist voller Enttäuschungen.

Source: https://habr.com/ru/post/de473952/


All Articles