Видел, что у многих была эта проблема, но решения не нашел.
public class MinesweeperGame extends Game {
private static final int SIDE = 9;
private GameObject[][] gameField = new GameObject[SIDE][SIDE];
private int countMinesOnField;
private final static String MINE = "\uD83D\uDCA3";
private final static String FLAG = "\uD83D\uDEA9";
private int countFlags;
private boolean isGameStopped;
private int countClosedTiles = SIDE * SIDE;
private int score;
@Override
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
}
private void createGame() {
for (int y = 0; y < SIDE; y++) {
for (int x = 0; x < SIDE; x++) {
boolean isMine = getRandomNumber(10) < 1;
if (isMine) {
countMinesOnField++;
}
gameField[y][x] = new GameObject(x, y, isMine);
setCellColor(x, y, Color.ORANGE);
}
}
countFlags = countMinesOnField;
isGameStopped = false;
countMineNeighbors();
}
private List<GameObject> getNeighbors(GameObject gameObject) {
List<GameObject> result = new ArrayList<>();
for (int y = gameObject.y - 1; y <= gameObject.y + 1; y++) {
for (int x = gameObject.x - 1; x <= gameObject.x + 1; x++) {
if (y < 0 || y >= SIDE) {
continue;
}
if (x < 0 || x >= SIDE) {
continue;
}
if (gameField[y][x] == gameObject) {
continue;
}
result.add(gameField[y][x]);
}
}
return result;
}
private void countMineNeighbors(){
List<GameObject> gameObjects = new ArrayList<>();
GameObject object = new GameObject(1, 2, false);
for (int i = 0; i < gameField.length; i++){
for (int j = 0; j < gameField.length; j++){
if (gameField[i][j].isMine == false){
gameObjects = getNeighbors(gameField[i][j]);
for (int c = 0; c < gameObjects.size(); c++){
object = gameObjects.get(c);
if (object.isMine == true){
gameField[i][j].countMineNeighbors+=1;
}
}
}
}
}
}
@Override
public void onMouseLeftClick(int i, int j){
openTile(i, j);
}
@Override
public void onMouseRightClick(int i, int j){
markTile(i, j);
}
private void markTile(int i, int j){
if(isGameStopped == true){
return;
}
if(gameField[j][i].isOpen || (countFlags == 0 &&
gameField[j][i].isFlag == false)){
return;
}
else{
if (gameField[j][i].isFlag == false){
gameField[j][i].isFlag = true;
countFlags--;
setCellValue(i, j, FLAG);
setCellColor(i, j, Color.YELLOW);
}
else{
gameField[j][i].isFlag = false;
countFlags++;
setCellValue(i, j, "");
setCellColor(i, j, Color.ORANGE);
}
}
}
private void openTile (int i, int j){
if(gameField[j][i].isOpen == true || gameField[j][i].isFlag == true
|| isGameStopped == true){
return;
}
countClosedTiles--;
GameObject object = new GameObject(1, 2, false);
if (gameField[j][i].isMine == true){
gameField[j][i].isOpen = true;
setCellValueEx(i, j, Color.RED, MINE);
gameOver();
}
else{
if (gameField[j][i].countMineNeighbors == 0){
gameField[j][i].isOpen = true;
score = score + 5;
setScore(score);
setCellColor(i, j, Color.GREEN);
setCellValue(i, j, "");
List<GameObject> gameObjects = getNeighbors(gameField[j][i]);
for (int c = 0; c < gameObjects.size(); c++){
object = gameObjects.get(c);
if (object.isOpen == false){
openTile(object.x, object.y);
}
}
}
else{
gameField[j][i].isOpen = true;
score = score + 5;
setScore(score);
setCellColor(i, j, Color.GREEN);
setCellNumber(i, j, gameField[j][i].countMineNeighbors);
}
if(countClosedTiles == countMinesOnField){
win();
}
}
}
private void win(){
isGameStopped = true;
showMessageDialog(Color.BLUE, "YOU WIN", Color.GREEN, 32);
}
private void gameOver(){
isGameStopped = true;
showMessageDialog(Color.RED, "YOU LOSE", Color.ORANGE, 32);
}
}