Согласно требованиям Метод openTile(int, int) должен вызывать метод getNeighbors(GameObject), если элемент не является миной и количество соседей-мин равно нулю.
Так оно и происходит. Но валидатор не принимает. хелп
package com.javarush.games.minesweeper;
import com.javarush.engine.cell.*;
import java.util.ArrayList;
public class MinesweeperGame extends Game {
private static final int SIDE = 9;
private static final Color baseColor = Color.ORANGE;
private static final Color mineColor = Color.RED;
private static final Color openColor = Color.GREEN;
private final GameObject[][] gameField = new GameObject[SIDE][SIDE];
private int countMinesOnField = 0;
private static final String MINE = "\uD83D\uDCA3";
private static final String FLAG = "\uD83D\uDEA9";
private int countFlags = 0;
private void openTile(int x, int y) {
GameObject square = gameField[y][x];
square.isOpen = true;
if (square.isMine) setCellValueEx(x, y, mineColor, MINE);
else {
setCellColor(x, y, openColor);
if (square.countMineNeighbors > 0) setCellNumber(x, y, square.countMineNeighbors);
else {
setCellValue(x, y, "");
ArrayList<GameObject> neighbors = getNeighbors(square);
for (GameObject i : neighbors)
if(!i.isOpen) openTile(i.x, i.y);
}
}
}
private void createGame() {
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
boolean mine = getRandomNumber(10) == 0 ? true : false;
if (mine) countMinesOnField++;
gameField[j][i] = new GameObject(i, j, mine);
setCellColor(i, j, baseColor);
}
}
countMineNeighbors();
countFlags = countMinesOnField;
}
private void countMineNeighbors() {
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
GameObject square = gameField[j][i];
if (!square.isMine) {
ArrayList<GameObject> neighbors = getNeighbors(square);
int mineNeighbors = 0;
for (GameObject neighbor : neighbors) {
if (neighbor.isMine) mineNeighbors++;
}
square.countMineNeighbors = mineNeighbors;
}
}
}
}
private ArrayList<GameObject> getNeighbors(GameObject square) {
ArrayList<GameObject> ret = new ArrayList<GameObject>(8);
int maxX = square.x < SIDE - 1 ? square.x + 1 : square.x;
int maxY = square.y < SIDE - 1 ? square.y + 1 : square.y;
for (int i = (square.x > 0 ? square.x - 1 : square.x); i <= maxX; i++) {
for (int j = (square.y > 0 ? square.y - 1 : square.y); j <= maxY; j++) {
if (square.x != i || square.y != j) ret.add(gameField[j][i]);
}
}
return ret;
}
@Override
public void onMouseLeftClick(int x, int y) {
openTile(x, y);
}
@Override
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
}
}