Du bist nicht angemeldet.

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

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

31

29.05.2012, 13:26

Also es braucht jetzt keiner mehr über meinen Code gucken, da er jetzt 100%ig funktioniert.
Fände es zwar trotzdem gut, wenn jemand mal nach der Geschwindigkeit des Codes guckt, aber
wenn ja niemand dazu Zeit hat... :P

Also ich bin jetzt dran den Minimax-Algorithmus auf mein GLTron-Spiel zu übertragen, was mir bis jetzt noch sehr schwer fällt!
Habe den Entwickler von GLTron mal angeschrieben und er hat mir hier den Code davon gezeigt.
Jetzt ist es aber so, dass ich davon nicht viel nachvpllziehen kann, da es ja doch schon recht komplex und relativ wenig kommentiert ist, bzw eine Doku fehlt :(
Das haupte zum zum Thema KI steht in den Funtktionen doComputeSimple () und doComputeActive().
So viel ei ich eskenne, hat er es da nicht mit einem bestimmten Algorithmus gemacht, sondern einfach nur per "Abfrage" und Zeitverhältnisen.

So könntet ihr mir vll helfen, das jetzt zu übertragen?
zur Hilfe habe ich hier noch ein Bild, wie das Spiel ja sehr wahrscheinlich im verlaufe des Spiels aussehen könnte und design von einem Schachbrett:

(Link)


Ich denke, ich brauche dabei mehr Hilfe von euch, da dies ja auch ein Spiel mit 4 Personen ist und nicht nur mit 2.
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

32

29.05.2012, 15:44

Den Algorithmus kannst du eigentlich fast gleich Übertragen. Ein Schritt ist jetzt einfach eine Bewegung die du auf dem Raster durchführst. Geändert werden muss nur die Bewertungsfunktion und dafür wurde ja schon ein gutes Beispiel genannt. Versuch das doch vielleicht erst mal.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

33

31.05.2012, 16:07

Jo so wie Schorsch es gesagt hat, siehts aus. Der Minimax-Algorithmus ist bei jedem Spiel oder was auch immer derselbe. Ändern tut sich je nach Spiel nur die Ratingfunktion und das ist auch der Ort, wo die Erfahrung und das Wissen über die Strategien des Spiels einfließen. TicTacToe hingegen ist so ein kleines Spiel, dass man es tatsächlich bis Gewinn/Verlust/Remis durchrechnen kann, aber auch hier ist der Minimaxalgorithmus der selbe. Wenn es für TicTacToe klappt, kannst du es gleich auf Tron übertragen.

Edit: Ach so und noch ne Sache: Ich hab natürlich auch keine Lust, den ganzen Code von dem Typen durchzusehen, aber du hattest ja mal Bedenken, das Ganze zu diskretisieren - das hat der Entwickler aber offenbar auch gemacht, wenn ich dieses Stück Code richtig verstehe:

C-/C++-Quelltext

1
2
3
  /* avoid too short turns */
  if(game2->time.current - ai->lasttime < ai_params.minTurnTime[level])
    return;

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Informagic« (31.05.2012, 16:19)


ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

34

31.05.2012, 17:32

@Informagic: Was willst du mir damit sagen bzw. was meinst du in diesem Zusammenhang mit "diskretieren"?

Also ich hab nochmal nachgedacht.
Ich würde den Minimax wirklich gern benutzen, da ich ja auch froh bin, dass ich ihn überhaupt hinbekommen hab, aber
ich hab echte Zweifel, ob er perfomant genug ist.
Außerdem hab ich noch so meine Probleme, ihn bzw. seine Funktion für mein GLtron zu erstellen.

Ich sag mal kurz, wie ich dabei vorgehen würde.

Ich würde ja zuerst einmal das Raster einstellen.
Dann die Position von jedem Spieler einschließlich den nicht vom Computer gesteuerten Spielern in das Raster eintragen.
Dann würde ich ihn der in jedem Bild testen, ob sich ein Spieler nicht mehr in dem Feld befindet, in dem is bisher gestanden hat.
Falls das der Fall ist bei den nicht Computer gesteuerten Spieler, würde ich nur im dem Hauptraster vermerken, dass jetzt das Feld aus diesem Spieler
"gehört"; falls es ein Comuter Gegner ist, würde ich dann den Algorithmus ausprobieren.

Dazu müsste ich zuerst den Mainnode und dann die anderen Erstellen usw.
dann die Bewerten-Funktion für die Endknoten ausfrufen und dann den Minimax-Algorithmus, mit dem ich dann den besten Zug ermittele.
Das müsste ich ja dann auch für alle 3 bzw. wie viele auch immer Com-Gegner machen.

Theoretisch müsste es das schon sein.

Die Schwierigkeiten dabei sind jetzt nur:
1. Ich darf nicht in jedem Node den ich erstelle immer Links, Rechts, Geraderaus fahren lassen, da sonst ja die Fahrweise viel zu unecht ist und
so dann er algorithmus nichts bringt.
2. Außerdem hab ich ja auch eine gewisse Animation, wenn ein Tron abbiegt, also dass es so in die Richtung schwängt.
Währenddessen darf es ja dann nicht seine Position ändern; nur damit ihr es versteht, ein Drehvorgang sollte z.b. 5 Einheiten nach Vorne und dann 7 Einheiten in die reweilige richtung sein, so dass
ich das Tronmodel in der Zeit drehe, um eine Schöne "Animation" hinzubekommen.

Das wären jetzt so sachen, die mir spontan einfallen, die es sehr erschweren würden.

So weit, wie ich das aus dem Code rauslese, macht er die Gegner ja nicht mit irendeinem Algorithmus, sondern testet ja, ob er in der nächsten zeit mit jemandem zusammenstößt
oder jemand mit ihm und erreicht dann so ein gutes Fahrverhalten!

Und ich will nochmal sagen, dass ich es echt super finde, dass ihr mich dabei so unterstützt, auch wenn ich oft sehr-ich will nicht sagen-pessimistisch bin!
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

FreezingEngine

Treue Seele

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

35

31.05.2012, 18:15

Wo wir schon beim Thema K.I. sind, ab wann ist für euch denn eine K.I. eine K.I. und nicht ein vordefiniertes verhalten?
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

36

31.05.2012, 18:42

Ich würde sagen, wenn sie in ihrer Entscheidung äußere Einflüsse berücksichtigt und darauf dann reagiert.
Ich denk, man kann nit sagen, wenn sie zb fünf Einflüsse hat, ist sie eine und wenn sie nur drei hat, keine.
Das kommt immer drauf an..
Ich denk dass is hier wie bei vielen, Eigendefinition.
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ProAmateur« (31.05.2012, 21:23)


ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

37

01.06.2012, 13:19

Ich denke da gibt es auch noch wissenschaftlichere Definitionen als meine eben :D
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

38

01.06.2012, 16:19

Mit "diskretisieren" meinte ich, das ganze diskret zu gestalten und diskret ist das Gegenteil von kontinuierlich. Als Beispiel: Die Menge der reellen Zahlen ist kontinuierlich, da es zwischen zwei verschiedenen Zahlen immer eine dritte gibt, die Menge der natürlichen Zahlen ist hingegen diskret, da es nur "bestimmte" Zahlen gibt, also nur bestimmte Punkte auf dem Zahlenstrahl. (Ich hoffe, ich habe jetzt nichts falsches gesagt, ich bin noch kein Mathematikstudent :) Aber man weiß, was gemeint ist.)
Auf dein Beispiel bezogen: Diskret bedeutet, dass du ein Gitter hast, also eine endliche Zahl an Stufen/Schritten, die zu berechnen sind und nicht irgendwann im Zeitkontinuum abbiegen kannst.

Ansonsten sieht deine Vorhergehensweise doch ganz logisch aus. Das erste Problem verstehe ich ehrlich gesagt nicht, oder ich wüsste nicht, wo das Problem liegen soll. Man kann doch merken, dass es eine KI ist. Ich fände es sogar recht interessant, wenn die KI im Vergleich zum Menschen "ungewöhnliche" Touren fährt.
Und zum zweiten Problem: Das ist eigentlich gar kein Problem! Wähle einfach den Abstand der Rasterpunkte genau so groß, wie du Zeit/Weg brauchst, um einmal Abbiegen hinzubekommen. Ehrlich gesagt würde ich dir aber auch gar nicht empfehlen, richtige Kurven zu machen, da das dann mit dem Raster nicht mehr so richtig hinhaut und auch die Kollisionsprüfung kompliziert wird. Aber wenn du das hinbekommst..

Probier es doch jetzt einfach mal aus. Wenn du Probleme mit der Performance bekommst, dann kannst du immer noch Alpha-Beta-Pruning implementieren.

@FreezingEngine: Definiere "KI" und "vordefiniertes Verhalten".

Werbeanzeige