Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Matthias Reitinger hat gesagt.:Man könnte das ganze rekursiv angehen:
Pseudocode:
Eventuell muss man noch aufpassen, dass man in keine Endlosschleife gerät bei der Überprüfung der Nachbarfelder...Code:funktion deckeAuf(feld) { if (feld is bombe) { boom(); return; } markiereAlsAufgedeckt(feld); foreach (nachbarfeld) { if (nachbarfeld is bombe or nachbarfeld is aufgedeckt) continue; else deckeAuf(nachbarfeld); } }
void aufdecken(int Y, int X)
{
if ((brett[Y][X]==0)&&(aufgedeckt[Y][X]!=1))
{
aufgedeckt[Y][X]=1;
if ((Y<9)&&(X<9)&&(aufgedeckt[Y+1][X+1]!=1)) aufdecken(Y+1,X+1);
if ((X<9)&&(aufgedeckt[Y][X+1]!=1)) aufdecken(Y,X+1);
if ((Y>0)&&(X<9)&&(aufgedeckt[Y-1][X+1]!=1)) aufdecken(Y-1,X+1);
if ((Y<9)&&(aufgedeckt[Y+1][X]!=1)) aufdecken(Y+1,X);
if ((Y>0)&&(aufgedeckt[Y-1][X]!=1)) aufdecken(Y-1,X);
if ((Y<9)&&(X>0)&&(aufgedeckt[Y+1][X-1]!=1)) aufdecken(Y+1,X-1);
if ((X>0)&&(aufgedeckt[Y][X-1]!=1)) aufdecken(Y,X-1);
if ((Y>0)&&(X>0)&&(aufgedeckt[Y-1][X-1]!=1)) aufdecken(Y-1,X-1);
}
else aufgedeckt[Y][X]=1;
}
ngc hat gesagt.:Hatte das gleiche Problem in einem ähnlichen Programm. (Auch Minesweeper aber unter DOS.)
Die Aufdeckung mehrer Felder funktioniert meiner Meinung nach nur rekursiv, da sich das Zentrum deiner Betrachtung (beim Check der Felder in der Umgebung) jedesmal ändert und du nicht vorhersehen kannst, wie und wie oft. Kombiniert mit einem Globalen Array für die Felder könnte eventuell etwas wie folgendes funktionieren:
Code:void aufdecken(int Y, int X) { if ((brett[Y][X]==0)&&(aufgedeckt[Y][X]!=1)) { aufgedeckt[Y][X]=1; if ((Y<9)&&(X<9)&&(aufgedeckt[Y+1][X+1]!=1)) aufdecken(Y+1,X+1); if ((X<9)&&(aufgedeckt[Y][X+1]!=1)) aufdecken(Y,X+1); if ((Y>0)&&(X<9)&&(aufgedeckt[Y-1][X+1]!=1)) aufdecken(Y-1,X+1); if ((Y<9)&&(aufgedeckt[Y+1][X]!=1)) aufdecken(Y+1,X); if ((Y>0)&&(aufgedeckt[Y-1][X]!=1)) aufdecken(Y-1,X); if ((Y<9)&&(X>0)&&(aufgedeckt[Y+1][X-1]!=1)) aufdecken(Y+1,X-1); if ((X>0)&&(aufgedeckt[Y][X-1]!=1)) aufdecken(Y,X-1); if ((Y>0)&&(X>0)&&(aufgedeckt[Y-1][X-1]!=1)) aufdecken(Y-1,X-1); } else aufgedeckt[Y][X]=1; }
In meinem Fall ist das Feld 10x10 groß.
im array brett[][] werden die minen gespeichert.
1: ja
0: nein
Du müsstest das Ganze noch dahingehend modifizieren, dass dein Programm auch auf markierte Minen reagiert. Das machte bei meiner DOS Version keinen Sinn, weil es die Bedienung zu umständlich macht.
regards, Alex
MFC openGL hat gesagt.:Beim besten Willen, mit Rekursiv hat das wirklich nur noch sehr wenig zu tun. Da kannst du direkt die Koordinaten um den jeweiligen Punkt fest definieren(haste ja im Grunde auch gemacht) und dann die testefeld Methode aufrufen.
Bei so vielen IF's ist das Rekursive vollkommen für den *****. (Meine persönliche Meinung)
ngc hat gesagt.:Das ist allein schon dadurch rekursiv, das sich die Funktion selbst aufruft.
- Keine IF's mehr
Dann wären alle Felder abgefragt, wenn eins dieser Felder dann BOOOM sagt, haste verloren, ansonsten markiere das Feld als aufgedeckt...