Einzelnen Beitrag anzeigen

ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#2

Re: "ki" für 4-gewinnt

  Alt 5. Mär 2006, 20:21
ich hab mal eine reine Probier-KI geschrieben, eine rekursive Funktion (für Reversi). sie geht jede Möglichkeit durch, wobei siei beliebig weit vorrausdenken kann:
Delphi-Quellcode:
function ki(spielfeld:tspielfeld;spieler:tinhalt;count:integer):tpoint;
var
  list:tpointarray;
  listpunkte:array of integer;
  i,j,bigestindex:integer;
  virt:tspielfeld;
begin
  setlength(list,0);
  for i:=0 to length(spielfeld)-1 do
    for j:=0 to length(spielfeld[i])-1 do begin
      copyspielfelddata(spielfeld,virt);
      if vollstreckezug(virt,spieler,point(i,j)) then begin
        setlength(list,length(list)+1);
        list[length(list)-1]:=point(i,j);
      end;
    end;
  setlength(listpunkte,length(list));
  for i:=0 to length(list)-1 do begin
    copyspielfelddata(spielfeld,virt);
    vollstreckezug(virt,spieler,list[i]);
    for j:=count-1 downto 0 do begin
      vollstreckezug(virt,gegner(spieler),ki(virt,gegner(spieler),j));
      vollstreckezug(virt,spieler,ki(virt,spieler,j));
    end;
    listpunkte[i]:=spieleritemscount(spieler,virt)-spieleritemscount(gegner(spieler),virt);
    setlength(virt,0);
  end;
  groesstes(listpunkte,bigestindex);
  try
    result:=list[bigestindex]
  except
    result:=point(0,0);
  end;
end;
mal als Pseudocode ohne Bezug auf Reversi:

Code:
function ki(spielfeld auf dem die ki arbeiten soll,spieler für den sie das ergebniss bestimmen soll,anzahl wiederholungen) gibt die reihe an, in die der Stein geworfen wird

var
  virtuelles spielfeld auf dem simuliert wird
  liste aller zugmöglichkeiten
  liste der Bewertung aller zugmöglichkeiten
begin
  alle möglichen zugmöglichkeiten in liste speichern;
  für jedes Listenelement wiederholen:
  begin
    für anzahl der wiederholungen (in funktionsparametern) wiederholen:
    begin
      berechnen was der gegner jetzt (aller wahrscheinlichkeit nach) tun wird, und zwar mit der ki-funktion (-> rekursiv) ABER mit einer wiederholung weniger im parameter, da sonst Endlosschleife
      berechnen was der computer jetzt tun wird, auch mit einer wiederholung weniger als parameter
    end;
    punkte für die liste gemäß dem Endstatus des virtuellen spielfelds vergeben (gewonnen, verloren, 3 nebeneinander etc.)
  end;
  listenelement mit der besten Bewertung als result zurückgeben
end;
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat