我正在尝试编写一个AI来玩ConnectK(连接4游戏,需要连接k个部分,重力可以打开或关闭)。这是我使用Minimax算法获得最佳移动的功能。
struct MoveNode //This struct is defined in header file
{
MoveNode() {};
MoveNode(int Score) : score(Score) {}
Move move;
int score;
};
MoveNode AIShell::getBestMove(int depth, int player) {//Find the best move using MiniMax
if (depth <= 0)
return MoveNode(heuristic());
else if (boardIsFull() && getWinner() == 0)//Tie
return 0;
else if (getWinner() == AI_PIECE)
return 100000;
else if (getWinner() == HUMAN_PIECE)
return -100000;
std::vector<MoveNode> mds;
for (auto i : getMoveList()) {//For each available move
MoveNode md;
md.move = i; //i is Move(col,row)
gameState[i.col][i.row] = player;
if (player == AI_PIECE) {
md.score = getBestMove(depth - 1, HUMAN_PIECE).score;
}
else {
md.score = getBestMove(depth - 1, AI_PIECE).score;
}
mds.push_back(md);
}
//Get the best move after recursion
int best_move_index = 0;
if (player == AI_PIECE) {
int best_score = -1000000;
for (int i = 0; i < mds.size(); i++) {
if (mds[i].score > best_score) {
best_move_index = i;
best_score = mds[i].score;
}
}
} else if (player == HUMAN_PIECE) {
int best_score = 1000000;
for (int i = 0; i < mds.size(); i++) {
if (mds[i].score < best_score) {
best_move_index = i;
best_score = mds[i].score;
}
}
}
return mds[best_move_index];
}
getBestMove()函数似乎正在做一些我不太喜欢的事情。该函数将尝试在递归之前获得最佳移动,并且AI转向和人类转向不会被递归地均匀处理。我花了很长时间调试这个功能,但仍然无法解决这个问题。抱歉我的英语不好,但我真的很感激这里的帮助。提前致谢。
答案 0 :(得分:0)
您正在返回最佳移动指数。 minimax树必须返回节点值(best_score),而不是最佳移动。您应该返回最佳移动的唯一时间是在根节点处,以便通过为您提供最佳移动来终止搜索。