Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#53

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 19:57
@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
  Mit Zitat antworten Zitat