AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sieger-Prüfung "Vier gewinnt"

Ein Thema von Luckie · begonnen am 28. Jun 2004 · letzter Beitrag vom 30. Jun 2004
Antwort Antwort
Seite 6 von 7   « Erste     456 7      
StefanDP

Registriert seit: 11. Apr 2004
294 Beiträge
 
#51

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 19:19
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?
nein, funzt auch
weil da ja #0## oder gespiegelt ##0# drinsteckt!
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#52

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 19:39
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

if anzahl=4 then gewonnen:=true; ERST LESEN
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
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
Benutzerbild von negaH
negaH

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

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 20:03
Ok,
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#55

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 20:06
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!!!

*leicht überhebliches grinsen*
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
arnoldo

Registriert seit: 8. Dez 2002
Ort: Berlin
131 Beiträge
 
Delphi 7 Personal
 
#56

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 23:22
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;
Angehängte Dateien
Dateityp: zip 4gewinnt.zip (3,5 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Nicodius

Registriert seit: 25. Apr 2003
Ort: Graz
2.234 Beiträge
 
Delphi 2006 Architect
 
#57

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 30. Jun 2004, 06:21
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
Nico Müller
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#58

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 30. Jun 2004, 07:42
@Nicodius: häh, wie willst du den damit auf die Siegesbedingung stoßen???
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#59

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 30. Jun 2004, 12:10
Er meint, dass man bei mir weiterspielen kann, wenn schon jemand gewonnen hat.

aber glaub mir Nicodius, das würde ich noch alleine hinbekommen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Nicodius

Registriert seit: 25. Apr 2003
Ort: Graz
2.234 Beiträge
 
Delphi 2006 Architect
 
#60

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 30. Jun 2004, 14:09
hehehe .... *nixmehrsag*


dann machs ich hab dir eh schon den code gegeben


... war ja ein scherz
Nico Müller
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 7   « Erste     456 7      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 Uhr.
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