Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.08.2015, 13:01

KI / Hexfelder - Handhabung von Bewegungsdaten der Einheiten

Ich mache ein Spiel wo auf recht kleinen Hexfeld Schlachtfeldern gekämpft wird, wie man im Anhang auch sieht. Die Kämpfe sind dabei sehr taktisch, es ist also wichtig das die KI weiß wo und wie sie ihre Einheiten platzieren kann / muss um zum besten Ergebnis zu kommen. Sie muss also wissen welche Einheiten sie mit welcher Einheit erreichen kann, wie sie wege blockieren kann, damit Einheiten von ihr nicht erreicht werden können usw.

Die KI kennt momentan das ganze Schlachtfeld und kann sich ausgeben lassen wo sich jede Einheit hinbewegen kann. Außerdem kann ich die Felder abfragen die z.B. in Nahkampfreichweite des Ziels sind und ob sie frei sind.


1. Arbeiten mit den Bewegungsdaten.

Die sind erstmal in einem zweifachen Vector so gespeichert:
y 1 x 2 | y 1 x 3 | y 1 x 4
y 2 x 2 | y 2 x 3 | y 2 x 4 | y 2 x 5
usw.

Das ist genauso wie meine Schlachtfeld Karte aufgebaut. Solange ein Feind jetzt auf der y Achse verschoben ist kann ich einfach ermitteln wie ich zu ihm komme. Ist er nördlich von mir Fange ich von 0 an zu überprüfen oder ist er südlich von mir von .size() - 1. Damit muss ich sehr wenige Felder überprüfen, ob sie mit seinen freien Nahkampffeldern des Ziels übereinstimmen. Ist er aber auf der Östlichen oder Westlichen Seite werden das schon deutlich mehr. Das könnte man zwar noch einfach abfangen, sobald er aber in einem Winkel von 45° wird es schon schwer.

Ich habe mir dann überlegt, ich kann die Koordinaten ja immer um 30° drehen. Ich bastel mir dabei dann die Bewegungsfelder so um. Das ich für jeden 30° Winkel die Felder schön geordnet hab. Ich brauch nur zu Wissen in welchen Winkel der Gegner zu mir steht und ich hab eine relativ kleine Anzahl an Felder die ich überprüfen muss. Im Anhang sieht man auch, wie die Koordinaten gedreht aussehen, ist nur etwas verzehrt da in Excel dargestellt. Einmal die original Daten und um 30° gedreht. Das hätte ich jetzt auch schon, hab mir Formel gebastelt die mir berechnen welche Koordinaten das Feld bei 30° hat und somit kann ich sie nach diesen einfach sortieren.

Das ganze Problem an der Sache ist, ich schaue dabei eine Einheit für sich selbst an. Da die Einheiten aber jetzt zusammenarbeiten sollen muss ich evtl. für eine Einheit an mehrere Stellen überprüfen auf welche Felder sie gehen kann. Auch das Kampfsystem wird es erforderlich machen, viele Szenarien durchzuspielen. Was das glaube ich sehr aufwändig machen wird, vorallem wenn es dann mehr Feinde werden.


2. Bewegungsdaten in die Schlachtfeld Karte integrieren

Im Grund ein weiterer mehrteiliger Vector der dann für jede Seite und Einheit Speichert ob das Feld erreicht werden kann:
y 2 x 3 | 0 | true | false | true
| 1 | false | false | true
y 2 x 3 stellt eine Position der Schlachtfeld Karte da
0 ist der Spieler, 1 die KI.
Die true/false sind dann jeweils eine Einheit der jeweiligen Gruppe und sagt damit gleich aus ob sie das Feld erreichen kann.

Im Grunde überprüfe ich dann nur noch nach der Karte ob ein Feld erreicht werden kann.


Ich würde jetzt zu der Zweiten tendieren, bin mir aber nicht sicher ob ich da früher oder später auch auf stellen Stoße wo es damit umständlich wird. Mir fallen zwar grad keine ein, aber deswegen kann es sie ja trotzdem geben.

Meine Frage ist jetzt, was haltet ihr von den Beiden und gibts vllt bessere Möglichkeiten das zu Lösen?


Infos zum Kampfsystem:
Eine Einheit hat dort ca. 5 Fertigkeiten.
Fertigkeiten können physischen oder magische Schaden verursachen oder Zustände auslösen.
Zustände sind z.B. Blutung, Gift, Schwäche, Drachenhaut, Berserkerwut usw.
Zustände können dabei komplexe Mechaniken besitzen. Sie bestehen dabei aus drei Bestandteilen. Effekten die sie Auslösen, Lösch
Bedingungen und Bedingungen die Veränderungen auslösen. Die letzteren können dabei Effekte, Lösch Bedingungen und Veränderungs Bedingungen aktivieren und deaktivieren. Zustände sind dabei extrem wichtig im Kampfsystem, sie können über Sieg oder Niederlage bestimmen, je nachdem wie man sie beachtet. Ein Zustand könnte jetzt z.b. in der ersten Runde nur eine Lösch Bedingung haben, die auf 2 physische Schläge wartet. Erfolgen diese nicht würde in der zweiten Runde über eine Veränderungsbedingung, die einfache Lösch Bedingung deaktiviert werden und durch eine schwerer ersetzt werden. Dazu könnte diese noch diverse Effekte aktivieren, die auf Auslöser warten um Unheil anzurichten.
Dabei soll der Spieler immer zwischen vielen Möglichkeiten entscheiden was für ihn wichtiger ist, er kann also nie alles verhindern sondern muss immer entscheiden was ihm wichtiger ist. Das gleiche trifft dann natürlich auf die KI zu, weswegen sie so viel überprüfen muss bei der Bewegung. ^^
»Shorkan« hat folgende Bilder angehängt:
  • Schlachtfeld.png
  • Gedrehte Koordinaten.png

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Shorkan« (23.08.2015, 15:25)


2

26.08.2015, 05:44

zu 1. Du könntest eventuell den A*Algorithmus nutzen.
Man könnte ihn vielleicht dafür etwas Modifizieren, so dass die Optimale Angriff Position gefunden wird.
Dafür könnten dann auch durch vorrangegange Einheiten Punkte Vergeben werden, wo sie gern einen Nachbarn hätten um eine Blockade zu bilden.

Solltes dir vielleicht mal anschauen.

Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

3

26.08.2015, 13:46

Hat sich jetzt die Tage etwas geändert, da ich mir noch mehr Gedanken darüber machen konnte.

Ich denke mir halt, sie sollte wie ein Mensch eine räumliches Vorstellungsvermögen besitzen, bzw. auf den Menschen ähnlichen Wegen die Position ermitteln können. Damit sie einem Menschen ebenbürtig sein kann. Ich will jetzt als Gegner kaum Trash Mobs besitzen, sondern die Gegner sollten dem Spieler einen gleichwertigen Kampf bieten.

Deswegen tendiere ich jetzt immer mehr zu der zweiten. Dabei denke ich das es damit auch klappen sollte, aber es wird wohl sehr viel know how brauchen, dass zu verwirklichen. Einfach ist es solange ich in Reichweite eines Gegners bin. Habe ich eine Angriffsreichweite von 1, teste ich einfach auf der Karte alle Felder um dem Ziel ob sie frei sind und von mir betreten werden können. Kann ich nur ein Feld betreten und ist dort eine Verbündete Einheit, kann ich mir das merken und der Einheit sagen sie soll weiterrücken, damit ich das Feld betreten kann. Solange die andere Einheit auf ein anderes freies Feld vorrücken kann. Ich kann jetzt dann auch gleich noch die Felder um das Zielfeld überprüfen ob weitere Feinde mich auf meinem neuen Feld erreichen können und welche Feinde es sind. Gefällt mir es dort nicht und habe ich andere Felder zur Verfügung, kann ich diese Testen um das beste Feld zu ermitteln.

Schwieriger wird es dann, wenn ich außerhalb der Reichweite bin, da bin ich mir noch nicht ganz sicher. Hat meine Einheit ein freies Bewegungsfeld wo nichts blockiert ist, kann ich recht einfach einen errechneten Punkt (basierend auf der Bewegungsreichweite) im Raum nehmen und von diesem aus dann das Feld überprüfen. Kann dort dann auch einfach die Umgebenden Felder überprüfen, sollte mir das erste Feld aus irgendwelchen Gründen nicht gefallen. Das geht also noch einfach. Wird mir aber jetzt genau in meine Richtung der Weg blockiert könnte die Suche evtl. sehr ausarten um auf meine Bewegungsfelder zu kommen, je nachdem wieviel mir blockiert wird. Da frage ich mich noch, wie ich das am besten mache. Normal denk ich mir müsste ich der KI auch beibringen können, das sie weiß das der Weg blockiert ist und das sie nach der größe der Blockade dann errechnen kann, wo sie anfangen muss zu Suchen. Das ganze beruht dann aber denke ich darauf, das ich Richtungen definiere, was ich bis jetzt vermieden habe.

Die Felder zum überprüfen habe ich schon gespeichert vorliegen, muss sie also nur abfragen und dann mit meiner Position verrechnen.

Im Grunde ist es mir auch egal wie eine Einheit auf ihre Position kommt, solange ich weiß das sie sie halt erreichen kann. Also der Weg dahin. Hab mir dabei auch Gedanken gemacht, wenn jetzt z.b. ein Lavafeld dazwischen wäre was Schaden anrichtet. Der Algorithmus der meine Bewegungsfelder generiert merkt sich das und speichert es dann in den Bewegungsfeldern als Information ab. So kann die KI dann auch einfach entscheiden, nehme ich den Schaden mit oder suche ich mir ein Feld wo ich ohne ihn hinkomme.

Denke das ganze jetzt irgendwie über den A*Algorithmus zu definieren dürfte noch schwerer werden, aber vllt täusche ich mich da auch, kanns mir nur nicht vorstellen, wie ich das angehen sollte. Weiß jetzt aber auch noch nicht wie schnell meine Variante ist, da ich sie gerade erst langsam Programmiere. Ganz einfach angefangen und dann immer komplexer. Muss aber sagen, ich habe bis jetzt noch nie eine KI gemacht die selbst Entscheidungen treffen soll. :D

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

26.08.2015, 15:15

An der Uni haben wir mal ein Brettspiel nachprogrammiert, wo wir ein ähnliches Problem hatten. Es gab mehrere Figuren die 0-x Felder in verschiedene Richtungen gehen konnten und die KI sollte natürlich möglichst gut und auch vorausschauend ziehen. Mein Ansatz war damals ein ähnlicher wie deine zweite Variante. Es wurde eine Heatmap generiert, die repräsentiert wie gut es wäre dort eine Figur stehen zu haben. Das Grundziel war es Figuren in die gegnerische Basis zu bekommen, deswegen haben vordere Felder erstmal eine gewisse positive Punktzahl bekommen. Man bekam aber auch einen Vorteil dadurch Gegner zu töten, deswegen haben die Felder schwacher gegnerischer Figuren und ihr Umfeld positive Punkte bekommen. Felder um starke gegnerische Figuren haben entsprechend Abzüge bekommen. Das Ganze wurde dann für alle Dinge durchgeführt die irgendeinen Effekt auf die Zugentscheidung haben können. Letztendlich hat die KI dann geschaut welche Felder mit jeder Figur zu erreichen sind und ist dann auf das mit der höchsten Punktzahl gegangen. Es braucht einiges an Balancing, ist aber ziemlich gut erweiterbar und lässt sogar Konfigurationen zu wie aggressive KI etc.

5

26.08.2015, 18:10

Mein Kampfsystem ist noch garnicht so ausgefeilt, im Grunde gibt es einen Baukasten mit denen ich alles zusammenstellen kann und später wird sich dann auch jeder Kampf anders Spielen. Es sollen zwar Grundmechaniken bleiben, aber jede Gegner Gruppe hat ihrgen eigenen Twist oder mehrere davon die den Kampf einzigartig machen. Das ganze soll dabei über die Zustände gelöst werden. Aber im Grunde um das genauer zu definieren was Sinn macht, brauche ich einen Gegner der das mit mir austestet, also die KI. Sie muss im Grunde also meinen Baukasten verstehen und die Zusammenhänge die man damit bauen kann. In den meisten fällen ist, sobald einer der Gegner Einheiten stirbt der Kampf dann schon so gut wie gelaufen. Geht also dem Ende zu. Die meiste Zeit versucht man über die Zustände den Gegner zu überlisten, sie also besser zu platzieren wie er. Das mit allen Tricks die einem zur Verfügung stehen.

Die KI soll dann mehrere Möglichkeiten erarbeiten was sie tun kann und diese Bewerten. Danach wird sie sich aus den besten Möglichkeiten zufällig eine Variante aussuchen. Ist jetzt eine Möglichkeit klar besser als alle anderen, wird sie sich je nach Schwierigkeitsgrad automatisch diese wählen.

Denke ich könnte das mit den Punkten auch machen, aber das wird verdammt schwer dafür alles zu berücksichtigen. Mal schauen ob ich es so umwandel, momentan fange ich jetzt an die Beispiele vom letzten Post ihr langsam beizubringen. Zuerst wie sie mich Erreicht, dann wie sie mich mit mehreren Umzingeln kann. Dann wie man jemanden versucht zu Schützen vor einem Angreifer, dann umgekehrt wie sie eine Einheit die ich Schützen will erreichen kann. Dabei auch noch, wie man lohnendere Ziele ausmacht.

Mal schauen wie weit ich damit komme. Sollte das alles klappen kommen dann die ersten Zustände mit ins Spiel, was dann immer umfangreicher werden soll und dann im Zusammenspiel mit mehrere Einheiten, schwierigere Bewegungsentscheidungen nach sich ziehen.

Werbeanzeige