扫雷随机生成的地雷算法不正确

时间:2015-08-15 04:33:39

标签: java algorithm minesweeper

我知道,我知道。这已被问过很多次了。我不是在寻找算法。我认为我的算法运行不正常。

以下是我使用的算法:

public void onFirstMove (int moveX, int moveY) {
    setFirstMove (false);
    Random r = new Random ();

    for (int i = 0 ; i < 10 ; i++) {
        int x;
        int y;
        do {
            x = r.nextInt (9);
            y = r.nextInt (9);
        } while (tileMatrix[x][y].hasMine () &&
                moveX == x && moveY == y);

        tileMatrix[x][y].setMine ();
    }

    timer.startTimer ();
}

我把它放在onFirstMove方法中,因为我不希望玩家在第一步中丢失。正如你所看到的,我让它一直试图找到x和y坐标,而它与第一步的位置相同。

while (tileMatrix[x][y].hasMine () &&
                moveX == x && moveY == y);

现在它有两个已知的错误:

  1. 它有时会产生9个地雷,而不是10个。我知道这个,因为当我输了,它会显示所有地雷的位置。

  2. 有时在第一步的位置生成一个矿。

1 个答案:

答案 0 :(得分:0)

我同意xashru的回答(1+)。我自己,我使用一个List,将所有Tiles添加到列表中,除了第一个移动区块,将其洗牌,然后选择前N个区块(N是地雷的数量,并设置地雷。例如,某些东西像:

public void onFirstMove (int moveX, int moveY) {
    setFirstMove (false);

    // assuming your tiles are of type Tile
    List<Tile> tileList = new ArrayList<>();
    for (int x = 0; x < MAX_X; x++) {
        for (int y = 0; y < MAX_Y; y++) {
            if (x != moveX || x != moveY) {
                // add all tile's except the first move
                tileList.add(tileMatrix[x][y]);
            }
        }
    }

    // randomize the collection
    java.util.Collections.shuffle(tileList);

    // set MAX_MINES tiles to have mines
    for (int i = 0; i < MAX_MINES; i++) {
        tileList.get(0).setMine();
    }
    timer.startTimer();
}

有关更多MineSweeper&#34;有趣&#34;,请参阅我的代码并回答this MineSweeper Question