Freie Felder bei Minesweeper automatisch aufdecken

MFC openGL hat gesagt.:
Glaube ja mal nicht das das funktionieren kann [...]
Wie sagt man so schön: glauben heißt nicht wissen :p Natürlich funktioniert das, wenn man es richtig implementiert...

Beitrag #19 macht übrigens wenig Sinn, da du mit deinem Code nur zeigst, wie man alle Nachbarfelder abfragt. Was das mit Rekursion oder nicht Rekursion zu tun hat, erschließt sich mir da leider nicht so ganz. Außerdem müsstest du ja immer noch ggf. die Nachbarfelder der Nachbarfelder (der Nachbarfelder der Nachbarfelder...) abfragen. Und wenn du das iterativ lösen willst, dann bist du selber Schuld.
 
moin


So es funktioniert jetzt erstmal mit folgendem Code:
Code:
void aufdecken(int x, int y)
{
	if(att[x][y].zahl != 0 || att[x][y].zustand == 1)
		return;

	if(att[x][y].geklickt == 0 )
	{	
		att[x][y].geklickt = 1;

		att[x+1][y].status = 0;
		aufdecken(x+1, y);
		att[x-1][y].status = 0;
		aufdecken(x-1, y);
		att[x][y+1].status = 0;
		aufdecken(x, y+1);
		att[x][y-1].status = 0;
		aufdecken(x, y-1);
		att[x-1][y-1].status = 0;
		att[x-1][y+1].status = 0;
		att[x+1][y-1].status = 0;
		att[x+1][y+1].status = 0;
	}		
}

Ich weiss noch nciht ob ich es so lasse, aber wie gesagt es funktioniert.


mfg
umbrasaxum
 
@MFC openGL:
Ist Ok.
Was machst Du bei deiner Lösung denn, wenn eines der umliegenden Felder auch leer ist.
Du müsstest den ganzen Kram ja für dieses neue leere Feld auch wieder überprüfen und so weiter und so weiter. Und genau hier macht die Rekursion jede Menge Sinn. Ich wüsste jetzt nicht, wie es mit vertretbarem Aufwand iterativ klappen soll.




@umbrasaxum
Was machst Du, wenn deine Rekursion am Rand des Feldes ankommt?


regards, Alex
 
Zuletzt bearbeitet:
moin


Noch mach ich da nichts, es kommt zwar zu einem Fehler aber den behebe ich noch mit 4 IFs.


mfg
umbrasaxum
 
Es ginge auch ohne IFs, wenn du deine Felder um je 1 in jede Richtung größer machst und diesen "Rahmen" als schon geklickt und ohne Minen deklarierst.
Dann wird die Aufdecken-Funktion nicht mehr mit den RandFeldern aufgerufen weil die schon geklickt sind und es ändert sich nichts an der Minen-in-der-Umgebung Berechnung.

Kostet aber 2n+2m-4 Speicherplätze mehr. (n und m sollen die Kantenlänge sein)
Je nachdem wie groß deine Felder sind, lohnt sich das vielleicht.
 
ngc hat gesagt.:
@MFC openGL:
Ist Ok.
Was machst Du bei deiner Lösung denn, wenn eines der umliegenden Felder auch leer ist.
Du müsstest den ganzen Kram ja für dieses neue leere Feld auch wieder überprüfen und so weiter und so weiter. Und genau hier macht die Rekursion jede Menge Sinn. Ich wüsste jetzt nicht, wie es mit vertretbarem Aufwand iterativ klappen soll.



regards, Alex


Genau da ist mein Denkfehler gewesen, sorry aber ein blindes Huhn findet auch mal ein Korn, bei mir hats nur ein wenig länger gedauert... SORRY....
 
Hy!

Ich weis die Idee kommt ein bisschen spät, aber was hältst du davon beim anlegen deines Arrays das Array wie einen Graphen durchzugehen, und allen benachbarten leeren Feldern ein Zahl z.B. größer als 10 gibst. Würde dann so aussehen:

Code:
221AA11111
xx2AA1x22x
23x33233x2
BB2xxx4x2C
BBB25xx2CC
BBBBB2x2CC

In dem Fall sind die
x Miene
1,2 Die angezeigte Zahl
A,B Zusammenhängende freie Felder

Ist vielleicht zu spät das so zu implementieren, weil ja bei so einem Array fast alle Prüfungen, wie viele Felder im Umkreis eines freien Feldes liegen auf das Initialisieren des Spielfeldes verschoben werden.

Wenn jetzt jemand auf ein Feld klickt, für das eine Zahl > 9 gespeichert ist müsstest du nur in zwei Schleifen das Array durchgehen, und alle mit derselben Zahl aufdecken.

Schreibt mal was ihr davon haltet, ich weiß das sich warsch. nicht mehr lohnt das ganze so zu implementieren, weil du schon sehr weit bist mit deinem Programm, ich soll nur für die Schule ein einfaches Spiel programmieren, und mein Minesweeper Ansatz sieht so aus.

mfg
uhu01
 
moin

Wäre natürlich eine möglichkeit so etwas gleich zum Anfang zu machen, aber um erstmal solche zusammengehörigen Felder zu speichern muss ich sie erst erkennen und das wäre genau das selbe Verfahren, wie das das ich jetzt benutze.


mfg
umbrasaxum
 

Neue Beiträge

Zurück