我的四子棋alpha-beta剪枝算法出现决策错误,是什么原因?
代码存在的核心问题
bestMove调用minimax时参数错误
你在bestMove函数中模拟AI落子后,接下来应该轮到人类玩家(极小化方)行动,但你调用minimax时第三个参数传了true(代表极大化方回合),逻辑完全颠倒,导致整个博弈树计算错误。
修改方案:把调用参数改为false即可。
- 估值函数的胜负分值逻辑错误
当前你赢局返回depth、输局返回-depth,会导致AI认为越晚赢收益越高、越晚输损失越小,完全不符合博弈逻辑:AI应该优先选择最快赢的走法,优先阻挡对手最快赢的走法。
修改方案:把胜负返回的分值调整为和深度正相关的固定高分值,保证近的赢收益更高,近的输损失更大。
- 估值函数的胜负分值逻辑错误
- 缺失头文件引用
代码中用到了INT_MIN和INT_MAX,但没有引入对应的头文件<climits>,部分编译器会触发未定义行为。
- 缺失头文件引用
- 可选适配:如果是传统带重力的四子棋,你当前的落子逻辑错误,不能随便选任意空位落子,只能选择每列最顶部的空位落子,需要修改遍历逻辑。如果是4x4无重力的四子连珠则不需要调整。
核心代码修改示例
首先补全头文件:
#include <iostream> #include <vector> #include <climits> // 新增头文件 using namespace std;
修改minimax函数的估值返回部分:
if (result.first != false || depth == 0) { if (result.second == aiMark) { return 1000 + depth; // AI赢,越早赢分值越高 } else if (result.second == hMark) { return -1000 - depth; // 人类赢,越早输扣分越多 } else { return 0; // 平局或深度为0 } }
修改bestMove中的minimax调用参数:
int score = minimax(grid, 8, false, aiMark, hMark, INT_MIN, INT_MAX); // 第三个参数改为false
内容的提问来源于stack exchange,提问作者Edric Antoine
相关产品推荐
相关产品推荐

