Search code examples
javaminesweeper

How I can read how many mines are around each empty cell.Game minesweeper


The program below ask the user how many mines he wants to see on the field and then display the field with mines. In next step I need to calculate how many mines are around each empty cell. And I know that I need to check 8 cells if the cell is in the middle, 5 cells if the cell is in the side, and 3 cells if the cell is in the corner. If there are from 1 to 8 mines around the cell, I need to output the number of mines instead of the symbol representing an empty cell.

import java.util.Scanner;
import java.util.Random;

public class Minesweeper {

    char[][] minesweeper = new char[9][9];
    Random randNum = new Random();
    Scanner sc = new Scanner(System.in);

    public Minesweeper() {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                minesweeper[i][j] = '*';
            }
        }
    }

    public void printMinesweeper() {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                System.out.print(minesweeper[i][j]);
            }
            System.out.println();
        }
    }

    public void randomX() {
        System.out.print("How many mines do you want on the field?: ");
        int numberOfMines = sc.nextInt();
        int i = 0;
        while (i < numberOfMines) {
            int x = randNum.nextInt(9);
            int y = randNum.nextInt(9);
            if (minesweeper[x][y] == '*') {
                minesweeper[x][y] = 'X';
                i++;
            }
        }
        printMinesweeper();

    }
}

Solution

  • You can do it like this:

    import java.util.Random;
    import java.util.Scanner;
    
    public class Minesweeper {
        
        public static void main(String[] args) {
            Minesweeper minesweeper = new Minesweeper();
            minesweeper.randomX();
            minesweeper.printMinesweeper();
        }
        
        char[][] minesweeper = new char[9][9];
        Random randNum = new Random();
        Scanner sc = new Scanner(System.in);
        
        public Minesweeper() {
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    minesweeper[i][j] = '*';
                }
            }
        }
        
        public void printMinesweeper() {
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    System.out.print(getCharAt(i, j));
                }
                System.out.println();
            }
        }
        
        private String getCharAt(int i, int j) {
            if (mineAt(i, j)) {
                return "X";
            }
            
            int minesNear = countMinesNear(i, j);
            return Integer.toString(minesNear);
        }
        
        private boolean mineAt(int i, int j) {
            return minesweeper[i][j] == 'X';
        }
        
        private int countMinesNear(int i, int j) {
            int mines = 0;
            for (int x = -1; x <= 1; x++) {//near fields in x direction
                for (int y = -1; y <= 1; y++) {//near fields in y direction
                    if (x + i >= 0 && x + i < minesweeper.length && y + j >= 0 && y + j < minesweeper.length) {//check whether the field exists
                        if (minesweeper[x+i][y+j] == 'X') {//check whether the field is a mine
                            mines++;
                        }
                    }
                }
            }
            return mines;
        }
    
        public void randomX() {
            System.out.print("How many mines do you want on the field?: ");
            int numberOfMines = sc.nextInt();
            int i = 0;
            while (i < numberOfMines) {
                int x = randNum.nextInt(9);
                int y = randNum.nextInt(9);
                if (minesweeper[x][y] == '*') {
                    minesweeper[x][y] = 'X';
                    i++;
                }
            }
            printMinesweeper();
            
        }
    }
    

    The countMinesNear(int, int) method check whether the field near exists (to prevent index errors on the edges) and counts the mines if the fields exist.