package com.javarush.games.minesweeper;
import java.util.List;
import java.util.ArrayList;
import com.javarush.engine.cell.*;
import com.javarush.games.minesweeper.GameObject;
public class MinesweeperGame extends Game {
private static final int SIDE = 9;
private GameObject [][] gameField = new GameObject [SIDE][SIDE];
private static final String MINE = "\uD83D\uDCA3";
private static final String FLAG = "\uD83D\uDEA9";
private int countMinesOnField = 0;
private int countFlags = 0;
private boolean isGameStopped;
private int countClosedTiles = SIDE * SIDE;
@Override
public void initialize(){
setScreenSize(SIDE, SIDE);
createGame();
}
@Override
public void onMouseLeftClick(int x, int y){
openTile(x, y);
}
@Override
public void onMouseRightClick(int x, int y){
markTile(x, y);
}
private void createGame(){
isGameStopped = false;
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
setCellColor(j, i, Color.GREEN);
boolean isMine = false;
if (getRandomNumber(10) == 1) {
isMine = true;
countMinesOnField ++;
}
gameField[i][j] = new GameObject(j, i, isMine);
}
}
countFlags = countMinesOnField;
countMineNeighbors();
}
private List<GameObject> getNeighbors(GameObject gameObject) {
List<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(){
List<GameObject> nList;
for (int i = 0; i < SIDE; i++)
for (int j = 0; j < SIDE; j++)
if (!gameField[i][j].isMine) {
nList = getNeighbors(gameField[i][j]);
for (GameObject go : nList)
if (go.isMine)
gameField[i][j].countMineNeighbors++;
}
}
private void openTile(int x, int y){
if (!gameField[y][x].isOpen && !gameField[y][x].isFlag && isGameStopped != true){
gameField[y][x].isOpen = true;
countClosedTiles --;
setCellColor(x, y, Color.BLUE);
if (gameField[y][x].isMine) {
//setCellValue(x, y, MINE);
setCellValueEx(x, y, Color.RED, MINE);
gameOver();
}
else if (gameField[y][x].countMineNeighbors != 0)
setCellNumber(x, y, gameField[y][x].countMineNeighbors);
// else if (!gameField[y][x].isMine && countMinesOnField == countClosedTiles) win();
else {
if (countMinesOnField == countClosedTiles) win();
for (GameObject neighbor : getNeighbors(gameField[y][x]))
if (!neighbor.isOpen) openTile(neighbor.x, neighbor.y);
setCellValue(x, y, "");
}
}
}
private void markTile(int x, int y){
if (!gameField[y][x].isOpen && countFlags > 0 && isGameStopped != true) {
if (!gameField[y][x].isFlag) {
gameField[y][x].isFlag = true;
countFlags --;
setCellValue(x, y, FLAG);
setCellColor(x, y, Color.YELLOW);
}
else {
gameField[y][x].isFlag = false;
countFlags ++;
setCellValue(x, y, "");
setCellColor(x, y, Color.GREEN);
}
}
}
private void gameOver(){
isGameStopped = true;
showMessageDialog(Color.RED,"GAME OVER", Color.BLACK, 14);
}
private void win(){
isGameStopped = true;
showMessageDialog(Color.RED,"YOU WIN!!!", Color.BLACK, 14);
}
}
ТЕСТОВЫЙ
26 уровень
Валидатор пропускает, но метод win не отрабатывает
Решен
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Bargu3in
5 января 2020, 01:37решение
Здравствуйте.
Посмотрите внимательнее на метод openTile. В нем у вас проверка:
Метод win() у вас будет вызван только в случае, если выполняется условие (countMinesOnField == countClosedTiles) и при этом вы открываете ячейку, которая не соседствует с минами (countMineNeighbors == 0). +2
ТЕСТОВЫЙ
5 января 2020, 11:43
Пересмотрел код несколько раз. Не вижу где задаётся условие countMineNeighbors == 0
0
ТЕСТОВЫЙ
5 января 2020, 11:48
перемесил в другой блок вызов win() - заработало, но вопрос остался))
private void openTile(int x, int y){
if (!gameField[y][x].isOpen && !gameField[y][x].isFlag && isGameStopped != true){
gameField[y][x].isOpen = true;
countClosedTiles --;
setCellColor(x, y, Color.BLUE);
if (gameField[y][x].isMine) {
//setCellValue(x, y, MINE);
setCellValueEx(x, y, Color.RED, MINE);
gameOver();
}
else if (countMinesOnField == countClosedTiles) win();
else if (gameField[y][x].countMineNeighbors != 0)
setCellNumber(x, y, gameField[y][x].countMineNeighbors);
else {
for (GameObject neighbor : getNeighbors(gameField[y][x]))
if (!neighbor.isOpen) openTile(neighbor.x, neighbor.y);
setCellValue(x, y, "");
}
}
}
0
Bargu3in
6 января 2020, 07:55
Рад, что вы решили проблему.
Условия countMineNeighbors == 0 в явном виде нет... было:
Т.е., если не выполняется это условие if (gameField[y][x].countMineNeighbors != 0), то .. и тут уже вызывался метод win() 0