public boolean isSolvable() {
// speichert eine Kopie des aktuellen Spielfelds zur spaeteren
// Wiederherstellung
Token[][] gb = this.gameboard.clone();
// geht das Spielfeld durch und ruft für jeden Stein
// isSolvableForSingleToken auf
for (int row = 0; row < gb.length; row++)
for (int col = 0; col < gb[0].length; col++)
// wenn ein Aufruf true zurück gibt, gib true zurueck
if (isSolvableForSingleToken(row, col, gameboard))
return true;
// Spielfeld wieder zuruecksetzen
this.gameboard = gb;
// wenn man hier ankommt ist das Spielfeld nicht loesbar -> false
return false;
}
private boolean isSolvableForSingleToken(int rows, int cols,
Token[][] gameboard) {
// speichert eine Kopie des aktuellen Spielfelds zur spaeteren
// Wiederherstellung
Token[][] gb = gameboard.clone();
this.gameboard = gb;
// wenn das Spiel gewonnen ist, ist es loesbar
if (gameIsWon())
return true;
// wenn das Spiel verloren ist, ist es auf diesem Weg nicht loesbar
if (gameIsLost())
return false;
// wenn du ein leeres Feld gewaehlt hast, hoere auf
if (gb[rows][cols].getTokenType() == 0)
return false;
// wenn der gewaehlte Stein entfernbar ist, entferne ihn und ueberpruefe
// jeden Stein des neuen Spielfelds auf Loesbarkeit
if (countNeighboursOfSameColour(rows, cols, new Vector<String>())
.size() >= minTokenNumberToRemove) {
removeToken(rows, cols);
for (int row = 0; row < gameboard.length; row++)
for (int col = 0; col < gameboard[0].length; col++)
if (isSolvableForSingleToken(row, col, gb))
return true;
// das Spielfeld zuruecksetzen
this.gameboard = gb;
}
// wenn man hier ankommt ist das Spielfeld von diesem Stein aus nicht
// loesbar
return false;
}