AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?
Thema durchsuchen
Ansicht
Themen-Optionen

4-Gewinnt-KI: Wie Züge "vorrausberechnen"?

Ein Thema von malo · begonnen am 16. Mär 2005 · letzter Beitrag vom 17. Mär 2005
Antwort Antwort
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#1

4-Gewinnt-KI: Wie Züge "vorrausberechnen"?

  Alt 16. Mär 2005, 20:36
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)?
  Mit Zitat antworten Zitat
Benutzerbild von freak4fun
freak4fun

Registriert seit: 22. Sep 2004
Ort: Hannover
1.807 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

Re: 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?

  Alt 16. Mär 2005, 20:47
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
Christian
IT: Schließen Sie bitte das Fenster. User: Die Tür auch?
i++; // zaehler i um 1 erhoehen
  Mit Zitat antworten Zitat
Benutzerbild von atreju2oo0
atreju2oo0

Registriert seit: 5. Dez 2003
Ort: Berlin
289 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?

  Alt 16. Mär 2005, 20:58
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)
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?

  Alt 16. Mär 2005, 21:43
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von atreju2oo0
atreju2oo0

Registriert seit: 5. Dez 2003
Ort: Berlin
289 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?

  Alt 16. Mär 2005, 22:11
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..
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#6

Re: 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?

  Alt 17. Mär 2005, 06:15
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...
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#7

Re: 4-Gewinnt-KI: Wie Züge "vorrausberechnen"?

  Alt 17. Mär 2005, 12:28
@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: Spielfeld:=Steinhinzu(zug,Spielfeld); Ich dachte, SteinHinzu soll eine Prozedur sein. In diesem Beispiel ist es jedoch plötzlich eine Funktion

Außerdem versteh ich nicht wirklich, wie die Funktion "ErgebnisBewerten" aussehen soll
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 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