有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

以下是我使用的算法:

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

现在它有两个已知的bug:

  1. 它有时会产生9枚地雷,而不是10枚。我知道这一点,因为当我输的时候,它会显示所有的地雷在哪里

  2. 它有时会在第一步的位置产生地雷


共 (2) 个答案

  1. # 1 楼答案

    该错误处于while状态。应该是:

    while (tileMatrix[x][y].hasMine () ||    // OR not AND
                    (moveX == x && moveY == y));
    
  2. # 2 楼答案

    我同意xashru的回答(1+对它)。我自己,我会使用一个列表,将除第一个移动磁贴之外的所有磁贴添加到列表中,将其洗牌,然后选择前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();
    }
    

    有关更多扫雷艇“乐趣”,请参阅我的代码和对this MineSweeper Question的回答