Problem mit Spielfläche aus JButtons

Status
Nicht offen für weitere Antworten.

zd

Bekanntes Mitglied
Hi,

ich bin mir nicht sicher ob das wirklich das richtige Unterforum hierfür ist, aber ich versuchs mal:

Ich habe eine Spielfläche aus JButtons (bzw einer Ableitung davon PlayButton).
Jeder Knopf hat einen Wert, der angezeigt wird, wenn der Spieler auf den Button klickt, wie in Minesweeper.
Wenn nun auf einen Button mit Wert 0 geklickt wird, sollen die umliegenden Felder auch aufgedeckt werden, falls dort 0en gefunden werden, soll um die ebenfalls.
Also praktisch bis man eine art Umrandung aus Buttons mit Wert ungleich 0 um die Felder mit 0ern erhält.

Ich habe versucht das so zu lösen:
Sämtliche Buttons werden in einem zweidimensionalen Array von PlayButtons entsprechend ihrer Koordinaten gespeichert.
Wird auf eine 0 geklickt, so wird die Methode openAroundNull(x,y) gestartet. trifft diese auf eine weitere 0, startet sie sich selber neu.
jedes neue Feld das aufgedeckt wird (egal ob von openAroundNull oder vom user), wird per setOpened() markiert, so das keine endlosschleifen entstehen dürften.

Das funktioniert aber nicht wirklich, er deckt nur Teile der Felder auf, und in der Console werden StackOverflow Fehlermeldungen ausgegeben.

Hat jemand eine Idee, was ich falsch mache, oder wie ich das anders lösen könnte?

hier der code:

minedButtons[][] ist das Array mit PlayButtons,
getOpened() gibt auskunft, ob der Button schon angeklickt/geöffnet wurde
fieldSize ist die Seitenlänge des quadratischen Spielfeldes

Code:
void openAroundNull(int x, int y) {
	
PlayButton tempButton;
		
	if (y>0) {
		if (x>0) {
			// north-west
			tempButton = minedButtons[x-1][y-1];
			if (tempButton.getOpened() == false)
				buttonNoMinePressed(tempButton);
		}
			
		// west
		tempButton = minedButtons[x][y-1];
		if (tempButton.getOpened() == false) 
			buttonNoMinePressed(tempButton);
	
		if (x<(fieldSize-1)) {
			// south-west
			tempButton = minedButtons[x+1][y-1];
			if (tempButton.getOpened() == false)
				buttonNoMinePressed(tempButton);
		}
	}
	
	if (x>0) {
		// north
		tempButton = minedButtons[x-1][y];
		if (tempButton.getOpened() == false)
			buttonNoMinePressed(tempButton);
	}
	
	if (x<(fieldSize-1)) {
		// south
		tempButton = minedButtons[x+1][y];
		if (tempButton.getOpened() == false)
			buttonNoMinePressed(tempButton);
	}
		
	if (y<(fieldSize-1)) {
		if (x>0) {
			// north-east
			tempButton = minedButtons[x-1][y+1];
			if (tempButton.getOpened() == false)
				buttonNoMinePressed(tempButton);
		}
					
		// east
		tempButton = minedButtons[x][y+1];
		buttonNoMinePressed(tempButton);
		
		if (x<(fieldSize-1)) {
			// south-east
			tempButton = minedButtons[x+1][y+1];
			if (tempButton.getOpened() == false)
				buttonNoMinePressed(tempButton);
		}
	}
	buttonArea.validate();
}

Code:
void buttonNoMinePressed(PlayButton butt)
	{
	
	int temp = butt.getButtonType();
	String mineNumbers;			
	switch (temp)
	{
		case 0:
			mineNumbers = "";
			butt.setIcon(nothing);
			this.openAroundNull(butt.getXPos(),butt.getYPos());
			break;		
		case 1:
			mineNumbers = "<html><font color=#410BDB>1</font></html>";
			break;		
		case 2:
			mineNumbers = "<html><font color=#19EB3B>2</font></html>";
			break;		
		case 3:
			mineNumbers = "<html><font color=#EB4019>3</font></html>";
			break;		
		case 4:
			mineNumbers = "<html><font color=#070E68>4</font></html>";
			break;		
		case 5:
			mineNumbers = "<html><font color=#070E68>5</font></html>";
			break;		
		case 6:
			mineNumbers = "<html><font color=#070E68>6</font></html>";
			break;		
		case 7:
			mineNumbers = "<html><font color=#E6DF25>7</font></html>";
			break;		
		case 8:
			mineNumbers = "<html><font color=#E23ED8>8</font></html>";
			break;		
		default:
			mineNumbers = "";
	}
	butt.setText(mineNumbers);
	
			
	butt.setOpened();
	buttonArea.validate();	
}


thx
 
butt.setOpened solltest du aufrufen bevor du in openAroundNull weitermachst. (Sonst hast du deine unendliche Schleife).
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben