我正在尝试用c++创建一个井字游戏
到目前为止,我已经设置了玩家和程序轮流出现的地方。程序的移动由rand()%10
决定。生成数字1-9,tic tac toe中每个盒子对应一个数字。
但是这变成了一个问题,因为最终它会选择一个已经被填充的框。这似乎总是导致一个Segmentation Fault
。
是否有办法限制rand()
的盒子是空的?我试过了,但他们似乎被忽视了。然后我必须让rand()
继续尝试,直到它生成一个与空框对应的随机数。
void program_move(){
std::cout<<"My turn!n";
srand (time(NULL));
move = rand()%10;
if (boxes[move-1]!="x"&&boxes[move-1]!="o") {
boxes[move-1]="o";
}
else{while(boxes[move-1]=="x"||boxes[move-1]=="o")
{
srand (time(NULL));
move = rand()%10;
boxes[move-1]="o";
}
}
rand()%10
生成0-9
。所以move
可以变成0
。在这种情况下,访问boxes[move-1]
是越界的。
你可以尝试变换索引,而不是限制随机生成器。
即std::vector<int> indices(10);
std::iota(indices.begin(), indices.end(), 0);
std::random_device rd;
std::mt19937 gen(rd());
std::shuffle(indices.begin(), indices.end(), gen);
for(auto i : indices)
boxes[i] = "o";
注。如果您的boxes
'大小为9,则必须在上述代码中将indices
'大小更改为9
。
如果您希望所有数字都包含相同位数,则必须创建大量随机数。或者使用c++ 11中引入的一些新功能,比如std::uniform_int_distribution类:
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(100000000, 999999999);
for (int n = 1; n <= 5; ++n)
std::cout << "random number " << n << " = " << dis(gen) << 'n';
你也可以只设置输出的宽度,并用前导零填充它:
std::cout << std::setw(10) << std::setfill('0') << std::rand() << 'n';