【发布时间】:2014-02-03 02:05:10
【问题描述】:
我目前正在为井字游戏实现MiniMax Algorithm 和Alpha Beta Pruning。
我的算法采用一个空棋盘,最后该棋盘包含与当前棋盘相同的状态,以及下一步行动。然后,我只是让*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;
}
我已经进行了一些打印语句调试,看来这个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() 函数并没有使返回板等于下一步。
【问题讨论】:
标签: c++ algorithm infinite-loop tic-tac-toe