2015-08-15 47 views
0

我知道,我知道。这已被问了很多次。我不是在寻找一种算法。我认为我的算法工作不正常。扫雷随机产生地雷算法不正确

这里是我使用的算法:

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

而现在它有2个已知的bug:

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

  2. 有时候确实在第一步移动的位置产生一个地雷。

+1

有兴趣的人士,我解决了这个第一XD http://chat.stackoverflow.com/transcript/message/25104533 #25104533 – Rishav

回答

2

该错误在您的while条件。它应该是:

while (tileMatrix[x][y].hasMine() || // OR not AND 
       (moveX == x && moveY == y)); 
0

我同意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