-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(time(NULL)) )

它有效,但只是有时。有时它会生成 3 个随机放置的 X,有时只生成 2 个。我希望它每次生成 3 个。我已经经历了一百万次,尝试了细微的变化和更正,但我似乎无法弄清楚哪里出了问题。我加入了一个条件,它只在棋​​盘为空白时放置敌人 [x](棋盘 [a][b] == 0),但有时由于某种原因它只放置 2 个 X。

4

3 回答 3

0

在放置第一个 Xvalid之后,对于循环的所有后续迭代for,即使没有找到有效的正方形,它仍然是 true。

我将迭代变量更改为ix当您使用 2d 坐标时,使用它表示除序数之外的其他东西只是令人困惑),并修复了您的内部重试循环:

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!
        }                                   
    } 
}
于 2013-07-05T21:25:44.243 回答
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);
}
于 2013-07-05T21:25:44.533 回答
0

每次运行 do/while 循环后,您需要重置valid. 第一次迭代后(何时x为 0),valid将设置为 true。您永远不会将其重置为 false,因此下一次迭代(从x1 开始)valid将已经设置为 true。这意味着您可能会选择一个已标记的随机坐标,然后继续进行下一个x

这意味着完全有可能只标记一个方格,但这种可能性很低(如果我的数学是正确的,则为 1,225 分之一)。

于 2013-07-05T21:25:45.253 回答