为扫雷游戏创建随机地雷

时间:2016-03-17 22:40:19

标签: java minesweeper

private static readonly string[] letters = { "A", "B", "C", "D", "E", "F", "G", "H" };
    private const int size = 8;

    private static bool[,] chessboard;

    private static void Main()
    {
        const string top = " -----------------";

        //init chessboard
        chessboard = new bool[size, size];

        //place a figure on field 4/6 for demonstration
        chessboard[4, 6] = true;

        for (int y = 0; y < size; y++)
        {
            Console.WriteLine(" {0}", top);
            Console.Write("{0} ", size - y);
            for (int x = 0; x < size; x++)
            {
                Console.Write("|{0}", chessboard[x, y] ? 'X' : ' ');
            }
            Console.WriteLine("|");
        }

        Console.Write("   ");
        for (int i = 0; i < size; i++)
        {
            Console.Write("{0} ", letters[i]);
        }
        Console.ReadKey();
    }

我想为扫雷游戏创建随机地雷..谁能告诉我我做错了什么?如果我运行程序它就不会给我看30个随机地雷

5 个答案:

答案 0 :(得分:2)

您选择了一个不寻常的模型来保存有关地雷位置的信息。虽然您可能会通过一些明智的调试来解决当前的问题,但我预计这将导致您在轨道上遇到更多问题。

我建议您将模型更改为更直接的内容,例如:

class Cell {
    private final JButton button = new JButton();
    private boolean mine = false;
    private boolean hidden = true;

    public Cell() {
        button.setText(" ");
    }

    public void setMine() {
        assert hidden;
        mine = true;
    }

    public boolean hasMine() {
        return mine;
    }

    public void reveal() {
        hidden = false;
        button.setText(mine ? "X" : "-");
    }

    public boolean isHidden() {
        return hidden;
    }
}

class Field {
    public static final int SIZE = 20;

    private final Cell[][] cells = new Cell[SIZE][SIZE];

    public Field(int minesToAdd) {
        for (int x = 0; x < SIZE; ++) {
            for (int y = 0; y < SIZE; y++) {
                cells[x][y] = new Cell();
            }
        }
        Random random = new Random();
        while (minesToAdd > 0) {
            Cell cell = cells[random.nextInt(SIZE)][random.nextInt(SIZE)];
            if (!cell.hasMine()) {
                cell.setMine();
                minesToAdd--;
            }
        }
    }

    public JPanel getButtonPanel() {
        ....
    }
}

我相信这会让你的意图更清晰。这有一些问题,比如模型和演示文稿之间的紧密联系(JButton),但它可以完全修复各种设计模式。

答案 1 :(得分:0)

这里:

for (int i = 0; i < 30; i++) {
    int random_x = x.get(new Random().nextInt(x.size()));
    int random_y = y.get(new Random().nextInt(y.size()));
    x.remove(random_x);
    y.remove(random_y);
....

将在......时产生 IndexOutOfBoundsException

你的列表中有20个元素,你要从中删除30个元素...

答案 2 :(得分:0)

您的随机坐标可能大于网格大小。如果x的大小为20,而random_x也是20,那么您将拥有SELECT id FROM quiz WHERE quiz_page = '2' AND id = 184

将其更改为:

IndexOutOfBoundsException

如果大小为20,那将为您提供0到19之间的随机数。

此外,由于您的列表类型为int random_x = x.get(new Random().nextInt(x.size() - 1)); int random_y = y.get(new Random().nextInt(y.size() - 1)); ,因此Integer调用会将其解释为列表中的索引,而不是对象本身。

要解决此问题,请在致电x.remove(random_x)时使用Integer,而不是int。如:

remove()

编辑: 要进一步改进/修复随机生成器,请将其更改为:

x.remove(Integer.valueOf(random_x));

使用以下代码段进行测试时:

int random_x = x.get(new Random().nextInt(x.size() == 1 ? 1 : x.size() - 1));

给出输出: x:0,y:18 x:1,y:5 x:2,y:1 x:3,y:3 x:4,y:9 x:5,y:15 x:6,y:14 x:7,y:10 x:8,y:8 x:9,y:11 x:10,y:16 x:11,y:17 x:12,y:0 x:13,y:7 x:14,y:4 x:15,y:12 x:16,y:2 x:17,y:6 x:18,y:13 x:19,y:19

答案 3 :(得分:0)

试试这个方法:

Rule

accountID方法返回小于1.0的Double值。但是我们需要一个0到19之间的随机整数(ruleID - 1)。

因此,我们将此随机双精度值与按钮列表的大小相乘,即20,然后将其转换为int。所以我们可以得到0到19之间的值。

isCronRuleruleTag之间的区别是,第一个是第一个维度的长度(它是一个二维数组,如你所知),第二个给出了长度第二个维度。因此,您可以动态获取数字并乘以随机数,以避免selector异常。

您可以将此方法与任意大小的二维按钮数组一起使用,它将起作用。但是警告,如果你使用一个少于30个按钮的阵列,而循环将永远持续,因为你不能获得30个地雷:)

改进此方法的一种方法是参数化mineCount,因此您可以更改actionMask之类的方法,以便在方法调用上设置我的计数。

答案 4 :(得分:0)

你可以试试这个:

int x = 20;
int y = 20;
JButton[][] buttons = new JButton[x][y];

public void mines(){
    int mines = 30;
    Random rand = new Random()
    while(mines>0){
        int random_x = rand.nextInt(x);
        int random_y = rand.nextInt(y);
        if(buttons[random_x][random_y]!=null){
            buttons[random_x][random_y] = new Button();
            buttons[random_x][random_y].setText("X")
            mines--;
        }  
    }
}