![]() |
Re: Sieger-Prüfung "Vier gewinnt"
Zitat:
weil da ja #0## oder gespiegelt ##0# drinsteckt! |
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:
SONDERN
if anzahl=4 then gewonnen:=true
else gewonnen:=false;
Delphi-Quellcode:
ERST LESEN :warn: :warn: :warn:
if anzahl=4 then gewonnen:=true;
|
Re: Sieger-Prüfung "Vier gewinnt"
@StefanDP:
Ich habe mal deinen Source umgestellt:
Delphi-Quellcode:
Was mir auffält ist: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; 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:
Gruß Hagenfunction 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; |
Re: Sieger-Prüfung "Vier gewinnt"
Ok,
|
Re: Sieger-Prüfung "Vier gewinnt"
nein, die schleife bricht ab, wenn anzahl 4 erreicht hat!!!
Zitat:
:-D :-D *leicht überhebliches grinsen* :-D :-D |
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; |
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 |
Re: Sieger-Prüfung "Vier gewinnt"
@Nicodius: :gruebel: häh, wie willst du den damit auf die Siegesbedingung stoßen???
|
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. ;) |
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 23:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz