逐行解释: vector<pair<int, int>> next_moves1 = generate_next_moves(); vector<pair<int, int>> next_moves2; X1 = -1; Y1 = -1; X2 = -1; Y2 = -1; int best_score = INT_MIN; for (auto& next_move1 : next_moves1) { int x1 = next_move1.first; int y1 = next_move1.second; gridInfo[x1][y1] = currBotColor; // 针对当前的第一步落子位置进行 alpha-beta 剪枝搜索 int score1 = -alpha_beta(SEARCH_DEPTH - 1, INT_MIN, INT_MAX, -currBotColor); if (score1 > best_score) { // 如果当前位置是历史最优,则在可行的第二步落子位置中搜索 best_score = score1; next_moves2 = generate_next_moves(); for (auto& next_move2 : next_moves2) { int x2 = next_move2.first; int y2 = next_move2.second; gridInfo[x2][y2] = -currBotColor; // 针对当前的第二步落子位置进行 alpha-beta 剪枝搜索 int score2 = alpha_beta(SEARCH_DEPTH - 2, best_score, INT_MAX, currBotColor); if (score2 > best_score) { // 如果当前位置是历史最优,则更新历史最优位置为当前位置 best_score = score2; X1 = x1; Y1 = y1; X2 = x2; Y2 = y2; } gridInfo[x2][y2] = 0; } } gridInfo[x1][y1] = 0; } } cout << X1 << ' ' << Y1 << ' ' << X2 << ' ' << Y2 << endl;
时间: 2024-02-14 09:08:21 浏览: 75
Chess_Pieces_moves:它关于Chess Learn-101!
这段代码是用于实现 AI 的决策的,主要使用了 alpha-beta 剪枝算法来搜索最优解。
首先使用 `generate_next_moves()` 函数生成所有可行的第一步落子位置,并定义变量 `next_moves1` 来存储这些位置。
接下来定义变量 `next_moves2`,并将 `X1`、`Y1`、`X2`、`Y2` 这四个变量初始化为 `-1`。
然后定义变量 `best_score` 作为历史最优得分,并将其初始化为 `INT_MIN`。
接下来使用循环遍历所有第一步落子位置,对于每一个落子位置,将其标记为当前 AI 的颜色,然后进行一次 alpha-beta 剪枝搜索,搜索深度为 `SEARCH_DEPTH - 1`,评估函数是负的 alpha-beta 剪枝搜索。搜索得到的得分为 `score1`。
如果 `score1` 大于历史最优得分 `best_score`,那么更新 `best_score` 为 `score1`,然后再使用 `generate_next_moves()` 函数生成所有可行的第二步落子位置,并定义变量 `next_moves2` 来存储这些位置。
接下来使用循环遍历所有第二步落子位置,对于每一个落子位置,将其标记为对手的颜色,然后进行一次 alpha-beta 剪枝搜索,搜索深度为 `SEARCH_DEPTH - 2`,评估函数是正的 alpha-beta 剪枝搜索。搜索得到的得分为 `score2`。
如果 `score2` 大于历史最优得分 `best_score`,那么更新 `best_score` 为 `score2`,并记录当前的落子位置和要交换的位置到 `X1`、`Y1`、`X2`、`Y2` 这四个变量中。
最后撤销对手的落子和己方的落子,并输出 `X1`、`Y1`、`X2`、`Y2` 这四个变量的值,作为 AI 的最优解。
注:该代码中的 `alpha_beta()` 函数没有给出,不过可以猜测是一个递归函数,用于实现 alpha-beta 剪枝算法。
阅读全文