2013-07-05 66 views
-1

基本上,我有一個6x6板。我創建了一個函數,它應該在電路板上放置三個X隨機座標。陣列中的不一致隨機化

const int size = 6; 

char board[6][6] = {0}; //this is actually somewhere else, but I included it here for clarity 

char enemies[3] = {'X','X','X'}; 

void setup(char board[6][6]){ 

bool valid = false; //sets initial bool value to false 

for (int x = 0; x <= 2; ++x){ 
    do{ 
    int a = rand() % size; 
    int b = rand() % size; 
    if (board[a][b] == 0){ 
    board[a][b] = enemies[x]; 
    valid = true;  
     } 
    }while(!valid); //if the value is false, redo until an empty board space is found 
} 

(我包括在主要功能和函數srand(時間(NULL)))

它的工作原理,但只是偶爾。有時它會產生3個隨機放置的X,有時只有2個。我希望它每次產生3個X。我已經完成了一百萬次,嘗試了微小的變化和更正,但我似乎無法弄清楚什麼是錯誤的。如果棋盤空白(棋盤[a] [b] == 0),我只包含一個條件,只能將敵人放置[x],但有時候它只會放置2個X。

+0

爲了找出問題,您應該在調試器中逐行執行,密切關注所有變量的值。 –

回答

0

放置第一個X之後,valid對於for循環的所有後續迭代都保持爲真,即使尚未找到有效的正方形。

我改變了迭代變量i(使用x意味着比其他序號的東西時,你使用的二維座標只是混淆),固定你內心的重試循環:

for (int i = 0; i <= 2; ++i) { 
    // loop until we find a valid coordinate 
    while(true) { 
     int a = rand() % size; 
     int b = rand() % size; 
     if (board[a][b] == 0){ 
      board[a][b] = enemies[i]; 
      break; // we found one! 
     }         
    } 
} 
+0

感謝大家的答案。 – Tempto

0

你是不是重置外循環內的valid標誌。所以,一旦你放置了第一塊,你就沒有正確處理重複。

for (int x = 0; x <= 2; ++x) 
{ 
    valid = false;   // <-- you forgot to do this. 
    do 
    { 
     int a = rand() % size; 
     int b = rand() % size; 
     if (board[a][b] == 0) 
     { 
      board[a][b] = enemies[x]; 
      valid = true;  
     } 
    } while(!valid); 
} 
0

在每次運行do/while循環後,您需要重置valid。第一次迭代後(當x爲0時),valid將被設置爲true。你永遠不會將它重置爲假,所以在下一次迭代中(從x開始爲1),valid將被設置爲true。這意味着您可以選擇一個已經標記的隨機座標,然後繼續進行下一個x

這意味着完全有可能只有一個平方米已被標記,但其可能性很低(1,225中的1個,如果我的數學正確的話)。