Пробовал переносить:
1) в начало метода
2) до countMineNeighbors();
countFlags = countMinesOnField;
Причина непонятна. Есть подозрение что тут проблема в валидации.
package com.javarush.games.minesweeper;
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;
import java.util.ArrayList;
import java.util.List;
public class MinesweeperGame extends Game {
private static final int SIZE = 9;
private static final String MINE = "\uD83D\uDCA3";
private static final String FLAG = "\uD83D\uDEA9";
private GameObject[][] gameField = new GameObject[SIZE][SIZE];
private int countMinesOnField;
private int countFlags;
private boolean isGameStopped;
@Override
public void initialize() {
setScreenSize(SIZE, SIZE);
createGame();
}
@Override
public void onMouseLeftClick(int x, int y) {
openTile(x, y);
}
@Override
public void onMouseRightClick(int x, int y) {
markTile(x, y);
}
private void createGame() {
for (int y = 0; y < SIZE; y++) {
for (int x = 0; x < SIZE; x++) {
boolean isMine = getRandomNumber(10) < 1;
if (isMine) {
countMinesOnField++;
}
gameField[y][x] = new GameObject(x, y, isMine);
setCellColor(x, y, Color.ORANGE);
}
}
countMineNeighbors();
countFlags = countMinesOnField;
isGameStopped = false;
}
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 >= SIZE) {
continue;
}
if (x < 0 || x >= SIZE) {
continue;
}
if (gameField[y][x] == gameObject) {
continue;
}
result.add(gameField[y][x]);
}
}
return result;
}
private void countMineNeighbors() {
for (int y = 0; y < SIZE; y++) {
for (int x = 0; x < SIZE; x++) {
GameObject field = gameField[y][x];
if (!field.isMine) {
List<GameObject> neighborsList = getNeighbors(field);
field.countMineNeighbors = (int) neighborsList.stream().filter(it -> it.isMine).count();
}
}
}
}
private void openTile(int x, int y) {
GameObject field = gameField[y][x];
field.isOpen = true;
setCellColor(x, y, Color.GREEN);
if (field.isMine) {
setCellValueEx(x, y, Color.RED, MINE);
gameOver();
} else {
if (field.countMineNeighbors == 0) {
List<GameObject> neighborsList = getNeighbors(field);
setCellValue(x, y, "");
neighborsList.stream()
.filter(it -> !it.isOpen)
.forEach(it -> openTile(it.x, it.y));
} else {
setCellNumber(x, y, field.countMineNeighbors);
}
}
}
private void markTile(int x, int y) {
GameObject field = gameField[y][x];
if (isGameStopped) {
return;
}
if (field.isOpen) {
return;
}
if (countFlags == 0 && !field.isFlag) {
return;
}
if (field.isFlag) {
field.isFlag = false;
countFlags++;
setCellValue(x, y, "");
setCellColor(x, y, Color.ORANGE);
} else {
field.isFlag = true;
countFlags--;
setCellValue(x, y, FLAG);
setCellColor(x, y, Color.YELLOW);
}
}
private void gameOver() {
showMessageDialog(Color.RED, "GAME OVER", Color.DARKRED, 40);
isGameStopped = true;
}
}