一個無限循環,我目前正在實施與Alpha Beta Pruning一個MiniMax Algorithm的井字遊戲。C++算法極小爲井字板
我的算法會在一個空的板,並在端部具有板包含相同的狀態作爲當前板,與由下移動一起。然後,我只需將*this
(當前主板)與返回的主板相同。
然而,出於某種原因,我的算法陷入無限循環。這是我的極大極小功能:
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()
功能不使返回板等於下一步的行動。
也都子女應該有computerTurn =! parent.computerTurn ..所以它是MinMax算法而不是MinMin/MaxMax。沒有? – odedsh
@odedsh我不知道,因爲我真的不理解的代碼,但是... – Nabla
@odesh實際上SETPOSITION()中的getChildren()需要的照顧。 – gacharya