Не проходит второй пункт: В методе openTile(int, int) значение поля countClosedTiles должно уменьшаться на 1, если элемент матрицы gameField отмечается флагом isOpen. Я уже перепробовал всё что мог, судя по комментариям проблема наблюдается далеко не только у меня, но у всех проблема решилась простым пермещением gameField[y][x].isOpen = true; countClosedTiles--; в самое начало метода, однако мне не помогло даже это, я пошёл на крайние меры - скопировал этот метод ПОЛНОСТЬЮ у человека, у которого этот пункт прошёл и он у меня всё равно не прошёл! Помогите пожалуйста, уже сколько дней пытаюсь завершить сапёра. И да, забыл сказать, сама программа работает прекрасно
package com.javarush.games.minesweeper;
import com.javarush.engine.cell.*;
import java.util.*;
public class MinesweeperGame extends Game {
private static final int SIDE = 9;
private int countMinesOnField;
private static final String MINE = "\uD83D\uDCA3";
private static final String FLAG = "\uD83D\uDEA9";
private int countFlags = 0;
private boolean isGameStopped = true;
private int countClosedTiles = SIDE * SIDE;
@Override
public void initialize() {
setScreenSize(SIDE,SIDE);
createGame();
}
private GameObject[][] gameField = new GameObject[SIDE][SIDE];
private void createGame() {
for (int i = 0;i < SIDE;i++) {
for (int j = 0;j < SIDE;j++) {
boolean mine = false;
if (getRandomNumber(10) == 0) {
mine = true;
countMinesOnField++;
}
gameField[i][j] = new GameObject(j,i,mine);
setCellColor(i,j,Color.ORANGE);
}
}
countMineNeighbors();
countFlags = countMinesOnField;
isGameStopped = false;
}
private List<GameObject> getNeighbors(GameObject go) {
ArrayList<GameObject> list = new ArrayList<GameObject>();
if (go.y - 1 > -1) { list.add(gameField[go.y - 1][go.x]); }
if (go.y - 1 > -1 && go.x + 1 < SIDE) { list.add(gameField[go.y - 1][go.x + 1]); }
if (go.x + 1 < SIDE) { list.add(gameField[go.y][go.x + 1]); }
if (go.y + 1 < SIDE && go.x + 1 < SIDE) { list.add(gameField[go.y + 1][go.x + 1]); }
if (go.y + 1 < SIDE) { list.add(gameField[go.y + 1][go.x]); }
if (go.y + 1 < SIDE && go.x - 1 > -1) { list.add(gameField[go.y + 1][go.x - 1]); }
if (go.x - 1 > -1) { list.add(gameField[go.y][go.x - 1]); }
if (go.y - 1 > -1 && go.x - 1 > -1) { list.add(gameField[go.y - 1][go.x - 1]); }
return list;
}
private void countMineNeighbors() {
for (GameObject[] go:gameField) {
for (GameObject go1:go){
if (go1.isMine == false){
for (GameObject go2:getNeighbors(go1)){
if (go2.isMine == true) go1.countMineNeighbors++;
}
}
}
}
}
private void openTile(int x, int y) {
if (gameField[y][x].isOpen || gameField[y][x].isFlag || isGameStopped) return;
gameField[y][x].isOpen = true;
countClosedTiles--;
if (gameField[y][x].isMine) {
setCellValueEx(x, y, Color.RED, MINE);
gameOver();
return;
}
if (gameField[y][x].countMineNeighbors == 0) {
setCellValue(x, y, "");
for (GameObject go : getNeighbors(gameField[y][x])) openTile(go.x, go.y);
} else
setCellNumber(x, y, gameField[y][x].countMineNeighbors);
setCellColor(x, y, Color.GREEN);
if (countClosedTiles == countMinesOnField) {
win();
return;
}
}
public void onMouseLeftClick(int x, int y){
openTile(x,y);
}
private void markTile(int x,int y){
if(gameField[y][x].isOpen == false && gameField[y][x].isFlag == true && isGameStopped == false){
countFlags++;
gameField[y][x].isFlag = false;
setCellColor(x,y,Color.ORANGE);
setCellValue(x,y,"");
}
else if(gameField[y][x].isOpen == false && countFlags > 0 && gameField[y][x].isFlag == false && isGameStopped == false){
gameField[y][x].isFlag = true;
countFlags--;
setCellValue(x,y,FLAG);
setCellColor(x,y,Color.YELLOW);
}
}
public void onMouseRightClick(int x,int y){
markTile(x,y);
}
private void gameOver(){
showMessageDialog(Color.RED,"Game over!",Color.GREEN,40);
isGameStopped = true;
}
private void win(){
isGameStopped = true;
showMessageDialog(Color.GREEN,"You win!",Color.BLUE,40);
}
}