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); } }