为什么我的TicTacToe游戏在生成随机移动时会卡住

时间:2013-12-16 19:05:37

标签: c++

对于我的Tic Tac Toe AI,只需要生成随机移动。我有一个AIPlayer的课程makeAMove。它只是从0 - 3(行和列)生成两个随机数,并检查是否采用了单元格。它似乎工作正常,但由于某种原因,它永远不会采取胜利的举动。在命令行上,当我试图让它获胜并且只剩下获胜的动作时,它不会采取它们 - 它只是卡住了。

另外,我认为使用1维数组会更容易使用AI,但我正在努力坚持使用2维数组。

我认为以某种方式收集另一个数组中的可用单元并从这些单元格中生成随机移动会更好。

欢迎任何建议。

这是我的AI课程:

实施档案:

#include <stdlib.h> // rand, srand
#include <time.h> // time
#include "AIPlayer.h"

AIPlayer::AIPlayer(char token) : Player(token)
{
}

void AIPlayer::makeAMove(Board &myBoard)
{
    int row;
    int column;

    bool done = false;
    do
    {
        srand (time(0));
        row = rand() % 3;
        column = rand() % 3;

        if (myBoard.getCell(row, column) == ' ')
        { 
            myBoard.setCell(row, column, getToken());
            done = true;
        }
    }
    while (!done);

    std::cout <<    "\nComputer move (" << getToken() << ")\n"
                    "row " << row << ", column " << column;
}

标题文件:

#pragma once // include guard
#include "Player.h"

class AIPlayer: public Player
{
    public:
        AIPlayer(char token);
        virtual void makeAMove(Board &myBoard);
};

1 个答案:

答案 0 :(得分:3)

在循环的每次迭代中,调用srand(time(0))。

这会根据经过的秒数重置随机数生成。

这意味着每次计算机选择相同的随机位置移动(直到秒数改变)

可能它会在大约一分钟后实际工作,但最好将srand移出循环。