Как я могу прочитать, сколько мин вокруг каждой пустой ячейки. Игра сапер

Программа ниже спрашивает пользователя, сколько мин он хочет видеть на поле, а затем отображает поле с минами. На следующем шаге мне нужно рассчитать, сколько мин вокруг каждой пустой ячейки. И я знаю, что мне нужно проверить 8 ячеек, если ячейка находится посередине, 5 ячеек, если ячейка сбоку, и 3 ячейки, если ячейка находится в углу. Если вокруг ячейки от 1 до 8 мин, мне нужно вывести количество мин вместо символа, обозначающего пустую ячейку.

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

    }
}

person user13921628    schedule 11.09.2020    source источник
comment
А как поставить/удалить пометку ячеек с * и ячеек с минами.   -  person user13921628    schedule 13.09.2020


Ответы (1)


Вы можете сделать это следующим образом:

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

Метод countMinesNear(int, int) проверяет, существует ли поле close (для предотвращения ошибок индекса на краях), и подсчитывает мины, если поля существуют.

person Tobias    schedule 11.09.2020
comment
Большое спасибо, и еще одно. Где 0 должен быть '*'. - person user13921628; 11.09.2020
comment
Просто добавьте if (minesNear == 0) return "*"; к методу getCharAt. - person Tobias; 11.09.2020
comment
А как поставить/удалить пометку ячеек с * и ячеек с минами. - person user13921628; 13.09.2020