Man benötigt eine explizite 'Gewinn'-Funktion nur selten, da sich der Gewinnn i.A. aus der Stellungsbewertung ergibt. Ein Parameter wäre die Anzahl der ununterbrochenen Reihen einer Farbe. Die folgene Routine berechnet
für beide Spieler die Anzahl
aller durchgehenden Reihen. Dabei wird jede Reihe mehrfach gezählt, was zum Schluss wieder kompensiert wird.
Nach dem Durchlauf fragt man einfach 'Result[ActivePlayer,4]' ab, wenn 4 Steine zum gewinnen reichen. Die Funktion eignet sich auch für Go-Bang/Gomoku und Tic-Tac-Toe (wofür sie etwas überdimensioniert ist).
Delphi-Quellcode:
Type
TBoard = Array [0..N-1, 0..N-1] Of TPlayer;
TRowCountResultArray [TPlayer, 1..N-1] Of Integer;
Procedure CountAllRows (Board :TBoard; Var Results : TRowCountResultArray);
Var
i,j,d : Integer;
c : TPlayer;
Procedure _Count(i0, j0, di, dj : Integer);
Var
r, d, i, j : Integer;
c : TPlayer;
Begin
r := 1;
c := Board[i0,j0];
For d:=0 to 1 do Begin // in beide Richtungen (di,dj und -di, -dj) gehen
i := i0 + di;
j := j0 + dj;
While (i in [0..N-1]) and (j in [0..N-1]) and (Board[i,j] = c) do Begin
inc(r);
inc(i, di);
inc(j, dj);
End;
di := -di;
dj := -dj;
End;
Inc(Results[c,r]);
End;
Begin
FillChar (Results, SizeOf(Results),0);
For i:=0 to N-1 do
For j:=0 to N-1 do
For d:=0 to 2 do
_Count(i,j,-1, 2*d-1);
// Jede 2er Reihe wird 2x gefunden, jede 3er Reihe usw.
For c:=Low(TPlayer) To High (TPlayer) Do
For i:=1 to N-1 do
Results[c,i] := Results[c,i] div i;
End;
getippt und nicht getestet.