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
thx
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