我正在尝试使用alpha-beta修剪实现tic tac toe的minimax算法。现在我正在运行该程序,但它似乎没有工作。每当我运行它时,它似乎在所有方块中输入垃圾。我已经实现了它,以便我的minimax函数进入板状态并修改该状态,以便在完成时,板状态包含下一个最佳移动。然后,我将'this'设置为等于修改后的板。以下是我对minimax算法的函数:
void board::getBestMove() {
board returnBoard;
miniMax(INT_MIN + 1, INT_MAX -1, returnBoard);
*this = returnBoard;
}
int board::miniMax(int alpha, int beta, board childWithMaximum) {
if (checkDone())
return boardScore();
vector<board> children = getChildren();
for (int i = 0; i < 9; ++i) {
if(children.empty()) break;
board curr = children.back();
if (curr.firstMoveMade) { // not an empty board
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;
}
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;
}
如果有人想尝试运行它,这是我的完整文件:
.cpp:http://pastebin.com/ydG7RFRX .h:http://pastebin.com/94mDdy7x
答案 0 :(得分:1)
您的代码可能存在许多问题...您确实发布了很多问题。因为您在问自己的问题,所以您有责任首先尝试自己可以做的一切,然后将问题减少到澄清正在发生的事情所需的最少量的代码。事实上,我觉得你没有花太多精力去问这个问题。
但也许我仍然可以提供一些帮助:
void board::getBestMove() {
board returnBoard;
miniMax(INT_MIN + 1, INT_MAX -1, returnBoard);
*this = returnBoard;
}
了解您的意见*this = returnBoard
。
这一定意味着您希望从miniMax
获得一块电路板。
但是看看如何定义miniMax
!
int board::miniMax(int alpha, int beta, board childWithMaximum)
它通过pass by value接受childWithMaximum
,因此无法以这种方式退回董事会。
你想说的可能是:
int board::miniMax(int alpha, int beta, board & childWithMaximum)