Das ist auch nicht gerade das einfachste Thema. Ich bin auch kein Experte in KI, aber wenn du du dort gute Ergebnisse erzielen willst, sind zwei Stichworte denke ich Hilfreich: Probleme in Teilprobleme zerlegen und Zustandsautomaten:
1. Probleme in Teilprobleme zerlegen
Das macht so ziemlich jeder, der ein komplexes Problem hat. Dein Projekt ist in Bezug auf die Simulationslogik nicht anders. Du musst versuchen die Aufgaben, die deine Simulation hat, in möglichst einfache Teilschritte zerlegen. Aber auch nur soweit, dass du sie auf oberster Ebene überschauen kannst. Dann verlierst du nicht den Überblick.
2. Zustandsautomaten
Gebe deinen Spielobjekten Zustände. Jeder Zustand hat eine Ausführungslogik und Übergangsbedingungen zu anderen Zuständen. Du hast deine Zustände bereits genannt:
'Suche im Umkreis von 10 sm nach fremdem U-Booten', wenn Du ein feindliches entdeckst, Angriff, Verfolgung, e.t.c..
Dabei ist meine Erfahrung: weniger ist mehr. Zum Beispiel könnten Zustände Erkunden, Verfolgung, Angriff und Rückzug sein. Bei den Zuständsübergangen kannst du ja erstmal sehr simple Annahmen treffen. Befindet sich zum Beispiel ein U-Boot im Zustand Erkunden, dann wechsle nur dann in Angriff, wenn ein Gegner in der Nähe ist ( vllt 5km umkreis). Parametrisieren kannst du später machen, z.b. in Dateien auslagern und kannst dann wunderbar testen! Wenn die einfachen fälle funktionen, verfeinere deine Logik und Übergangsbedingunden.
Zum Zeitraffer:
Deine Simulation sollte die Zeit, die für einen Simulationsschritt benötigt wird, messen. Dies könnte für dich dein Leitwert zur Simulationsgeschwindigkeit == 1 sein. Bzgl. Physik wäre sogar eine möglichst konstante Simulationsgrundgeschwindigkeit sehr praktisch, also dass du mit festen Zeitintervallen einen Simulationsschritt berechnest, z.b. 20 mal die Sekunde.
Wenn du dann schneller Simulieren möchtest, dann multiplizierst du einfach deine Vergangene Zeit - egal ob Konstant oder Variabel - mit einem Multiplikator. Wichtig ist, das alle deine Simulationsbewegungen und eventuell Entscheidungsreaktionen in Abhängigkeit der Simulationsgeschwindigkeit * Zeitraffer durchgeführt werden. Hier ein bisschen pseudo-C++:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
float lapse = 1.0f; //dein zeitraffer-multiplikator
while (!end)
{
float elapsed = myTimer.GetElapsedTime() * lapse;
for(int i = 0; i < ships.size(); ++i)
{
ships[i].UpdateLogic(elapsed);
}
//.. Andere Updatelogik
//deine Logik zu anderen PCs senden
CommitSnapshotOfLogic();
}
|