Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi minesweeper problem (https://www.delphipraxis.net/109626-minesweeper-problem.html)

dajuhsa 4. Mär 2008 19:23


minesweeper problem
 
hallo,
ich möchte eine art minesweeper programmieren und das meiste klappt auch.
Aber wenn man bei minesweeper auf ein leeres feld klickt, werden ja bekanntlich auch alle angrenzenden leeren felder geöffnet, ich habe das so versucht:

Delphi-Quellcode:
procedure TMinesweeper.LeerzeichenAufdecken;
var
i,j   : integer;
gep   : array[1..15,1..15] of Boolean;
weiter : Boolean;
begin

  for i := 1 to 15 do
   for j := 1 to 15 do
    gep[i,j] := false;
  weiter := false;

  for i := 1 to 15 do
   for j := 1 to 15 do
  begin
    if not gep[i,j] then
    if Spielfeld[i,j] = 0 then
    begin
      RundrumAufdecken(i,j);
      gep[i,j] := true;
      weiter := true;
    end;
  end;
  if weiter then
    LeerzeichenAufdecken;

end;
"gep" bedeutet hier soviel wie "bereits geprüft" und soll verhindern, dass ein leeres feld mehrmals geprüft wird.
das Feld ist 15 mal 15 felder groß und "Spielfeld" speichert die Lage der Minen,Zahlen,Leerzeichen, und nicht die der Fahnen(0 bedeutet hier leerzeichen).
Wenn ich dann aber auf ein leeres feld klicke, kommt eine Exception "EStackOverflow" und die Zeile die rot wird ist diese hier:

Delphi-Quellcode:
procedure TMinesweeper.RundrumAufdecken(X,Y: Integer);
begin // <---- diese hier ---->
  if (X=1) and (Y=1) then
  begin...
bitte helft mir, den fehler zu finden, ohne die leerzeichen-aufdeck-prozedur "effizienter zu gestalten" oder so, das soll nur eine Übung für mich sein,

EDIT: Ich habe das "gep"-array jetzt zu global geschoben anstatt lokal, das hab ich bemerkt dass das falsch war :oops:

gruß,
dajuhsa :dp:

dajuhsa 4. Mär 2008 19:42

Re: minesweeper problem
 
ok, sry ich hab den fehler wohl wirklich schnell gefunden :oops: :
gep darf natürlich noch nicht nach einer prüfung zurückgesetzt werden, sondern erst beim nächsten "öffnen" eines leerfeldes^^.
Außerdem darf es nicht Spielfeld heißen, denn das Spielfeld "kennt" ja schon alle Felder mit dem Wert 0, sondern die Benutzeroberfläche des Spielers, damit nur die Felder um die offenen Leerfelder aufgedeckt werden.

Was diese Exception bedeutet weiß ich zwar immer noch nicht, aber egal^^''

Nikolas 4. Mär 2008 22:06

Re: minesweeper problem
 
Bei dem Fehler würde ich sagen, dass du bei einer Rekursion einen Fehler gemacht hast und damit dich so tief verschachtelst, dass der Stack auf dem die verschachtelten Aufrufe abgelegt werden, einfach voll ist. Probiert doch mal mitzuzählen, wie oft diese Funktion aufgerufen wird und ob dein Abbruchkriterium richtig ist.

Zu den gep: mit der Abkürzung musstest du im Code 20 Zeichen weniger tippen, dafür eine Erklärung schreiben, die grob 30 Zeichen lang ist. Fällt dir was auf? Du liest den Code weitaus häufiger, als du ihn schreiben musst. Und da ist es schneller, die paar Zeichen noch zu schreiben, als bei jedem durchlesen erst mal nachdenken zu müssen, was du da eigentlich gemeint hast.
Ein Prof in diesem Semester hat nie einen Bezeichner unter 10 Zeichen benutzt, was am Anfang recht nervig war, aber im Endeffekt doch sinnvoll. (so lange es nicht nur ein Variabel in ener for-schleife ist, wobei du die vll doch eher x und y nennen solltest, so kann ich mir etwas besser vorstellen, was eigentlich was bedeutet).


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 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