基本上,我有一块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个。我已经超过了它一百万次,尝试微小的变化和修正,但我似乎无法弄清楚什么是错的。如果电路板是空白的(电路板[a] [b] == 0),我在其中包含了一个条件,它只能放置敌人[x],但由于某种原因它有时只放置2个X.
答案 0 :(得分:0)
放置第一个X后,valid
对for
循环的所有后续迭代都保持为真,即使找不到有效的正方形。
我将迭代变量更改为i
(当使用2d坐标时,使用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!
}
}
}
答案 1 :(得分: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);
}
答案 2 :(得分:0)
每次运行do / while循环后,您需要重置valid
。在第一次迭代之后(x
为0时),valid
将设置为true。您永远不会将其重置为false,等等下一次迭代(从x
开始为1),valid
将被设置为true。这意味着您可以选择已标记的随机坐标,然后继续进行下一个x
。
这意味着完全有可能只会标记一个方格,但这种情况的可能性很低(如果我的数学是正确的,则在1,225中为1)。