这种方法在某种程度上对我有用,但问题在于运行时间。每次调用aiRandMove()
方法时,选择移动所需的时间越来越长,到了棋盘上已经有5个棋子(电脑和玩家共计)之后,程序似乎会停止响应(虽然实际上并不是这样)。
通过我的进一步调试,我意识到这应该是预料之中的,因为aiRandMove()
方法是随机选择 X 和 Y 坐标,然后测试移动是否合法。由于开放的空间越来越少,合法的移动也越来越少,因此随机生成器需要更多次失败的尝试才能生成合法的移动。
我的问题是,是否有任何方法可以修改这个过程,至少可以减少函数执行的时间?根据我的谷歌搜索和自己解决问题的经验,我认为我没有办法优化这个过程而不损害函数的“随机性”。我想过记录计算机尝试的移动数组,但这并不能解决问题,因为这不会影响rand()
生成重复数字的次数。以下是该函数的代码,这是与此问题相关的所有内容:
//Function which handles the AI making a random move requires a board
//object to test moves legality and player object to make a move with
//both are passed by reference because changes to board state and the player's
//evaluation arrays must be saved
char aiRandMove(Player &ai, Board &game){
int tryX;
int tryY; //Variables to store computer's attempted moves
bool moveMade = false;
char winner;
while(!moveMade){
srand(time(NULL));//Randomizes the seed for rand()
tryX = rand() % 3;
tryY = rand() % 3; //coordinates are random numbers between X and Y
cout << "Trying move " << tryX << ", " << tryY << endl;
if(game.isLegalMove(tryX, tryY)){
winner = game.makeMove(tryX, tryY, ai);
moveMade = true;
}
}
return winner;
}
我也试过将种子函数移出while循环(这是放在while里面“增加随机性”的,尽管这有点逻辑上的愚蠢,但结果并没有改善。
如果所有其他方法都失败了,我可能会将此方法标记为“Easy”,只有随机移动,直到我确定需要阻止或进行获胜的移动。但也许还有其他随机函数可以帮助这个问题。任何想法和评论都非常感谢!