Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
Delphi 2005 Personal
|
Re: "ki" für 4-gewinnt
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
|