2D阵列(阵列阵列)扫雷

时间:2014-05-20 04:01:36

标签: java arrays

我是论坛的新手,所以如果这不符合网站的标准,我想道歉,不过我对2D阵列扫雷程序有疑问。

我试图在地板上随机放置地雷,这是通过数组构建的。不幸的是,地雷被随机放在对角线上,而不是整个板上。我的MineField代码是:

    public MineField(int w, int h, int m)
{
    Random r = new Random();
    mineField = new State[w][h];
    surroundingMines = new int[w][h];
    initialiseMineField = new int[w][h];
    traceOn = true; //set to false before submitting
    width = w;
    height = h;
    mineCount = m;
    for (int i = 0; i < w; i++)
    {
        for (int j = 0; j < h; j++)
        {
            mineField[i][j] = State.COVERED;
        }
    }
    for (int k = 0; k < m; k++)
    {
        int randomNumber = r.nextInt(m);
        int a = randomNumber;
        int b = randomNumber;
        mineField[a][b] = State.MINED;
    }

}

这给了我输出(每次随机,但只沿着对角线):
0 1 2 3 4 0| . . . . . 1| . * . . . 2| . . * . . 3| . . . * . 4| . . . . .

如何阻止它在那条对角线上行进,如何阻止地雷重叠?谢谢!

2 个答案:

答案 0 :(得分:1)

如何阻止它进入对角线?

为两个坐标生成两个随机数,而不是为两个坐标使用一个随机数。

for (int k = 0; k < m; k++)
{
    mineField[r.nextInt(w)][r.nextInt(h)] = State.MINED;
}

如何阻止地雷重叠?

两种可能的方法。

  1. 生成,检查是否已经是我的,如果是,请重试。在循环内执行此操作,这样您就不会增加k,直到您成功生成一个独特的矿。
  2. 列出所有可能的位置(作为行 - 列对),对列表进行随机排列,并将第一个m对作为地雷。
  3. 以下是方法1的一些示例代码。

    for (int k = 0; k < m; k++)
    {
        while (true) {
           int a = r.nextInt(w);
           int b = r.nextInt(h);
           if (mineField[a][b] != State.MINED) { // We have discovered an un-mined location.
               mineField[a][b] = State.MINED;
               break; // get out of the while loop.
           }
        }
    }
    

    我将把方法2作为OP的练习。

答案 1 :(得分:0)

你正在设置一个&amp; b到相同的数字。例如,假设您的变量randomNumber = 1,然后设置&amp; b到randomNumber。然后你将地雷放在[1,1]等等,只在对角线上给你开采。这可以通过添加另一个randomNumber变量来解决,以便&amp; b都有自己独立的随机整数。