Кто подскажет, все уровни прошел, игра корректно не отображается... где я наплужил?)
public class MinesweeperGame extends Game {
private static final int SIDE = 9;
private int countMinesOnField;
private int countFlags;
private int countClosedTiles = SIDE * SIDE;
private int score = 0;
private boolean isGameStopped;
private final static String MINE = "\uD83D\uDCA3";
private final static String FLAG = "\uD83D\uDEA9";
private GameObject[][] gameField = new GameObject[SIDE][SIDE];
private void createGame() {
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
if (getRandomNumber(10) == 1) {
gameField[j][i] = new GameObject(i, j, true);
countMinesOnField++;
} else {
gameField[j][i] = new GameObject(i, j, false);
}
setCellColor(i, j, Color.BLUE);
setCellValue(i, j, "");
}
}
countMineNeighbors();
countFlags = countMinesOnField;
}
private List<GameObject> getNeighbors(GameObject gameObject) {
List<GameObject> countOfNeighbours = new ArrayList<>();
try {
countOfNeighbours.add(gameField[gameObject.y][gameObject.x + 1]);
countOfNeighbours.add(gameField[gameObject.y + 1][gameObject.x + 1]);
countOfNeighbours.add(gameField[gameObject.y + 1][gameObject.x]);
countOfNeighbours.add(gameField[gameObject.y + 1][gameObject.x - 1]);
countOfNeighbours.add(gameField[gameObject.y][gameObject.x - 1]);
countOfNeighbours.add(gameField[gameObject.y - 1][gameObject.x - 1]);
countOfNeighbours.add(gameField[gameObject.y - 1][gameObject.x]);
countOfNeighbours.add(gameField[gameObject.y - 1][gameObject.x + 1]);
} catch (IndexOutOfBoundsException e) {
}
return countOfNeighbours;
}
private void countMineNeighbors() {
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
if (!gameField[j][i].isMine) {
List<GameObject> neighbours = getNeighbors(gameField[j][i]);
for (GameObject object : neighbours) {
if (object.isMine) {
gameField[j][i].countMineNeighbors++;
}
}
}
}
}
}
private void openTile(int x, int y) {
if (!gameField[y][x].isOpen || !gameField[y][x].isFlag || !isGameStopped) {
gameField[y][x].isOpen = true;
countClosedTiles--;
setCellColor(x, y, Color.GREEN);
if (gameField[y][x].isOpen && !gameField[y][x].isMine) {
score += 5;
}
if (gameField[y][x].isMine) {
setCellValueEx(x, y, Color.RED, MINE);
gameOver();
} else if (gameField[y][x].countMineNeighbors == 0) {
setCellValue(x, y, "");
for (GameObject neighbour : getNeighbors(gameField[y][x])) {
if (!neighbour.isOpen) {
openTile(neighbour.x, neighbour.y);
}
}
} else if (gameField[y][x].countMineNeighbors != 0) {
setCellNumber(x, y, gameField[y][x].countMineNeighbors);
}
if (countClosedTiles == countMinesOnField && !gameField[y][x].isMine) {
win();
}
}
setScore(score);
}
private void markTile(int x, int y) {
while (!isGameStopped) {
if (gameField[y][x].isOpen) {
} else if (!gameField[y][x].isFlag && countFlags == 0) {
} else if (!gameField[y][x].isFlag) {
gameField[y][x].isFlag = true;
countFlags -= 1;
setCellValue(x, y, FLAG);
setCellColor(x, y, Color.YELLOW);
} else {
gameField[y][x].isFlag = false;
countFlags += 1;
setCellValue(x, y, "");
setCellColor(x, y, Color.BLUE);
}
}
}
private void gameOver() {
isGameStopped = true;
showMessageDialog(Color.WHITE, "LOOSER", Color.BLACK, 10);
}
private void win() {
isGameStopped = true;
showMessageDialog(Color.WHITE, "CONGRATS! YOU ARE WINNER!", Color.BLACK, 10);
}
private void restart() {
isGameStopped = false;
countClosedTiles = SIDE*SIDE;
score = 0;
countMinesOnField = countFlags;
setScore(score);
createGame();
}
@Override
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
}
@Override
public void onMouseLeftClick(int x, int y) {
if (isGameStopped) {
restart();
} else {
openTile(x, y);
}
}
@Override
public void onMouseRightClick(int x, int y) {
markTile(x, y);
}
}