2012-12-28 64 views
0

這是我的代碼,用於在10x10掃雷遊戲板中生成隨機地雷。一維到二維,無限循環

for (int j = 0; j < 10; j++) { 
     mine[j] = (int) (Math.random() * 100); 
     while (board[mine[j]] != 99) 
      board[mine[j]] = 99; 
    } 

我想修改它在2D int數組工作:

for (int j = 0; j < 10; j++) { 
     do { 
      temp = (int) (Math.random() * 100); 
      row = temp/10; 
      column = temp % 10; 
     } while (board[row][column] != 99); 
     board[row][column] = 99; 
    } 

但是這個代碼,創建了一個無限循環。我堅持,我想不出爲什麼它不工作

+3

我認爲你需要'如果'你在哪裏使用'while'。 – Mahesh

+0

嘗試,直到你找到一個空白字段並不是最好的方式[想一想] – MrSmith42

+1

爲什麼你有for循環for(int j = 0; j <1; j ++)'?它只會運行一次 – bane

回答

3

我想你的意思是:while條件是錯誤的,你爲什麼要設定一個領域,已經是99〜99]

for (int j = 0; j < 1; j++) { 
    do { 
     temp = (int) (Math.random() * 100); 
     row = temp/10; 
     column = temp % 10; 
    } while (board[row][column] == 99); 
    board[row][column] = 99; 
} 
0

爲什麼你的代碼創建一個無限循環?最初沒有一個單元格的值爲99,而您的do_while條件爲while (board[row][column] != 99);。因此,循環將繼續迭代,因爲它永遠不會遇到值爲99的單元格。
您的do_while條件錯誤。應該是while (board[row][column] == 99);
說明:如果當前生成的隨機單元格具有地雷,即單元格值等於99,則將重新生成行和列號。do_while循環將繼續運行,直到生成的單元格位置不生效已經有一個地雷。
我相信這是你想要做的。
請注意,您的地雷生成算法不是最優的。有更好的方法來做到這一點。

0

句法上你的問題是在while條件下,但是你的算法也不是最優的,因爲已放置炸彈的碰撞會越來越頻繁。在極端情況下,必須填補董事會中除一個職位以外的所有職位,否則您可能需要多次重新投票才能獲得免費席位。

最好從僅包含空閒位置的集合中繪製插槽。

// create an array of slots to draw ten slots from 
    int[] slots = new int[100]; 
    for (int i = 0; i < slots.length; i++) { 
     slots[i] = i; 
    } 

    /* 
    * draw ten slots by placing them at the start of the array 
    * subsequent draws will draw from the tail of the array 
    */ 
    Random random = new Random(); 
    for (int i = 0; i < 10; i++) { 
     // draw from one of the slots from the tail 
     int draw = random.nextInt(100 - i) + i; 

     // switch values at draw and i index 
     int temp = slots[draw]; 
     slots[draw] = slots[i]; 
     slots[i] = temp; 

     // use the draw to place a bomb on the board 
     board[(draw/10)][(draw % 10)] = 99; 
    }