Delphi-PRAXiS
Seite 11 von 14   « Erste     91011 1213     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Minesweeper (https://www.delphipraxis.net/184385-minesweeper.html)

BadenPower 26. Mär 2015 17:09

AW: Minesweeper
 
Zitat:

Zitat von Popov (Beitrag 1294954)
Das Bild in Post #82 unterstützt deine Aussage nicht.

Schau Dir das Bild nochmals genau an.

Beim Klick auf das einzelne Feld auf das der roten Pfeil zeigt hat sich ALLES was rot umrandet ist geöffnet. Und dies ist nur 1 Abbild von zig Versuchen welche ich gemacht habe.

Dort wirst Du auch feststellen können, dass dort ZWEI diagonale "Grenzen" enthalten sind, welche eben NICHT als Begrenzung gelten.

Popov 26. Mär 2015 17:10

AW: Minesweeper
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wo siehst du auf dem Bild #82 sich berührende Flächen über Eck?

Hier ein Beispiel wie ich es meine:

saii 26. Mär 2015 17:11

AW: Minesweeper
 
Ich habs mal rekursiv versucht und hab mal den Vorschlag von Mavarik umgeschrieben.

Jetzt bekomme ich beim Anklicken von Panels, die keine benachbarte Mine haben, eine Exception der Klasse EStackOverflow

Delphi-Quellcode:
procedure TForm1.CannonFire(var A,B,m:integer; Sender: TObject);
var h,j:integer;
begin
        Panel:=TPanel(Sender);
        A:=StrToInt(Copy(Panel.Name, 3,2));
        B:=StrToInt(Copy(Panel.Name, 6,2));

        if IntA[A,B]<>9 then
        begin
                m:=IntA[A,B];
                if IntA[A,B]=0 then
                FindeLeer(v,w);
        end;
       
        if IntA[A,B]=9 then
        begin
                ShowMessage('Du hast Verloren!');
                close;
        end;
end;

Procedure TForm1.FindeLeer(v,w:integer);
begin
  if (v < 0) or (w < 0) or (v > 14) or (w > 14) then
    Exit;

  if (IntA[v,w] = 0) then
    begin
      PanelA[v,w].Caption:=IntToStr(IntA[v,w]);
      FindeLeer(v+1,w);
      FindeLeer(v-1,w);
      FindeLeer(v,w+1);
      FindeLeer(v,w-1);
    end;
end;

Sir Rufo 26. Mär 2015 17:12

AW: Minesweeper
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Popov (Beitrag 1294961)
Wo siehst du auf dem Bild #82 sich berührende Flächen über Eck?

Kuckst du, mit deiner überlagerten Aussage (und passend gedreht, für alle, die das im Kopf nicht hinbekommen :mrgreen:)

BadenPower 26. Mär 2015 17:18

AW: Minesweeper
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Popov (Beitrag 1294961)
Wo siehst du auf dem Bild #82 sich berührende Flächen über Eck?

Sogar gleich zweimal.

Sir Rufo 26. Mär 2015 17:21

AW: Minesweeper
 
Wikipedia meint
Zitat:

Eine Sonderrolle spielen Felder, die keine Minen in ihrer Nachbarschaft aufweisen: Solche zeigen zum einen nicht etwa eine 0, sondern sie werden farblich anders dargestellt. Zum anderen werden alle noch verdeckten Felder in ihrer Nachbarschaft automatisch aufgedeckt. Ist ein so neu aufdecktes Feld ebenfalls ein Null-Feld, so wird dieser Prozess rekursiv weitergeführt.

Popov 26. Mär 2015 17:21

AW: Minesweeper
 
Na gut, dann ist der Algorithmus für MineSweeper nicht wirklich eine Herausforderung.

Wer die Regel nicht will kann aus meinem Beispiel diese Zeilen löschen:
Delphi-Quellcode:
              if not ((a = 0) or (b = 0)) then
                Continue;
Sie verhindern die Öffnung benachbarter Flächen über Eck. So simpel die zwei Zeilen auch aussehen, ich hab da fast 3/4 Stunde dran gesessen. Das war das einzig komplizierte. Der Rest ist in fünf bis zehn Minuten gemacht.

Bjoerk 26. Mär 2015 17:23

AW: Minesweeper
 
Zitat:

Zitat von saii (Beitrag 1294962)
Ich habs mal rekursiv versucht und hab mal den Vorschlag von umgeschrieben. Jetzt bekomme ich beim Anklicken von Panels, die keine benachbarte Mine haben, eine Exception der Klasse EStackOverflow

Weil der PanelA[X, Y] noch nicht erzeugt ist. Das kannst du z.B. in der CreatePanels machen. Schau ggf. mal wie ich das gemacht hab. Die IntA brauchen wir dann auch nicht mehr.

saii 26. Mär 2015 17:32

AW: Minesweeper
 
Sicher? Eigentlich existiert PanelA[X,Y] da doch schon. Das wird doch in FormCreate erstellt.

Die Exception kommt immer in einer der
Delphi-Quellcode:
FindeLeer(v+1,w);
-Zeilen

Bjoerk 26. Mär 2015 17:44

AW: Minesweeper
 
Oh Bud, ich hab langsam echt kein Bock mehr? Bist n netter Kerl, aber schau dir doch halt mal zum Beispiel #73 und #80 an. Der Panel ist zwar erzeugt aber PanelsA weiß davon ggf. nichts. Weiß nicht mehr. Vielleicht ist auch deine Rekursion falsch?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:43 Uhr.
Seite 11 von 14   « Erste     91011 1213     Letzte »    

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