Delphi-PRAXiS
Seite 6 von 7   « Erste     456 7      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sieger-Prüfung "Vier gewinnt" (https://www.delphipraxis.net/24941-sieger-pruefung-vier-gewinnt.html)

StefanDP 29. Jun 2004 18:19

Re: Sieger-Prüfung "Vier gewinnt"
 
Zitat:

Zitat von Ultimator
Zitat:

tritt nur in 2 verschiedenen Varianten ein
Und was ist dann mit ##O## ?
das müsste doch dann ein 3. Fall sein, nicht? :gruebel:

nein, funzt auch
weil da ja #0## oder gespiegelt ##0# drinsteckt!

glkgereon 29. Jun 2004 18:39

Re: Sieger-Prüfung "Vier gewinnt"
 
nee, noch
ma zu meinem code

was hagen gesagt hat ist QUATSCH!!!!!

ich sage nämlich NICHT
Delphi-Quellcode:
if anzahl=4 then gewonnen:=true
else gewonnen:=false;
SONDERN

Delphi-Quellcode:
if anzahl=4 then gewonnen:=true;
ERST LESEN :warn: :warn: :warn:

negaH 29. Jun 2004 18:57

Re: Sieger-Prüfung "Vier gewinnt"
 
@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

negaH 29. Jun 2004 19:03

Re: Sieger-Prüfung "Vier gewinnt"
 
Ok,

glkgereon 29. Jun 2004 19:06

Re: Sieger-Prüfung "Vier gewinnt"
 
nein, die schleife bricht ab, wenn anzahl 4 erreicht hat!!!

Zitat:

while (i<y+5) and (anzahl<4) do begin
anzahl wird im durchlauf auf 4 gesetzt, und die schleife bricht ab!!!

:-D :-D *leicht überhebliches grinsen* :-D :-D

arnoldo 29. Jun 2004 22:22

Re: Sieger-Prüfung "Vier gewinnt"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich würde erstmal einen Ein-Dimensionalen Array anlegen. D.h. das Zeile für Zeile nacheinander gespeichert und durch z.B. eine 0 getrennt wird (wichtig für die Erkennung, ob Rand des Spielfeldes erreicht ist). Dann kann man recht einfach prüfen ob gewonnen wurde, z.B. Bei einem 5x5 grossen Spielfeld die diagonale Prüfung:
-> Wenn Feld[Pos]+Feld[Pos+6]+Feld[Pos+12]+Feld[Pos+18] = 4 Gewonnen!

Code:
var Field: Array[0..63] of Byte;

...

function Test4win(Player, X, Y: Byte): Boolean;

 Function RevTest(Player, Pos, Step: Integer): Byte;
 Begin
  If (Field[Pos]=Player) Then RevTest:=RevTest(Player, Pos+Step, Step)+1
                         Else RevTest:=0;
 End;

Begin
 If (RevTest(Player, Y*8+X, 1) + RevTest(Player, Y*8+X, -1) -1>= 4) or
    (RevTest(Player, Y*8+X, 8) + RevTest(Player, Y*8+X, -8) -1>= 4) or
    (RevTest(Player, Y*8+X, 7) + RevTest(Player, Y*8+X, -7) -1>= 4) or
    (RevTest(Player, Y*8+X, 9) + RevTest(Player, Y*8+X, -9) -1>= 4) Then Test4win:=true
                                                                    Else Test4win:=false;
End;

Nicodius 30. Jun 2004 05:21

Re: Sieger-Prüfung "Vier gewinnt"
 
ich würde mal frech gesagt ... das spiel "stoppen" könnnen so das man nicht weiterspielen kann ;)

der code dafür( ;) )

...

Delphi-Quellcode:
var b : boolean = false;

// in der gewinnprocedure
b := true;

// in der setzprocedure
if b = false then
begin

// in der neues spiel procedure
b := false;

... hoffe geholfen zu haben :P

Sanchez 30. Jun 2004 06:42

Re: Sieger-Prüfung "Vier gewinnt"
 
@Nicodius: :gruebel: häh, wie willst du den damit auf die Siegesbedingung stoßen???

Luckie 30. Jun 2004 11:10

Re: Sieger-Prüfung "Vier gewinnt"
 
Er meint, dass man bei mir weiterspielen kann, wenn schon jemand gewonnen hat.

aber glaub mir Nicodius, das würde ich noch alleine hinbekommen. ;)

Nicodius 30. Jun 2004 13:09

Re: Sieger-Prüfung "Vier gewinnt"
 
hehehe .... *nixmehrsag*


dann machs ;) ich hab dir eh schon den code gegeben ;)


... war ja ein scherz


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 Uhr.
Seite 6 von 7   « Erste     456 7      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz