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.