@StefanDP:
Ich habe mal deinen Source umgestellt:
Delphi-Quellcode:
function TFourInARow.Gewonnen(Spieler: Cardinal): Boolean;
function IstFeld(C, R: Cardinal; Spieler: Cardinal): Boolean;
begin
Result := (C < COLUMNS) and (R < ROWS) and (Field[C, R] = Spieler);
end;
var
C,R,M,N: Integer;
begin
Result := False;
C := Letzter_X;
R := Letzter_Y;
for M := -1 to 1 do
for N := -1 to 1 do
if (M <> 0) or (N <> 0) then
if IstFeld(C + M, R + N, Spieler) and
IstFeld(C + 2 * M, R + 2 * N, Spieler) and
(IstFeld(C + 3 * M, R + 3 * N, Spieler) or
IstFeld(C - M, R - N, Spieler)) then
Result := True;
end;
Was mir auffält ist:
1.) IstFeld hat als Übergabeparameter Cardnial und bekommt Integer aus den Schleifen übergeben die -1, -2, -3 sein könnten. Nungut Integer(-1) == Cardinal($100000000 -1) == $FFFFFFFFFF somit dürftest du in der IstFeld-Überprüfung durch einen SEITENEFFEKT des Compilers keine Fehler bekommen. Guter Stil ist das aber nicht.
2.) In den Schleifen überprüfst du IMMER alle möglichen Kombinationen, selbst wenn zB. Result == True ist. Du solltest ein EXIT nach den Result := True machen.
Sollte also so aussehen:
Delphi-Quellcode:
function TFourInARow.Gewonnen(Spieler: Cardinal): Boolean;
function IstFeld(C, R: Integer; Spieler: Cardinal): Boolean;
begin
Result := (C >= 0) and (C < COLUMNS) and (R >= 0) and (R < ROWS) and (Field[C, R] = Spieler);
end;
var
C,R,M,N: Integer;
begin
C := Letzter_X;
R := Letzter_Y;
for M := -1 to 1 do
for N := -1 to 1 do
if (M <> 0) or (N <> 0) then
if IstFeld(C + M, R + N, Spieler) and
IstFeld(C + 2 * M, R + 2 * N, Spieler) and
(IstFeld(C + 3 * M, R + 3 * N, Spieler) or
IstFeld(C - M, R - N, Spieler)) then
begin
Result := True;
Exit;
end;
Result := False;
end;
Gruß Hagen