Methoden Methode lässt sich nicht selbst aufrufen?

  • Themenstarter Themenstarter Borstenhorst
  • Beginndatum Beginndatum
B

Borstenhorst

Gast
Hi!
Muss für die Uni ein kleines Java-Programm schreiben.
Das ganze soll ein Minesweeper-Clone werden.

Nun zu meinem Problem.
Es gibt 2 2dimensionale Arrays. Ein Lösungsfeld wo die Minen reinkommen und danach eine Lösungs "Karte" generiert wird. Und ein Spielfeld wo erstmal alles mit "x"en gefüllt ist und man nach und nach aufdecken muss. Wenn auf dem Spielfeld eine 0 aufgedeckt wird dann soll geguckt werden ob sich um diese 0 noch andere 0en auf dem Lösungsfeld befinden und wenn ja sollen diese ebenfalls aufgedeckt werden also im Spielfeld auf "0" gesetzt werden.

Da ich jetzt aber nicht nur die 0en um die auswahlzelle aufdecken möchte sondern alle die sich außenherrum befinden dachte ich mir ich rufe die aufdeckfunktion für jede neu entdeckte 0 auf. Habe die stelle auskommentiert, ohne den selbstaufruf läuft es(siehe unten nur um die auswahlzelle herrum).

Theoretisch gut, praktisch: java.lang.StackOverflowError

z=zu begutachtende Zelle (Zeile)
s=zu begutachtende Zelle (Spalte)
zs=groesse des arrays (Zeile)
ss=groesse des arrays (Spalte)
minenfeld=loesungsfeld

Java:
        //Methode Aufdecken
	public static char[][] aufdecken(char[][]spielfeld,char[][]minenfeld, int z, int s, int zs, int ss) {  

		int zstart; //Startposition suche Zeile
		int zstop; //Stopposition suche Zeile
		int sstart; //Startposition suche Spalte
		int sstop; //Stopposition suche Spalte
			
		//Verhindern das Suchzelle auserhalb des Feldes liegt
		if(z>0){zstart=z-1;}else{zstart=z;}
		if(z<zs-1){zstop=z+1;}else{zstop=z;}
		if(s>0){sstart=s-1;}else{sstart=s;}
		if(s<ss-1){sstop=s+1;}else{sstop=s;}
			
		//Suchen nach umliegenden 0en
		for(int lz=zstart;lz<=zstop;lz++)
		{
			for(int ls=sstart;ls<=sstop;ls++)
			{
				if(minenfeld[lz][ls]=='0')
				{
					spielfeld[lz][ls]='0';
					//spielfeld=aufdecken(spielfeld,minenfeld,lz,ls,zs,ss); //Netter versuch aber geht nicht...
				}
			}
		}
		
		return 	spielfeld;
	
	}

Um mal zu zeigen wie die beiden Felder aussehen (auswahlzelle 1 1):

Minenfeld
0000000
0000000
0000000
0000000
0000000
1100000
m100000

Spielfeld
000xxxx
000xxxx
000xxxx
xxxxxxx
xxxxxxx
xxxxxxx
xxxxxxx

Vielen Dank für eure Hilfe!
 
du hast keine abbruch bedingung.

wenn im minenfeld 0 ist, dann wird im spielfeld ein wert gesetzt und die funktion erneut aufgerufen - diese bedingung ist immer wahr und wird somit immer und immer wieder aufgerufen

du musst in der rekursion sagen wann fertig ist.
 
du hast recht !!
Habe es eben auch gemerkt.
Java:
//Suchen nach umliegenden 0en
		for(int lz=zstart;lz<=zstop;lz++)
		{
			for(int ls=sstart;ls<=sstop;ls++)
			{
				if(minenfeld[lz][ls]=='0')
				{
					if(spielfeld[lz][ls]!='0')
					{
						spielfeld[lz][ls]='0';
						spielfeld=aufdecken(spielfeld,minenfeld,lz,ls,zs,ss); //Netter versuch aber geht nicht...
					}
				}
			}
		}

so geht es da ich nur weitersuche wenn im Spielfeld nicht schon eine 0 steht.


Vielen Dank !!!
 
z=zu begutachtende Zelle (Zeile)
s=zu begutachtende Zelle (Spalte)
zs=groesse des arrays (Zeile)
ss=groesse des arrays (Spalte)
minenfeld=loesungsfeld

Nur so als zusätzlichen Tipp: Wenn du Variablen sinnvoll und sprechend benennst, sparst du dir solche Dokumentation (als Kommentar oder Zusatz). Gerade Entwicklungsumgebungen wie Eclipse machen es einem einfach, Variablen so lange immer wieder konsistent umzubenennen, bis man mit ihrem Namen zufrieden ist und durch Ergänzung von angefangenen Namen braucht man auch keine Angst vor längeren Variablennamen zu haben. Wobei man es mit der Länge auch nicht übertreiben sollte, da sonst die Leserlichkeit des Quellcodes leidet.

Kurze Variablennamen sollte man am besten nur für solche mit einem kurzen Scope und eindeutigem Zweck verwenden.

Als Bonus werden dann auch losgelöste Codeabschnitte verständlich, wenn man sich das ganze später mal anschaut (oder ein anderer darauf guckt).
 
Zuletzt bearbeitet:

Zurück
Oben