Ciorba-Petru Ответов: 1

Как я могу установить/удалить мины в игре minesweeper в этом коде?


1. Игра начинается с того момента, когда пользователю показываются все цифры, но не позиции мин. Я делаю этот шаг.
2. Пользователь должен ввести два числа.Я делаю этот шаг.
3. если пользователь вводит координаты пустой ячейки (без номера, потому что ячейки с номерами гарантированно свободны от мин), то программа должна установить специальную отметку на этой ячейке, которая означает, что пользователь думает, что мина находится
там.
4. если пользователь вводит координаты ячейки с номером, программа должна запросить пользователя еще раз и не печатать поле.
5. если пользователь вводит координаты, где находится специальная отметка, программа должна удалить эту отметку. Это необходимо, потому что пользователь может ставить метки где угодно, кроме ячеек с цифрами, но игра заканчивается только в том случае, если все метки верны.
6. Когда пользователь помечает все мины, не помечая ни одной пустой ячейки, игра заканчивается.

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

public class Minesweeper {

public static void main(String[] args) {
    Minesweeper minesweeper = new Minesweeper();
    minesweeper.randomX();
    minesweeper.changeMinesweeper();
}

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 changeMinesweeper() {
    while (true) {

        System.out.print("Set/delete mines marks (x and y coordinates): ");
        int n = sc.nextInt();
        int m = sc.nextInt();
        int x = n - 1;
        int y = m - 1;
    }
}

public void printMinesweeper() {
    System.out.println(" " + "|" + "123456789" + "|");
    System.out.println("-" + "|" + "---------" + "|");
    for (int i = 0; i < 9; i++) {
        System.out.print(i + 1 + "|");
        for (int j = 0; j < 9; j++) {
            if (minesweeper[i][j] == 'X') {
                System.out.print('.');
            } else {
                System.out.print(getCharAt(i, j));
            }
        }
        System.out.println("|");
    }
    System.out.println("-" + "|" + "---------" + "|");
}

private String getCharAt(int i, int j) {
    if (mineAt(i, j)) {
        return "X";
    }

    int minesNear = countMinesNear(i, j);
    if (minesNear == 0) {
        return ".";
    } else {
        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++) {
        for (int y = -1; y <= 1; y++) {
            if (x + i >= 0 && x + i < minesweeper.length && y + j >= 0 && y + j < minesweeper.length) {
                if (minesweeper[x + i][y + j] == 'X') {
                    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();
}
}


Что я уже пробовал:

Этот код печатает таблицу 9X9 с минами и числом мин вокруг мин, теперь мне нужно установить/удалить мины и пустое пространство с любым символом и сказать пользователю, если в ячейке есть нубмер

1 Ответов

Рейтинг:
6

OriginalGriff

Вы прочитали координаты от пользователя:

public void changeMinesweeper() {
    while (true) {

        System.out.print("Set/delete mines marks (x and y coordinates): ");
        int n = sc.nextInt();
        int m = sc.nextInt();
        int x = n - 1;
        int y = m - 1;
    }
}
Таким образом, вы можете сказать, что содержит ячейка точно так же, как и для всего вашего другого кода:
minesweeper[i][j]
Дает вам ценность.
Поэтому все, что вам нужно сделать, это установить его в свой символ "я думаю, что это шахта" ("возможно") и включить его в свой код" распечатать всю карту".


Могу ли я предложить изменения, которые сделают все проще? Вместо того, чтобы иметь "игровую зону" 9x9, добавьте по одному символу границы с каждой стороны, так что вы используете карту 11x11. Сделайте все новые ячейки всегда пустыми, используйте пользовательские индексы как единые, и вычисление "сколько мин вокруг этого" станет проще, так как вам не придется проверять значения "вне диапазона". (x,y) всегда смотрит на
(x - 1, y - 1), (x    , y - 1), (x + 1, y - 1), 
(x - 1, y    ),                 (x + 1, y    ), 
(x - 1, y + 1), (x    , y + 1), (x + 1, y + 1)
и его не должно волновать, где на карте x и y находятся.

[редактировать]
Я бы также предложил сохранить две карты: "карту шахт" и "карту догадок", чтобы вы могли обновлять вводимые пользователем данные, не касаясь "реальной карты"
Случайным образом заполните "карту шахт", а затем подсчитайте значения "рядом" в "карту догадок" и позвольте пользователю установить свою "шахту здесь" на этой карте.
Тогда легко проверить, когда он хочет: сравните x и y на двух картах.

[/редактировать]