KI für "Cell games"

Übersicht Sonstiges Gamedesign

Neue Antwort erstellen

 

PhillipK

Betreff: KI für "Cell games"

BeitragMo, Dez 29, 2014 8:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Edit: Beim genaueren betrachten habe ich das falsche forum ausgewählt, gell? "Gamedesign" wäre wohl korrekter gewesen Sad *hust*

Hallo Leute,

ich bin grade dabei, mehrere Prototypen für Spiele in Monkey zu schreiben.
Das ganze ist rein zu übungszwecken und irgendwann was zu finden, worauf ich lust habe (als richtiges Projekt)
Eigenschaften der Prototypen die ich mir setze:
- Voll funktionsfähig
- keinerlei grafik (warum auch)
- Keinerlei menü, ähnliches. Pures ingame (eventuelle einstellungen werden fix übernommen)
- Keinerlei andere ressourcen (levels etc. Wird notdürftig zu testzwecken generiert oder fix programmiert)

Klingt doch brauchbar Wink

Mein momentaner Prototyp stagniert allerdings schon extrem. Grund hierfür ist die KI.
Es handelt sich um ein "Cell" spiel (andere namen sind mir leider nicht bekannt! Ich kenn sie nur aus flash spielen, und dort sind sie meist mit RTS und Cell / Zelle geflaggt)
Als beispiel hierfür, entschuldigt den Fremdlink, gäbe es zb
Nano War 2 auf Kongregate .


Mein bisheriger ansatz für die KI sieht in etwa wie folgt aus:
- Die KI sucht alle Zellen im Spiel zusammen
- Die KI wertet die Zellen nach füllstand und Distanz aus (sortierung)
- Die KI nimmt die erste Zelle in der Liste( geringste distanz / einheiten füllstand) und greift dort an
- angriff: Suche eigene Zellen zusammen
- Wähle soviele Zellen, bis Int(EigenerZellenFüllstand * 0.5 ) > GegnerZellenFüllstand * 1.1 + 5 ist
- Greife mit allen gewählten Zellen an

Das funktioniert soweit auch, hat aber keinerlei taktik.
Da es mir mangels guten namen quasie unmöglich ist, ein passendes Tutorial oder wenigstens eine ideensammlung oder sonstiges brainstorming zu einer solchen spiele-gattung zu finden, komme ich hier einfach nicht weiter.

also erste frage: Kennt einer von euch einen brauchbaren Google suchbegriff oder gar ein Tutorial?
Hat eventuell jemand gar schonmal eine solche KI geschrieben und könnte mir ein paar tipps verraten?



Momentan Brainstorme ich einen weiteren ansatz, welcher auf 4 Objekten basiert. Diese sind "angriff", "verteidigung", "intelligenz" und "strategie".

Intelligenz wird etwas simples, was angriffsgröße (anzahl zellen) und zellen-bewertung vorehmen soll.
Beispiel könnte zb sein, das eine Zelle nicht als "zum angriff geeignet" geflaggt ist, wenn ihr füllstand < 10 oder < Maximaler füllstand * 0.25 ist. Es wird ausserdem die Distanz und Füllstände gewichten und zb größere Zellen bevorzugen. Für passivere KIs könnte man auch die "unbewohnten" (nicht-spieler-kontrollierten-) Zellen höher gewichten.

Strategie soll die Zellen in kooperation mit "Intelligenz" bewerten (sowohl eigene als auch fremde Zellen) und diese Sortiert halten. Danach soll es die liste nicht ständig neu bauen, sondern umsortieren (im ersten KI ansatz wurden nämlich "scheinbar" willkürlich zellen ausgewählt, da diese einfach die besseren kriterien hatten. Obwohl sie ewig weit weg waren oder ähnliches). Dies soll ein wenig helfen, ein menschliches Spielverhalten zu emulieren - ein Spieler würde niemals die komplette "map" überqueren, nur um dort eine 1-unit zelle anzugreifen. Dann lieber die 15 Unit zelle direkt nebenan.

Angriff und Verteidigung sind 2 objekte, die "entweder oder" ein update erhalten.
Sie werden einfache verwaltungsschnittstellen, um Angriffe einzuleiten oder eventeulle Angriffe zu bewerten / abzuwehren.

Der Grund für die Objekte liegt darin, das das ganze erweiterbar sein wird und ich eventuell Später hier diverse Abstraktionen für eine Aggressivere oder Passivere KI vornehmen kann bzw auch an Angriff / Verteidigung leichter rankomme. Letzere beiden sind mitunter auch wegen der übersichtlichkeit getrennt - theoretisch wird das code sein, welcher direkt in die Ki kann.


Hat jemand hierzu noch weitere einwürfe oder ideen? Smile

Gruß, Phillip

DAK

BeitragMo, Dez 29, 2014 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich interessiere mich auch für Spiele dieses Genres und auch ich hab Probleme gehabt, überhaupt Spiele dieses Genres zu finden, da es dafür scheinbar keinen sinnvollen Überbegriff gibt.

Ich hab letztens auch angefangen, einen Klon des Android-Spiels ICE zu schreiben, dass eine Variante des Spielprinzips darstellt. (Sehr spielenswertes Spiel! Eins der wenigen Android-Spiele, von dem ich sicher schon über 100 Runden gespielt hab)

Die KI hängt stark von den genauen Spielregeln des Spiels ab. Hier ein paar Varianten der Spielregeln, die ich bislang gefunden habe:

-) Einheiten sind außerhalb von Angriffen fix auf "Planeten" stationiert (wie z.B. in Nano War) oder fliegen frei herum (wie z.B. in ICE).
-) Einheiten können entweder von einem "Planeten" zu einem anderen transferiert werden, oder nur an einen anderen "Planeten" zu Unterstützung geliehen werden (wie z.B. in R.O.O.T.S)
-) Planeten können frei angegriffen werden (wie z.B. in Nano War) oder nur entlang von fixen Bahnen (z.B. ICE)
-) In manchen Varianten können permanente Routen aufgebaut werden, mit denen neu erstellte Einheiten automatisch an die Front geliefert werden können.

Für die Regeln, wie sie in Nano War vorkommen würde ich die KI so schreiben:

-) Für jeden gegnerischen Planeten wird ein Angreifbarkeits-Score erstellt. Bei deinen Regeln braucht man dafür die Einheitenanzahl auf dem Planeten sowie Modifier die dem Planeten z.B. einen erhöhten Schutz oder nach dem Erobern weitere Fähigkeiten geben.
-) Für jeden eigenen Planeten wird ein Angriffsfähigkeits-Score erstellt. Auch hier zählt wieder die Einheitenanzahl und Modifier, die den Angriffswert erhöhen.
-) Für jede Kombination aus eigenen und gegnerischen Planeten wird ein Angriffs-Score erstellt. Dieser berechnet sich aus dem Angriffsfähigkeits-Score des eigenen Planeten, dem Angreifbarkeits-Score des gegnerischen Planeten und der Distanz zwischen den beiden Planeten:
Angriffs-Score = Angriffsfähigkeits-Score - Angreifbarkeits-Score - Distanz
(Mit geeigneter Gewichtung)

Ist der Angriffs-Score positiv, dann geht ein Angriff hier.

Gibt es keinen Angriffsscore, der positiv ist, dann wird das wiederholt, wobei jeweils zwei angreifende Planeten versuchen einen gegnerischen Planeten anzugreifen. Das lässt sich dann eventuell noch mit drei oder vier angreifenden Planeten wiederholen.

Es sollte genügen, das Ganze alle paar Sekunden laufen zu lassen, vielleicht die 5-fache Spawnrate der Einheiten oder so. Damit sollte sich auch der Rechenaufwand stark relativieren.

Bringt dir das was?
Gewinner der 6. und der 68. BlitzCodeCompo
 

PhillipK

BeitragFr, Jan 02, 2015 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah!

Ersteinmal, danke an unbekannt fürs schieben nach Gamedesign Smile
Zweitens, entschuldige die verspätete antwort. Du weißt ja, silvester (und krankheit).

Das ganze als Score zu betrachten ist mir noch garnicht in den Sinn gekommen, allerdings ist das eine sehr gute idee, danke dafür!

Die einheitenzahl kann mit ihrer verteidigungsstärke verrechnet werden und ergeben so den verteidigungswert, selbiges für den Angreifer. Dazu den spawn und eventuelle boni für umliegende knoten aufrechnen und voila. Eventuell den Verteidiger score nochmals um 10 oder ähnliches erhöhen, damit ein puffer stehen bleibt (dh, wenn der knoten übernommen wird, das dort schon 3-5 einheiten stehen)

Das "wiederholen" der tests ist mir ebenfalls nicht in den sinn gekommen, aber es dürfte vieles vereinfachen.
Spontaner einfall: Eigene knoten nach distanz sortiert zum gegnerknoten halten.

Merke anzahl = 1
Wiederholen:
Können die ersten "anzahl" knoten angreifen? ist der Score höher? Ja? Raus aus der schleife
Nein? Anzahl erhöhen.

Ist angriff möglich?
Eventuell: alle konstellationen der angreifer durchprüfen, ob sich ein score findet, der nur minimal höher als der def-score ist. So spart man einheiten und verhindert überflutung (falls einheitengrenze pro knoten vorhanden ist)

Diverse regelungen wie konstanter einheitenstrom (gibts zb in "Tentacle Wars" auf kong) oder knoten-eigene booster etc lassen sich über deinen ansatz auch recht einfach nachreichen. Man muss entweder einen verbundenheitsfaktor (zb * 1.5 pro zulauf-verbindung) aufrechnen (exakten wert errechnen / austesten) oder die distanz der angreifer einrechnen (angriffstest mehrfach wiederholen, kann an einer finalen prüfung scheitern -> wenn angreifer bekannt, distanzen mit zuflussstrom verrechnen und gucken, ob der def-score zu hoch werden würde ; Weiteren angreifer mit einfügen)

Danke dir für den ansatz, ich werds direkt mal wieder verfolgen Smile

DAK

BeitragSa, Jan 03, 2015 0:49
Antworten mit Zitat
Benutzer-Profile anzeigen
So Score-basierte Ansätze helfen oft bei KI-Design. Ein komplexer Sachverhalt wird auf eine Zahl reduziert, auf diese Weise brauchst du nur mehr eine Zahl zu vergleichen, statt den ganzen Sachverhalt vergleichen zu müssen.

Was noch eventuell sinnvoll wäre, wäre wenn die KI die gegnerischen Züge miteinberechnet. So kannst du z.B. gegnerische Einheiten, die sich auf ein Planeten hinzubewegen miteinberechnen.

Es sollte eigentlich ziemlich einfach sein eine beinahe perfekte KI zu programmieren. Um diese nicht allzu frustrierend zu machen könntest du den Scores einen Zufallswert hinzuaddieren, der die KI ungenauer macht. Niedrigere Schwierigkeit = höher skalierter Zufallswert.
Gewinner der 6. und der 68. BlitzCodeCompo
 

PhillipK

BeitragSa, Jan 03, 2015 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Die gegnerischen züge wollte ich in einem anderen einsatz mit einbeziehen.

Das ganze sieht vor, ersteinmal alle eigenen planeten (sprich, aus der sicht der ki) in listen zu schmeißen:
1) Hat wenig einheiten (evtl schutz bedarf)
2) Wird angegriffen (evtl einheiten schieben)
3) Hat genug einheiten.


Zuerst wird 2) Ausgewertet - von allen möglichen knoten, vorallem von 3), werden einheiten abgezogen und zum angegriffenen knoten geschickt. Findet sich nicht genug, könnte man eine rettung einbauen - einheiten soweit wie möglich rausräumen, um die verluste kleiner zu halten (diese idee muss noch genauer ausgearbeitet werden, sie kann mitunter zu extrem dummen zügen führen)

Ist für 2) alles abgearbeitet, werden die knoten die aus 3) agiert haben nochmals bewertet. Falls sie nichtmehr "genug" haben ( < 10 oder < maxUnit * 0.5 einheiten), fliegen sie aus der 3) liste.

Ist Später was in 3), findet die angriffsberechnung statt.

Findet sich nichts brauchbares, sprich: Sind am ende noch knoten in 3), so wird versucht, knoten aus 1) aufzufüllen.


Um die KI besiegbarer zu machen, wollte ich ersteinmal die update zeiten verringern. Hatte eigentlich angenommen, das dies ein besserer weg ist (dh sie agiert lahmer und kann deswegen weniger gut auf aktionen reagieren).
Spricht etwas gegen diesen ansatz?
Bei den Zufallswerten erwarte ich ehrlich gesagt eher, das die KI sich selbst zerstört, da sie öfters einheiten zahlen in den "tod" schickt, was ein Spieler wesentlich besser ausgleichen können wird - die KI schwächt sich selbst und der anspruch sinkt.

DAK

BeitragSa, Jan 03, 2015 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem bei konzeptuellen Handicaps (z.B. langsameres Update, Nicht-Reagieren auf bestimmte Situationen, etc.) ist, dass sie der Spieler erkennen und bewusst ausnützen kann. Bei ICE z.B. ist das recht extrem. Da geht's dann nicht mehr darum, dass der Spieler besonders gut ist, sondern nur mehr, dass er die Schwächen der KI findet und ausnutzt. Deswegen nehme ich da lieber eine schlechtere Abschätzung der Situation (= Zufallszahlen bei der Bewertung), da das am Ehesten einem Spieler entspricht.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht Sonstiges Gamedesign

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group