Sehr, sehr, sehr viele autonome KIs, wie?
-
S.T.A.L.K.E.R. schrieb:
Wir reden hier von Spiele-KI und nicht von richtiger KI, oder nicht? Bei Spiele-KIs musst du nur die Illusion von Intelligenz wahren.
Spiele KI, also die muss nur Intelligent wirken. Aber bitte gut wirken, ich hasse die teilweise extrem dumme KI aus gewissen Spielen. Was also bedeutet, dass es schon eine bisschen komplexere KI werden soll.
S.T.A.L.K.E.R. schrieb:
Werd mal ein bischen konkreter, sollen diese tausende KIs alle KI Spieler sein, oder Einheiten die sich in der Welt bewegen, etc.?
Alles KI Spieler, welche über KI Einheiten verfügen, allerdings kann man wohl die KI Einheiten gleich dem KI Spieler zur Kontrolle übergeben. Wobei der normale Spieler natürlich auch KI Einheiten haben soll, aber die machen mir weniger Sorgen.
Also es geht wirklich um Computerspieler, welche ihre Wirtschaft aufbauen müssen und sich für den Krieg vorbereiten sollen oder weil sie vielleicht so friedlich sind auch nicht oder nur defensiv, wie auch immer. Es sollen halt vollwertige KI-Spieler sein.Grüssli
-
Was du vor hast klingt weniger so als ob du wirkliche KI Figuren brauchst. Die KI Soldaten (Fahrzeuge usw, also Units) müssen ansich nicht inteligent sein, sie wiegen ja nur ihre Umgebung ab und entscheiden sich zB auf wen sie schießen. Das einzige das wirklich inteligent sein muß wäre der KI Spieler, er gibt den Einheiten Befehle wo sie hin sollen. Da was Inteligentes zus chreiben ist aber auch nicht so einfach, da kranken viele Spiele dran, er verfügt ansich aber auch nur über Scripts mit ablaufplänen und Abwägungen was sinnvoller wäre, je Komplexer und Detailreicher umso ebsser dürfte er vorrankommen. Das wäre zumindest mein Gedankenansatz.
-
Ich brauche nicht tausende KI Einheiten, sondern tausende KI Spieler. Wie oft soll ich es denn noch hinschreiben? Das Steuern von Einheiten sehe ich nicht als Problem, aber diese Unmengen von vom Computer gesteuerten Spieler.
Ich schreib es zur Sicherheit nochmals fett hin:
Tausende KI-Spieler
Vor allem muss dabei auch der ganze Status mitgespeichert werden. Das sind Unmengen an Daten, welche immer wieder berücksichtig werden müssen.Das ganze kommt nämlich von einem meiner ersten Spiele, damals noch mit VBA und Excel. Dort hatte ich sowas bereits implementiert. Um überhaupt irgendwie mit dieser Unmenge an KI-Spieler klar zu kommen, hatte ich die KI-Spieler immer erst ausgerechnet, wenn der normale Spieler zum ersten Mal mit ihr in Kontakt kam. Das ging gut für die ersten paar KIs, mit der Zeit musste der Computer aber so verdammt viel nachrechnen, dass das Spiel nur noch geladen hat, wenn man eine neue KI entdeckt hat.
Des Weiteren konnte eine entdeckte KI und eine nicht entdeckte KI nicht miteinander interagieren. Das war sehr blöd.Ich würde dieses Spiel halt gerne mal in C++ fertig machen. Dazu muss ich aber ein sinnvolles System finden, wie ich mit diesen Unmengen an KI-Spielern fertig werde. Es ist in meinen Augen ein wahnsinniges zeitliches Problem.
Grüssli
-
sowas in der art haben wir da schon mal besprochen:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-234166.htmlansonsten ist deine frage zu ungenau, die richtige antwort waere
for(size_t i=0;i<KI_ZAHL;i++) KI[i].Think();
-
rapso schrieb:
sowas in der art haben wir da schon mal besprochen:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-234166.htmlDanke für den Thread. Der hat mir nun ein paar Ideen gegeben, welche ich erstmal weiterverfolgen kann.
rapso schrieb:
ansonsten ist deine frage zu ungenau, die richtige antwort waere
for(size_t i=0;i<KI_ZAHL;i++) KI[i].Think();
löl
Mein Problem wäre ja eigentlich, dass diesesThink()
zu viel Zeit verbratet
Aber dank des von dir gelinkten Thread, habe ich nun ein paar gute Ideen aufgeschnappt, welche ich mal weiterverfolgen werde. Ein LOD für eine KI finde ich sehr interessant, aber grundsätzlich kam mir beim Lesen auch ein Eventsystem für die KI in den Sinn. Wenn die KI keine sinnvolle Anzahl Resourcen hat und der direkte Gegner keine Bewegungen vollführt, welche zu einem Handeln auffordern sollte, kann die KI auch bis zum nächsten Logiktick schlafen. Und wenn gewisse Events eintreten, kann man nur anhand der Events die aktuelle Aufgabe der KI einschränken. Wird ganz interessant werden, dies durchzudenkenGrüssli
-
Sorry für den Doppelpost, aber es ist nun schon ein Weilchen her seit dem letzten Post.
Ich war in der Zwischenzeit angenehm warm duschen. Wieso das von Belang ist? Die Dusche ist immer eine Ideenmaschine bei mirOn-Topic:
Ich habe am Eventsystem ein wenig weiterüberlegt und wollte diese Überlegung zur Kommentierung noch hinzufügen oder allenfalls für andere, welche diesen Thread finden.
Grundsätzlich könnte ich im Programm einen zweiten Thread erstellen, welcher einen KI-Tick hat mit einer Auflösung von einer Sekunden (ca. Reaktionszeit eines Menschen). In diesem KI Thread, werden die Verhalten der KIs ausgerechnet und jede KI versendet Events an die Logik. Die Logik selber behandelt die Events, wie Events von einem Spieler. Die Logik verändert die Daten und wenn gewisse Daten gewisse Bedingungen erfüllen, wird ein entsprechendes Signal gesetzt. Da die KI nur Daten liest, dürfte es von der Synchronisation auch nicht all zu viele Probleme geben.
So könnte ich gleichzeitig auch Gebrauch von Multicores machen.Anmerkung: Das ist nur eine Skizze.
@rapso,
Nochmals danke. Der Link hat mein Hirn in Schwung gebrachtGrüssli
-
Dravere schrieb:
Sorry für den Doppelpost, aber es ist nun schon ein Weilchen her seit dem letzten Post.
Ich war in der Zwischenzeit angenehm warm duschen. Wieso das von Belang ist? Die Dusche ist immer eine Ideenmaschine bei mirOn-Topic:
Ich habe am Eventsystem ein wenig weiterüberlegt und wollte diese Überlegung zur Kommentierung noch hinzufügen oder allenfalls für andere, welche diesen Thread finden.
Grundsätzlich könnte ich im Programm einen zweiten Thread erstellen, welcher einen KI-Tick hat mit einer Auflösung von einer Sekunden (ca. Reaktionszeit eines Menschen). In diesem KI Thread, werden die Verhalten der KIs ausgerechnet und jede KI versendet Events an die Logik. Die Logik selber behandelt die Events, wie Events von einem Spieler. Die Logik verändert die Daten und wenn gewisse Daten gewisse Bedingungen erfüllen, wird ein entsprechendes Signal gesetzt. Da die KI nur Daten liest, dürfte es von der Synchronisation auch nicht all zu viele Probleme geben.
So könnte ich gleichzeitig auch Gebrauch von Multicores machen.Anmerkung: Das ist nur eine Skizze.
@rapso,
Nochmals danke. Der Link hat mein Hirn in Schwung gebrachtGrüssli
Definitiv sinnvoll, ein Event-System zur Zusammenschaltung der Subsysteme solltest du sowieso haben und die Logik und die Spieler voneinander trennen, so muss die Logik reale Spieler und KIs nicht getrennt behandeln.
-
Dravere schrieb:
Mein Problem wäre ja eigentlich, dass dieses
Think()
zu viel Zeit verbratetalso ist dein hauptbegehren: optimierung
und das wichtigste bei einer optimierung ist die situation zu kennen. "Kriegsspiel" ist nicht wirklich aussagefaehig, ein RTS oder ein WW2-shooter haben ganz andere KI verlangen und erlauben unterschiedliche optimierungen.Aber dank des von dir gelinkten Thread, habe ich nun ein paar gute Ideen aufgeschnappt, welche ich mal weiterverfolgen werde. Ein LOD für eine KI finde ich sehr interessant, aber grundsätzlich kam mir beim Lesen auch ein Eventsystem für die KI in den Sinn. Wenn die KI keine sinnvolle Anzahl Resourcen hat und der direkte Gegner keine Bewegungen vollführt, welche zu einem Handeln auffordern sollte, kann die KI auch bis zum nächsten Logiktick schlafen. Und wenn gewisse Events eintreten, kann man nur anhand der Events die aktuelle Aufgabe der KI einschränken. Wird ganz interessant werden, dies durchzudenken
sowas macht man oft mit einer statemachine bzw fuzzy logic um die komplikationen von eventsystems aus dem wege zu gehen
-
rapso schrieb:
also ist dein hauptbegehren: optimierung
und das wichtigste bei einer optimierung ist die situation zu kennen. "Kriegsspiel" ist nicht wirklich aussagefaehig, ein RTS oder ein WW2-shooter haben ganz andere KI verlangen und erlauben unterschiedliche optimierungen.Ich habe es auch nicht als "Kriegsspiel" beschrieben, sondern als Wirtschafts- und Kriegssimulation, was wohl sehr auf ein RTS schliessen lässt, nicht? Ein WW2-Shooter würde ich jedenfalls anders beschreiben
Und das RTS wird recht komplex:
- Wirtschaft
-- Bauen
-- Systemwahl (Freie-, Planwirtschaft oder dazwischen)
-- Handel, wie auch Zölle- Forschung
-- Entwicklung eigener Technologien auf Basis einer zahlreichen Kombinationsmöglichkeit.- Politik
-- Allianzen
-- Anträge
-- Systemwahl im eigenen Gebiet
-- Betrug / Intrigen
-- Spionage- Krieg
-- Weltraum
--- Normaler Schiffskampf
--- Stationen
--- Entern
-- Planetenoberfläche
--- Land
--- Luft
--- SeeDas ist schliesslich ein 20 Jahre Projekt
Ne, im ernst, ich möchte jetzt niemand hören, dass ich damit nie fertig werde, ich weiss das. Es ist wirklich ein sehr langfristig ausgelegtes Projekt und wird auch Etappenweise realisiert werden. Womöglich wird es nie fertig werden, aber das ist für mich bei diesem Projekt unwichtig.rapso schrieb:
sowas macht man oft mit einer statemachine bzw fuzzy logic um die komplikationen von eventsystems aus dem wege zu gehen
Naja, grundsätzlich wäre es dort mehr im Sinne gewesen, das ein Signal gesetzt wird. Also könnte man es durchaus als Statemachine betrachten. Ich find die Begriffe sowieso immer alle verwirrend
Grüssli
-
Also die idee hört sich ja wirklich nett an, aber du willst dort wirklich soviele KI Spieler einbauen? Ich mein die meisten Spiele die in dieses Schema passen haben ja meist nur eine recht überschaubare Anzahl von KIs.
-
Xebov schrieb:
Also die idee hört sich ja wirklich nett an, aber du willst dort wirklich soviele KI Spieler einbauen? Ich mein die meisten Spiele die in dieses Schema passen haben ja meist nur eine recht überschaubare Anzahl von KIs.
Ja, will ich. Denn ich will etwas machen, was all die Spiele nicht haben, einen riesigen "Spielraum". Um den sinnvoll zu füllen, will ich möglichst viele Spieler haben.
Die grundsätzliche Idee ist, das Erlebnis von Browsergames und MMORPGs auch einem Singleplayer Spiel näher zu bringen. Eines der grössten Problem eines Singleplayer Spiels ist es, dass es einfach schnell mal vorbei ist, weil man die z.B. maximal 16 Gegner einfach einmal erledigt hat. Wenn du 1000 Gegner hast, wird es womöglich nicht mal dein Ziel sein, alle Gegner zu eliminieren
Ich möchte grundsätzlich ein Spiel machen, wo du nicht mehr immer ein neues Spiel eröffnest, sondern nur einmal eines machst, dieses aber extrem lange dauert. Womöglich wird dein Reich dabei mehrmals untergehen und wieder neu auferstehen. Das ist zumindest die IdeeGrüssli
-
Also... Du willst es als Anreiz geben, tausende von Gegnern zu haben, die auch noch auf ein riesiges Areal verteilt sind?
Klingt Anfangs wie ein Traum, Aber man sollte bedenken:
Ein Spielziel sollte erreichbar sein, sonst ist es sinnlos.Ich würde irgendwann die Motivation verlieren, weil die kleinen Erfolge zwar eintreten, wenn man mal eine Zivilisation auslöscht, aber insgesamt einfach dieses "Yeahhhh Ha" fehlt.
Alles in allem klingt es allerdings recht interessant. Als alleinentwickler nicht schaffbar, aber interessant.Wenn du fertig bist, schafft die Hardware sicher schon die think() Methode.
-
sowas wie GTA3 bzw GTA4, oder FarCry 2?
KIs die nur fuer wirtschaftssimulation da sind, die cheaten meistens, z.b. Civilization
-
Klingt schon sehr Interessant, aber gibt das nicht Probleme mit den Sieg und Verlustbedingungen? Also wenn das eigene Reich unetrgehn und auferstehen kann wäre das Spiel ja im Grunde nicht zu verlieren?
-
gelöscht, wäre schade um den code.
-
@makkurona,
Der Anreiz sind nicht die 1000 Gegner. Die 1000 Gegner sind dazu da, die Ziele des Spielers zu verändern. Den Spielspass auf andere Dinge zu konzentrieren. Das Spielziel ist nicht mehr, das Spiel zu beenden, sondern irgendwelche Etappen zu erreichen. Es geht immer um irgendwelche Etappenziele, welche man sich selber setzen kann.
Die Etappenziele werden deswegen bunt gemacht. Man kann alles probieren zu erreichen und wenn man schon alles erreicht hat, gibt es immer noch mehrEs ist ein Endlosspiel, welches wirklich endlos ist und nie irgendwann der Fall Eintritt, wo die Spielzeit zwar weiterläuft, es aber keine Spielziele mehr gibt.
@rapso,
Ich kenne weder GTA3, GTA4 oder FarCry 2 genau, daher kann ich dir die Frage nur schwer beantworten
*Lieber schon einmal einen Helm anzieht, wenn er jetzt denn gleich geschlagen wird, da er diese Spiele nicht kennt*
Von den Spielen, welche ich kenne, würde ich am ehesten noch einen Vergleich mit dem X-Universe von Egosoft ziehen. Oder vielleicht dem MMORPG Eve-Online. Aber der Spieler soll halt nicht eine einzelne Einheit spielen, sondern ein Reich steuern. Und die Spielwelt sollte daher schon grösser als die des X-Universums sein. Eve-Online Grösse ... vielleicht, das Ding ist inzwischen ja schon recht grossUnd ja, die scheiss KI aus Civilization kenne ich nur zu gut. Was die immer alles weiss und kann. Und woher da manchmal das Geld kommt, ganz seltsame Sache
In der Politik ist sie auch nur schwer zu handhaben. Man kann in einem viel zu geringen Mass mit ihr kommunizieren.@Xebov,
Die Wahrscheinlichkeit für Sieg und Niederlage, bzw. Endsieg und Endniederlage, werden extrem minimiert, so dass sie kaum eintreffen können.
Ich denke der Vergleich mit einem MMORPG ist gar nicht so schlecht. Du wirst nie einen Endsieg oder eine Endniederlage in einem MMORPG erleben, zumindest in vielen nicht. Es geht immer um Zwischenziele, Etappenziele.@volkard,
Oder gleich Boost.Function, Boost.Bind oder Boost.Signals nehmenIch hatte übrigens nicht vor, für jede KI einen Thread zu starten, sondern nur für die KI-Ticks. Ich glaube so viele Threads dürften mit der Zeit dann eher hindern als helfen.
Also ein Thread, welcher dafür sorgt, dass im Durchschnitt jede KI einmal pro Sekunde nachdenkt, sofern sie denn überhaupt etwas überlegen muss.Um das Denken im übrigen noch zusätzlich zu beschleunigen, würde ich gerne die Anzahl der Entscheidungen beschränken oder eine Entscheidung mit einem Kostenpunkt versehen, zum Beispiel einer Zeiteinheit. Eine KI soll also nicht alles was gerade ansteht entscheiden, sondern braucht auf eine gewisse Art und Weise auch seine Zeit für die Entscheidungen.
Mit sowas würde ich gerne verhindern, dass eine KI ein unendlich grosses Reich steuern kann. Eine KI soll unter Umständen auch überfordert sein.Grüssli
-
Dravere schrieb:
@volkard,
Oder gleich Boost.Function, Boost.Bind oder Boost.Signals nehmendu hast die idee keineswegs verstanden.
-
@Dravere
dann schau dir master of orion 2 oder 3 an.
Sins of a Solar Empire soll auch so eine art spiel sein.du solltest dir aber die anderen spiele anschauen, bevor du sagst, dass es sowas nicht gibt und es neu erfinden willst
-
Dravere schrieb:
...tausenden von KIs als Thema haben, wobei jede KI autonom "denken" können muss in einer Wirtschafts- und Kriegssimulation?
Sowieso ein paar weiterführende Gedanken zu Spiele-KIs wären interessant. Also wenn es ein entsprechendes Buch gibt, immer her mit dem Vorschlag.
Grüssli
Es kommt immer darauf an, was du alles simulieren möchtest. Je mehr Eigenschaften dein simuliertes Objekt besitzt, desto höher die Komplexität der Berechnungen und das nicht immer linear. Weiterhin können auch Line-Of-Sight Berechnungen ein System schnell in die Knie zwingen.
Zum Thema KI: Eine KI ist so schlau, wie sie ihr Programmierer macht und oft kann sie auf Spiel-Daten zugreifen, die dem menschlichen Spieler nicht zur Verfügung stehen. Somit kann sie dann einige Ihrer Schwächen ausgleichen.
Falls du Interesse hast an einem Projekt zu arbeiten, das genau in die Richtung geht, meld dich einfach ...
Greetz
-
@volkard,
DeinMessage2
war nichts anderes als einboost::function0
kombiniert mit einemboost::bind(&function, value1, value2)
. Mit Boost.Signals kann man dann sogar mehrere Funktionen gleichzeitig registrieren. Dann die Signals in eine Priority Queue und man hat den genau gleichen Effekt, wie der, welcher du gezeigt hast. Nur hat man allenfalls noch mehr Möglichkeiten, da man über Boost.Bind nicht nur Funktionen mit zwei gebundenen Werten verschicken kann, was du womöglich mit deinem MessageBase dann gemacht hast. Allerdings hast du den Code nicht gezeigt, daher kann ich da nur raten. Es wäre aber irgendwie logisch.@rapso,
Wie soll man denn alle Spiele der Welt kennen? Mir ist jedenfalls noch nie so ein Spiel vor die Augen gehopst.
Und ich habe mir gerade "Master Of Orion" angeschaut. Das scheint mir eher ein Civilisation im Weltraum zu sein. Ziel des Spiel ist es unteranderem das auslöschen aller Gegner. Also hat es eine begrenzte Anzahl an Gegner. Nicht wirklich das, was ich möchte. Zudem ist es Rundenbasiert. Ich möchte aber Echtzeit haben. Ob die Komplexität an meine Idee rankommt, ist schwer zu beurteilen. Da müsste man es wohl zuerst mal spielen.
"Sins of a Solar Empire" verfehlt meine Ansprüche auch völlig. Es hat auch nur begrenzete Anzahl an Gegner. Ein Universum von 30 - 100 Planeten, wie mikrig. Zudem scheint es mir bei dem Spiel in erster Linie um den Kampf zu gehen. Ist eher ein Spiel von überlebe, kämpfe und zerstöre -> Siege über all deine Gegner. Mein Ziel ist es aber gerade, dass man nicht alle Gegner besiegt, womöglich sich ernsthaft überlegt, bis in alle Ewigkeiten mit einem Gegner zusammen zu leben. Eine friedliche stabile Allianz.Deshalb sollte ich vielleicht aufhören von Gegnern zu reden und eher das KI-Spieler verwenden
@nurf,
Welche Richtung denn? Bisher habe ich das Gefühl, konnte ich mich noch nicht verständlich genug ausdrücken, dass mich irgendwer verstanden hat
Bin wohl zu blöd um die Idee zu übermittelnZudem weiss ich nicht, ob ich die benötigte Zeit habe. Dieses Projekt soll ein völliges Nebenprojekt werden. So im Sinne, wenn ich grad keine Luste am aktuellen Projekt habe, kann ich mal wieder an diesem hier ein wenig weiterentwickeln. Es soll halt eine Art "Ausgleichprojekt" werden. Deswegen wird es wohl auch so komplex, damit ich immer an ganz unterschiedlichen Stellen arbeiten kann.
Grüssli