C ++ MiniMax算法卡在Tic Tac Toe Board的无限循环中

时间:2014-01-14 20:25:10

标签: c++ algorithm infinite-loop tic-tac-toe

我目前正在使用MiniMax Algorithm实施Alpha Beta Pruning Tic Tac Toe游戏。

我的算法接收一个空板,最后该板包含与当前板相同的状态,以及下一步移动。然后,我只是让*this(当前的董事会)等于退回的董事会。

但是,出于某种原因,我的算法陷入无限循环。这是我的miniMax功能:

int board::miniMax(int alpha, int beta, board & childWithMaximum)
{   
    if (checkDone())
        return boardScore();

    vector<board> children = getChildren();
    while (!children.empty())
    {
        board curr = children.back();

        board dummyBoard;
        int score = curr.miniMax(alpha, beta, dummyBoard);

        if (computerTurn && (beta > score)) {

            beta = score;
            childWithMaximum = *this;   
            if (alpha >= beta)
                break;

        } else if (alpha < score) {

            alpha = score;
            childWithMaximum = *this;
            if (alpha >= beta)
                break;
        }
    }
    return computerTurn ? alpha : beta;
}

我已经完成了一些print-statement调试,看来这个getChildren()帮助函数正在运行。我打印了几个孩子,树上还有其他的董事会状态:

vector<board> board::getChildren()
{
    vector<board> children;

    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 3; ++j) {
            if (getPosition(i, j) == '*') {
                //move not made here

                board moveMade(*this);
                moveMade.setPosition(i, j);             
                children.push_back(moveMade);
            }
        }
    }

    return children;
}

但是,我的miniMax()功能并没有使返回板等于下一步。

1 个答案:

答案 0 :(得分:2)

while - 循环中的说明永远不会修改children,但只有在children.empty()为真时才会停止。因此,循环内部永远不会执行或无限执行。

同样在这里:

int score = curr.miniMax(alpha, beta, dummyBoard);

您使用相同的参数递归调用该函数(但第三个除了该点之前未使用)。由于状态thisalphabeta似乎在此时保持不变(除非checkDone()getPosition()更改),否则导致无限递归。

  

然后,我只是将*(当前板)等于返回的板。

不,您只能使其他board s等于*this。我在代码中的任何位置都没有看到*this =

相关问题