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:
"gep" bedeutet hier soviel wie "bereits geprüft" und soll verhindern, dass ein leeres feld mehrmals geprüft wird.
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; 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:
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,
procedure TMinesweeper.RundrumAufdecken(X,Y: Integer);
begin // <---- diese hier ----> if (X=1) and (Y=1) then begin... EDIT: Ich habe das "gep"-array jetzt zu global geschoben anstatt lokal, das hab ich bemerkt dass das falsch war :oops: gruß, dajuhsa :dp: |
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^^'' |
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