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
Spontan hätte ich eine Idee, die funktionieren könnte, bevor ich jetzt aber sinnlos los sprudele, frag ich mal besser, woran es denn hapert.Zitat
Allerdings hab ich keine Ahnung, wie ich den hier entwickeln soll?
Das wiederum ist nicht schlimm, denn Schachcomputer stehen ja vor dem selben Problem und verwenden häufig(immer?) auch einen Alpha/Beta Algorithmus. Eine andere KI wäre ja auch nicht vorhersagbar, damit muss dein Algorithmus halt umgehen können.Zitat
Vorhersagbar ist das Spiel dennoch nicht, da ja der menschliche Spieler und seine Aktionen nicht vorhersagbar sind.
Zitat
Also bei Spielbaum (Minimax o. ä.) wüsste ich nicht, wie ich die Züge bewerten sollte.
Also 1. Zug Computer, aktuell 3 Möglichkeiten (vorausgesetzt, die Rohstoffe sind ausreichend):
So nun macht der Mensch einen Zug, dann muss ich wieder die 3 Möglichkeiten durchgehen. Aber diesmal ist die Voraussetzung anders. Evtl. hat der Mensch nun mehr Türme, oder hat einen der Computertürme angegriffen. Dies müsste ja irgendwie in die Bewertung einfließen. Wenn man den Baum nicht vollständig bildet, dann muss man ja die Knoten irgendwie bewerten - aber wie soll ich den Knoten Werte zuordnen, wenn ich nicht weiss, wie der Teilbaum endet?. Keine Ahnung, wie ich das am besten anstellen soll! Dabei ist es eigentlich egal, ob 3, 4,5 oder mehr Aktionen zur Auswahl stehen. Mein Problem ist das Bewerten der Möglichkeiten. Wie gesagt, noch keine Idee, wie das am besten laufen sollte!
- Angreifen
- Turm bauen
- Nix tun (Rohstoffe sparen)
Das stört aber nicht, da so lange der Computer am Zug ist, der Mensch eh nix machen kann (wie schon geschrieben, daher muss es schnell gehen).Hm, also erstmal bin ich von einem Rundenspiel ausgegangen, in einem RTS sehe ich erstmal das Problem für einen Min/Max Baum, dass ein anderer Spieler eine Aktion ausführt, während die KI rechnet.
Welche meinst Du? Die ist ja gerade mein Problem: Wie ordne ich den Knoten im Baum diskrete Werte zu, wenn ich den Baum nicht voll erstelle? Könnte höchstens in "Siegpunkten" rechnen, jeder ganze Turm zählt 2, jeder angeschlagene 1. Nun wird jeder Knoten damit bewertet, wie viele Siegpunkte beide Spieler haben und dann der gewählt, der dem Computer den möglichst besten Vorteil beschafft. Oder was wäre hier angebracht?Eine Bewertungsfunktion hast du ja bereits, die musst du nur noch auf die Stellungen anwenden. Wie Schorsch schon sagte, für eine optimale Bewertungsfunktion wirst du dein Spiel viel spielen müssen.
Wenn z.B. der Computer einen Turm baut, dann der Mensch auch, kann der Computer ermitteln, welche Ressourcen beide verbraucht haben und welche sie gewonnen haben (was geschummelt ist, denn der Mensch könnte nicht ermitteln, welche Ressourcen der Computer bekommen hat). Und dann? Wie wird daraus ein Wert? Hab hier keinen guten Ansatz.Interessant wird die Sache jetzt dadurch, dass das Spiel in Echtzeit laufen soll. Ich würde versuchen, die ganze Zeit über einen Baum zu behalten und entweder dann zu ziehen, wenn der Baum eine bestimme Tiefe erreicht hat oder wenn es einen sehr starken Zug gibt (dies würde bedeuten, dass du nicht nur die Blätter, sondern auch alle anderen Knoten bewerten musst, eventuell reicht hier aber auch eine Grobe Bewertung aus). Macht der Gegner einen Zug, so bedeutet dies, das einer deiner Knoten auf der 2. Ebene (0 ist die Wurzel) deine neue Wurzel wird. Dann beginnst du hier von neuem.
Wegen der Zeit musst du mit der maximalen Tiefe, der Einschätzung, was ein sehr guter Zug ist und möglichen Optimierungen des Alpha/Beta Algorithmus herumspielen müssen. Die Spielgeschwindigkeit eines Menschen zusammen mit einer passablen Stärke sollte aber machbar sein.
Ups, mein Fehler, ich hielt deine bisherige Strategie für eine Bewertungsfunktion, was sie aber nicht istZitat
Welche meinst Du? Die ist ja gerade mein Problem: Wie ordne ich den Knoten im Baum diskrete Werte zu, wenn ich den Baum nicht voll erstelle? Könnte höchstens in "Siegpunkten" rechnen, jeder ganze Turm zählt 2, jeder angeschlagene 1. Nun wird jeder Knoten damit bewertet, wie viele Siegpunkte beide Spieler haben und dann der gewählt, der dem Computer den möglichst besten Vorteil beschafft. Oder was wäre hier angebracht?
C-/C++-Quelltext |
|
1 2 3 4 |
int rateSituation(const Situtation& situation){ int rating = 0; for(int i = 0; i < towerList.size(); ++i) { if(towerList[i].belongsTo(player1)) { rating += 1000; } else {rating -= 1000; } } rating += player1.woodIncome() * 10; rating += player1.stoneIncome() * 10; rating -= player2.woodIncome() * 10; rating -= player2.stoneIncome() * 10; } |
Aber wie findet man denn diesen heraus, wenn man eh nur eine geringe Tiefe berechnen will?Und wenn ein Teil des Baumes nicht erstellt wird, dann weil er sowieso keinen Einfluss auf den Ausgang nehmen würde, also brauchst du ihn auch nicht zu berechnen
Und wofür die Gewichtungen (also die Multiplikatoren)? Und würdest Du hier noch ein Zufallselement mit aufnehmen (oder nach der Baumauswertung)?int rateSituation(const Situtation& situation){ int rating = 0;
for(int i = 0; i < towerList.size(); ++i) { if(towerList.belongsTo(player1)) { rating += 1000; } else {rating -= 1000; } }
rating += player1.woodIncome() * 10; rating += player1.stoneIncome() * 10; rating -= player2.woodIncome() * 10; rating -= player2.stoneIncome() * 10;
}
Werbeanzeige