Меня официально поломал данный уровень. 5 вариантов решения не работают! Где ошибка не понтяно, при чем каждый раз непонятно разное.
Первый мой, который собирал пока проходил(правда он уже переписан раз 10). Остальные копи-паст из "решенных" вопросов, но они не работают даже после исправления.
package com.javarush.games.minesweeper;
import java.util.ArrayList;
import com.javarush.engine.cell.*;
public class MinesweeperGame extends Game {
private static final String MINE = "\uD83D\uDCA3", FLAG = "\uD83D\uDEA9";
private static final int SIDE = 9;
private GameObject[][] gameField= new GameObject[SIDE][SIDE] ;
private int countMinesOnField, countFlags, score = 0, countClosedTiles = SIDE*SIDE;
private boolean isGameStopped;
private void win () {
isGameStopped = true;
showMessageDialog (Color.WHITE, "ПОБЕДА!", Color.BLUE, 49);
for(int i = 0;i<SIDE;i++) {
for (int j = 0 ;j < SIDE ; j++ ) {
if(gameField[i][j].isMine) {
setCellValue(j, i, MINE);
setCellColor(j, i, Color.YELLOW);
}
}
}
}
private void gameOver () {
isGameStopped = true;
showMessageDialog (Color.WHITE, "Игра окончена, сдавайся!", Color.BLUE, 40);
for(int i = 0;i<SIDE;i++) {
for (int j = 0 ;j < SIDE ; j++ ) {
if(gameField[i][j].isMine) {
setCellValue(j, i, MINE);
setCellColor(j, i, Color.RED);
}
}
}
}
private void markTile (int x, int y) {
if(!gameField[y][x].isOpen && !isGameStopped) {
if(!gameField[y][x].isFlag && !(countFlags == 0)) {
gameField[y][x].isFlag = true;
setCellValue(x, y, FLAG);
setCellColor(x,y,Color.YELLOW);
countFlags--;
}
else if(gameField[y][x].isFlag) {
gameField[y][x].isFlag = false;
setCellValue(x, y, "");
setCellColor(x,y,Color.ORANGE);
countFlags++;
}
}
}
/*
private void openTile(int x, int y) { //Считает правильно, но флаги(????) не ставятся.
if (isGameStopped) {return;}
if (gameField[x][y].isFlag) {return;}
if (gameField[x][y].isOpen) {return;}
if (gameField[x][y].isMine) { // Мины
setCellValue(x, y, MINE);
setCellValueEx(x, y, Color.RED,MINE);
gameField[x][y].isOpen = true;
gameOver();
return;
}
else if (gameField[x][y].countMineNeighbors == 0) {
setCellValue(x, y, Integer.toString(score));
setCellColor(x, y, Color.GREEN);
gameField[x][y].isOpen = true; //открываем клетку
if (gameField[x][y].isOpen && !gameField[x][y].isMine){
countClosedTiles--;
score = score + 5;
setScore(score);
}
if (countClosedTiles == countMinesOnField) {
win();
}
ArrayList<GameObject> neighbors = getNeighbors(gameField[x][y]); //заносим в список
for (GameObject gameObject : neighbors) {
if (!gameObject.isOpen)
openTile(gameObject.y, gameObject.x);
}
}
else {
setCellNumber(x, y, gameField[x][y].countMineNeighbors);
setCellColor(x, y, Color.GREEN);
gameField[x][y].isOpen = true;
score = score + 5;
setScore(score);
}
}*/
/*
private void openTile(int x, int y) { // считает вроде правильно
if((!gameField[y][x].isOpen)&&
(!gameField[y][x].isFlag)&&
(!isGameStopped)) {
if(gameField[y][x].isMine) {
gameField[y][x].isOpen = true;
setCellValueEx(x, y, Color.RED, MINE);
gameOver();
}
else {
if(gameField[y][x].countMineNeighbors > 0) {
setCellNumber(x, y, gameField[y][x].countMineNeighbors);
setCellColor(x, y, Color.GREEN);
gameField[y][x].isOpen = true;
countClosedTiles--;
}
else {
setCellValue(x, y, Integer.toString(score));
gameField[y][x].isOpen = true;
countClosedTiles--;
setCellColor(x, y, Color.GREEN);
if(gameField[y][x].countMineNeighbors == 0){
ArrayList<GameObject> list = getNeighbors(gameField[y][x]);
for(GameObject f : list) {
if((!f.isOpen) && (!f.isMine))
openTile(f.x, f.y);
}
}
}
score += 5;
setScore(score);
}
if(countClosedTiles == countMinesOnField) win();
}
}
*/
private void openTile(int x, int y) { // Считает неправильно, не понимаю почему
if (gameField[y][x].isOpen == true) return;
if (isGameStopped == true) return;
if (gameField[y][x].isFlag == true) return;
countClosedTiles--;
if (gameField[y][x].isMine == false) {
gameField[y][x].isOpen = true;
score += 5;
setScore(score);
setCellColor(x, y, Color.GREEN);
if (gameField[y][x].countMineNeighbors==0) {
ArrayList<GameObject> other = getNeighbors(gameField[y][x]);
for(GameObject field: other) {
if(field.isMine == false) openTile(field.x, field.y);
}
setCellValue(x, y, Integer.toString(score));
}
else
setCellNumber(x, y, gameField[y][x].countMineNeighbors);
if(countClosedTiles == countMinesOnField)
win();
}
else if (gameField[y][x].isMine) {
gameField[y][x].isOpen = true;
setCellValueEx(x, y, Color.RED, MINE);
gameOver();
}
}
/*
private void openTile(int x, int y){// накидывает +5 за уже открытые ячейки? что очевидно почему
if((!gameField[y][x].isOpen)&&
(!gameField[y][x].isFlag)&&
(!isGameStopped)) {
if(gameField[y][x].isMine) {
gameField[y][x].isOpen = true;
setCellValueEx(x, y, Color.RED, MINE);
gameOver();
}
else {
if(gameField[y][x].countMineNeighbors > 0)
setCellNumber(x, y, gameField[y][x].countMineNeighbors);
else
setCellValue(x, y, Integer.toString(score));
gameField[y][x].isOpen = true;
countClosedTiles--;
score += 5;
setScore(score);
setCellColor(x, y, Color.GREEN);
if(gameField[y][x].countMineNeighbors == 0){
ArrayList<GameObject> list = getNeighbors(gameField[y][x]);
for(GameObject f : list) {
if((!f.isOpen) && (!f.isMine))
openTile(f.x, f.y);
}
}
}
if(countClosedTiles == countMinesOnField) win();
}
}
*/
/*
private void openTile(int x, int y) { // считает правильно, не понимаю как это работает
if (isGameStopped || gameField[y][x].isFlag || gameField[y][x].isOpen) return;
if (gameField[y][x].isMine) {
setCellValueEx(x, y, Color.RED, MINE);
gameOver();
return;
} else {
gameField[y][x].isOpen = true;
countClosedTiles--;
score += 5;
setScore(score);
if (gameField[y][x].countMineNeighbors == 0) {
ArrayList<GameObject> neighbors = getNeighbors(gameField[y][x]);
setCellValue(x, y, Integer.toString(score));
setCellColor(x, y, Color.GREEN);
for (GameObject neighbor : neighbors) {
if (!neighbor.isOpen) {
openTile(neighbor.x, neighbor.y);
}
}
} else {
setCellNumber(x, y, gameField[y][x].countMineNeighbors);
setCellColor(x, y, Color.YELLOW);
}
}
if (countMinesOnField == countClosedTiles) {
win();
}
}
*/
private ArrayList<GameObject> getNeighbors(GameObject gameObject) {
ArrayList<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 >= SIDE) {
continue;
}
if (x < 0 || x >= SIDE) {
continue;
}
if (gameField[y][x] == gameObject) {
continue;
}
result.add(gameField[y][x]);
}
}
return result;
}
private void countMineNeighbors() {
for(int i = 0;i<SIDE;i++) {
for (int j = 0 ;j < SIDE ; j++ ) {
if(!gameField[i][j].isMine) {
ArrayList<GameObject> listMines = getNeighbors(gameField[i][j]);
for(GameObject field: listMines) {
if(field.isMine) {
gameField[i][j].countMineNeighbors +=1 ;
}
}
}
}
}
}
public void initialize () {
setScreenSize(SIDE, SIDE);
createGame();
}
private void createGame() {
for(int i = 0;i<SIDE;i++) {
for (int j = 0 ;j < SIDE ; j++ ) {
int isMine = getRandomNumber(10);
if (isMine==1){
gameField[j][i] = new GameObject(i,j,true);
countMinesOnField+=1;
}
else {
gameField[j][i] = new GameObject(i,j,false);
}
setCellColor(i,j,Color.ORANGE);
}
}
countMineNeighbors();
countFlags = countMinesOnField;
isGameStopped = false;
}
@Override
public void onMouseLeftClick(int x, int y) {
openTile(x, y);
}
public void onMouseRightClick (int x, int y) {
markTile(x, y);
}
}