В методе openTile(int, int) значение поля countClosedTiles должно уменьшаться на 1, если элемент матрицы gameField отмечается флагом isOpen.
хотя работает корректно
private void openTile(int x, int y) {
if (gameField[y][x].isOpen || gameField[y][x].isFlag || isGameStopped) {
return;
}
if (!gameField[y][x].isMine && gameField[y][x].countMineNeighbors == 0 && !gameField[y][x].isOpen) {
gameField[y][x].isOpen = true;
countClosedTiles--;
setCellValue(x, y, "");
for (int k = 0; k < getNeighbors(gameField[y][x]).size(); k++) {
openTile(getNeighbors(gameField[y][x]).get(k).x, getNeighbors(gameField[y][x]).get(k).y);
setCellColor(getNeighbors(gameField[y][x]).get(k).x, getNeighbors(gameField[y][x]).get(k).y, Color.CYAN);
}
} else if (!gameField[y][x].isMine && gameField[y][x].countMineNeighbors != 0 && !gameField[y][x].isOpen) {
gameField[y][x].isOpen = true;
countClosedTiles--;
setCellColor(x, y, Color.CYAN);
setCellNumber(x, y, gameField[y][x].countMineNeighbors);
} else if (gameField[y][x].isMine) {
setCellValueEx(x, y, Color.RED,MINE);
gameOver();
return;
}
if (countClosedTiles == countMinesOnField) {
win();
return;
}
}