Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   4-Gewinnt-KI: Wie Züge "vorrausberechnen"? (https://www.delphipraxis.net/42285-4-gewinnt-ki-wie-zuege-vorrausberechnen.html)

malo 16. Mär 2005 20:36


4-Gewinnt-KI: Wie Züge "vorrausberechnen"?
 
Hat jemand eine Idee (bzw. einen Ansatz), wie man eine "vernünftige" 4-Gewinnt-KI erstellen kann? Also im Moment lehne ich will ich mich ein wenig an bisherige 4-Gewinnt-KIs anschließen, die einfach die möglichen Züge "vorrausberechnen". Nur hat jemand eine Idee, wie man sowas hinkriegen kann (nur vom Aufbau her)? :gruebel:

freak4fun 16. Mär 2005 20:47

Re: 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?
 
Wenn du ein Koordinatensystem hast, musst du halt prüfen, ob wenn man an einer Stelle einen Chip einwirft eine Viererkette entsteht. Einmalfür die KI um eine Viererkette erstellen zu können und einmal beim Spieler, um diese zu verhindern. Aber wie man das jetzt effizient prüft weiß ich auch nicht. Sorry.

MfG
freak

atreju2oo0 16. Mär 2005 20:58

Re: 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?
 
Bei 4 gewinnt ist das relativ einfach...

Du schreibst einfach eine rekursive Funktion :

Delphi-Quellcode:
function Zug(Tiefe,Zug:integer;Spielfeld:TFeld):integer;
begin
  Spielfeld:=Steinhinzu(zug,Spielfeld);
  if Tiefe>0 then
   begin
     result:=Zug(tiefe-1,0,Spielfeld);
     if Zug(tiefe-1,1,Spielfeld)> result then result:=Zug(tiefe-1,1,Spielfeld);
     if Zug(tiefe-1,2,Spielfeld)> result then result:=Zug(tiefe-1,2,Spielfeld);
     if Zug(tiefe-1,3,Spielfeld)> result then result:=Zug(tiefe-1,3,Spielfeld);
     if Zug(tiefe-1,4,Spielfeld)> result then result:=Zug(tiefe-1,4,Spielfeld);
     if Zug(tiefe-1,5,Spielfeld)> result then result:=Zug(tiefe-1,5,Spielfeld);
     if Zug(tiefe-1,6,Spielfeld)> result then result:=Zug(tiefe-1,6,Spielfeld);

      //  Stellt sicher, dass nur das beste Ergebniss zurückkommt.
     
   end
  else result:=Ergebnissbewerten;

end;

Für die Funktion muss man jetzt noch die Proceduren schreiben wie ein Stein hinzugefügt wird(Steinhinzu)
und wie man die aktuelle Position bewertet(Ergebnissbewerten).
Bei der bewertung muss jede unmögliche Position der Steine (zum Beispiel der Gegner kriegt danach 4 in eine Reihe)
mit 0 bewerten.
Weiterhin ist bei der Zugprogrammierung zu beachten das sich ja zwei Spieler abwechseln, also erst rot und dann weiß zieht!
Aber ein bisschen selber nachdenken willste ja bestimmt eh ;o)

dizzy 16. Mär 2005 21:43

Re: 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?
 
Alle Züge vorausberechnen wird nix: http://www.delphipraxis.net/internal...=287494#287494

Das Mittel der Wahl: A*-Algo, oder auch Alpha-Beta-Pruning mit Teilbäumen. Mal Onkel Google anschmeissen ;)

atreju2oo0 16. Mär 2005 22:11

Re: 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?
 
Ich will ja auch nciht alle berechnen sondern nur so viel Ebenen wie Tiefe am Anfang vorgibt.
Ist also so ziemlich das gleiche wie Du in dem Thread vorschlägst Dizzy... ;)
Außerdem kann man bei bestimmten Bewertungen ja auch die Rekursion abbrechen..

malo 17. Mär 2005 06:15

Re: 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?
 
So, ein paar Erklärungen:

1. Ich hab bereits das Spiel soweit voran, dass man zu zweit an einem PC spielen kann, und auch gewinnen kann.

2. Ich will nicht alle Züte vorrausberechnen (das sind ja fast unendlich...)

3. Ich hab ein Koordinatensystem (2 dimensionales Array of integer. Den Feldern geb ich die Werte "0", "1" und "2").

4. @atreju2oo0: Danke, ich versuch demnächst mal den Code ein wenig zu konvertieren und zu testen... :)

malo 17. Mär 2005 12:28

Re: 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?
 
@atreju2oo0: Deinen ganzen Code kapier ich grad nicht wirklich... also ich versteh jetzt nicht, wie das vom Aufbau dann sein sollte. Ich hab als Spielfeld ein 2-dimensionales Array genommen, in das ich immer "0", "1" oder "2" reinschreibe (0 bedeutet nichts drin, 1 bedeutet roter Stein drin, 2 bedeutet gelber Stein).

Bei meiner "SetStone"-Procedure geb ich nur die Spalte als Parameter mit. Die Reihe hab ich global nochmal in einem Array[1..7] gespeichert. Der Wert des jeweiligen Array-Feldes wird dann immer erhöht, sodass jederzeit aufrufbar ist, wo schon wieviele Steine liegen ;)
Dann setze ich dort immer "darüber" einen Stein. Deshalb ist die portierung grade nicht gerade einfach, finde ich...

Ich verstehe zum Beispiel nicht, was dein Parameter "Spielfeld" soll. Wofür steht der, bzw. was hat der für eine Aufgabe?

Dann diese Zeile:
Delphi-Quellcode:
Spielfeld:=Steinhinzu(zug,Spielfeld);
Ich dachte, SteinHinzu soll eine Prozedur sein. In diesem Beispiel ist es jedoch plötzlich eine Funktion :gruebel:

Außerdem versteh ich nicht wirklich, wie die Funktion "ErgebnisBewerten" aussehen soll :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz