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 3 von 7     123 45     Letzte »    
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#21

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 01:08
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#22

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 01:08
Zitat von Luckie:
Hm, w3seeks Code kompiliert, tut nur nicht das, was ich will.
was meinst du?
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#23

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 01:15
ich schaetze mal es geht nicht weil du in deinem array cardinals verwendet hast....
dann musst du natuerlich die typen korrigieren in der diagonal-test-funktion:
Code:
Anfang, Pos, Ende: PCardinal;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 01:15
So, habe es jetzt entsprechen angepasst. Nur bei den Diagonalen haut es nicht ganz hin, die findet er noch nicht.
Angehängte Dateien
Dateityp: zip viergewinnt_753.zip (3,6 KB, 8x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#25

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 01:17
siehe post ueber deinem
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 01:20
Nein das war es auch nicht, aber ich verstehe deinen Trick bei den Diagonalen auch nicht. Wenn du das noch etwas kommentieren könntest bitte.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#27

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 01:21
Delphi-Quellcode:
  function CheckDiagonal: Boolean;
  var
    i, k, c, r: Integer;
  begin
    c := -2;
    for i := 0 to 6 do
    begin
      cnt := 0;
      c := i-2;
      r := 0;
      for k := 0 to 6 do
      begin
        if (i in [0..COLUMNS-1]) and (k in [0..ROWS-1]) then
        begin
          if Field[c, r] <> 1 then cnt := 0
          else inc(cnt);
          if cnt = 4 then
          begin
            result := true;
            exit;
          end; // if cnt=4
        end; // if (i in ...
        inc(c);
        inc(r);
      end; // for k...
    end; // for i...
    result := false;
  end; // CheckDiagonal
völlig ungetestet!


\\edit: Die beiden 6en in den Schleifen kommen so zu Stande: 6 ist die maximale Länge einer Diagonalen in einem 7x6-Feld, und zufällig sind auch 6 Diagonalen lang genug um 4 Steine aufzunehmen.
\\edit2: diese Funktion ist aber erst für die Diagonalen von links oben nach rechts unten!!! Für die anderen müsste man an den Zählern drehen...
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#28

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 01:25
Zitat von Luckie:
Nein das war es auch nicht, aber ich verstehe deinen Trick bei den Diagonalen auch nicht. Wenn du das noch etwas kommentieren könntest bitte.
Habs selbst getestet, geht ganz sicher hab mal den source oben upgedated.

der trick ist der, er geht ja einmal jede zeile durch und er testet dabei diagonal nach oben und unten (delta) ob dort ebenfalls punkte vom spieler gesetzt sind. Delta ist dabei der addressraum der jeweils erhoeht/verniedrigt werden muss um zum naechsten punkt zu gelangen. das gleiche mit den spalten.
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#29

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 01:51
so, ich hoffe das ist ausreichend kommentiert Man koennte alle 3 funktionen sogar in eine funktion legen, das sieht dann so aus:

Delphi-Quellcode:
function Gewonnen(Spieler: Byte): Boolean;
const
  N_ZEILEN = 6;
  N_SPALTEN = 7;
  N_GEWINNT = 4;
  Spielfeld: array[0..N_ZEILEN-1] of array[0..N_SPALTEN-1] of Cardinal =
  (
    (0, 0, 0, 0, 0, 0, 0),
    (0, 0, 0, 0, 0, 0, 0),
    (0, 0, 0, 0, 0, 0, 0),
    (0, 0, 0, 0, 0, 0, 0),
    (0, 0, 0, 0, 0, 0, 0),
    (0, 0, 0, 0, 0, 0, 0)
  );

  function GewinntReihe(Zeile, Spalte, Delta, Max: Integer): Boolean;
  var
    Anfang, Pos, Ende: PCardinal;
    c, i: Integer;
  begin
    Result := false;
    // wir holen uns die adresse des punktes von dem aus wir das spielfeld betrachten, das ist der linke bzw obere spielrand
    Pos := @Spielfeld[Zeile, Spalte];
    // wir holen uns die adressen der punkte ueber bzw unter die wir nicht gehen duerfen
    Anfang := @Spielfeld[0, 0];
    Ende := @Spielfeld[N_ZEILEN - 1][N_SPALTEN - 1];
    c := 0;
    i := 0;
   
    // diese schleife so lange ausfuehren bis die aktuelle position ausserhalb des spielfelds gesetzt wurde
    while (Cardinal(Pos) <= Cardinal(Ende)) and (Cardinal(Pos) >= Cardinal(Anfang)) do
    begin
      // ist der gesuchte spieler an der aktuellen stelle?
      if Pos^ = Spieler then
      begin
        // wir zaehlen hoch, wie viele punkte hintereinander schon ohne unterbrechnung waren
        Inc(c);
        if c = N_GEWINNT then
        begin
          // ok, wir haben genau N_GEWINNT punkte in folge, der spieler hat gewonnen!
          Result := true;
          Exit;
        end;
      end
      else
      begin
        // ok, der punkt ist nicht gesetzt oder gehoert nicht zu dem gesuchten spieler, wir setzen den counter zurueck
        c := 0;
      end;
      // wir springen zum naechsten punkt der getestet wird. je nachdem in welche richtung wir gehen und wie weit, gibt delta an.
      Inc(Pos, Delta);
      // fuer zeilen und spalten brauchen wir ein maximum um nicht in die naechste zeile/spalte zu gelangen!
      if Max > 0 then
      begin
        Inc(i);
        // Schleife unterbrechen, wenn wir das Maximum ueberschritten haben
        if i >= Max then
        begin
          Exit;
        end;
      end;
    end;
  end;

var
  i: Integer;
begin
  Result := false;

  // wir laufen von der linken oberen spielecke zur linken unteren spielecke
  for i := 0 to N_ZEILEN - 1 do
  begin
       // sind in dieser zeile 4 aufeinanderfolgende punkte des spielers?
       // der abstand zum naechsten punkt in der zeile ist 1, wir pruefen maximal N_SPALTEN punkte in der zeile
    if GewinntReihe(i, 0, 1, N_SPALTEN) or
       // -(N_SPALTEN - 1) ist der abstand zum naechsten punkt der rechts oben (diagonal) liegt, der abstand ist
       // also negativ und um 1 geringer als das spielfeld spalten hat, wir setzen keine maximale anzahl an punkten die zu pruefen sind, also Max=0
       GewinntReihe(i, 0, -(N_SPALTEN - 1), 0) or
       // N_SPALTEN + 1 ist der abstand zum naechsten punkt rechts unten (diagonal), der abstand ist also positiv
       // und um 1 groesser als das spielfeld spalten hat, wir setzen keine maximale anzahl an punkten die zu pruefen sind, also Max=0
       GewinntReihe(i, 0, N_SPALTEN + 1, 0) then
    begin
      Result := true;
      Exit;
    end;
  end;

  // wir laufen von der linken oberen zur rechten oberen spielecke
  for i := 0 to N_SPALTEN - 1 do
  begin
       // sind in dieser spalte 4 aufeinanderfolgende punkte des spielers?
       // der abstand zum naechsten punkt (der direkt unter dem ausgangspunkt liegt)
       // ist die anzahl der punkte in einer zeile. Wir pruefen nur N_ZEILEN punkte in der spalte!
    if GewinntReihe(0, i, N_SPALTEN, N_ZEILEN) or
       // N_SPALTEN + 1 ist der abstand zum naechsten punkt unterhalb und rechts von diesem punkt, also um 1 groesser
       // als das spielfeld spalten hat, wir setzen keine maximale anzahl an punkten die zu pruefen sind, also Max=0
       GewinntReihe(0, i, N_SPALTEN + 1, 0) or
       // N_SPALTEN - 1 ist der abstand zum naechsten punkt unterhalb und links von diesem punkt, also um genau 1 kleiner
       // als das spielfeld spalten hat, wir setzen keine maximale anzahl an punkten die zu pruefen sind, also Max=0
       GewinntReihe(0, i, N_SPALTEN - 1, 0) then
    begin
      Result := true;
      Exit;
    end;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Sieger-Prüfung "Vier gewinnt"

  Alt 29. Jun 2004, 01:52
Zitat von w3seek:
Zitat von Luckie:
Nein das war es auch nicht, aber ich verstehe deinen Trick bei den Diagonalen auch nicht. Wenn du das noch etwas kommentieren könntest bitte.
Habs selbst getestet, geht ganz sicher hab mal den source oben upgedated.
Dank dir, aber dann hab eich es irgendwie falsch eingebaut oder was über sehen. Das aktuelle Projekt hängt ja oben dran.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 7     123 45     Letzte »    


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 13:13 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