You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我的四子棋alpha-beta剪枝算法出现决策错误,是什么原因?

代码存在的核心问题

    1. bestMove调用minimax时参数错误
      你在bestMove函数中模拟AI落子后,接下来应该轮到人类玩家(极小化方)行动,但你调用minimax时第三个参数传了true(代表极大化方回合),逻辑完全颠倒,导致整个博弈树计算错误。
      修改方案:把调用参数改为false即可。
    1. 估值函数的胜负分值逻辑错误
      当前你赢局返回depth、输局返回-depth,会导致AI认为越晚赢收益越高、越晚输损失越小,完全不符合博弈逻辑:AI应该优先选择最快赢的走法,优先阻挡对手最快赢的走法。
      修改方案:把胜负返回的分值调整为和深度正相关的固定高分值,保证近的赢收益更高,近的输损失更大。
    1. 缺失头文件引用
      代码中用到了INT_MIN和INT_MAX,但没有引入对应的头文件<climits>,部分编译器会触发未定义行为。
    1. 可选适配:如果是传统带重力的四子棋,你当前的落子逻辑错误,不能随便选任意空位落子,只能选择每列最顶部的空位落子,需要修改遍历逻辑。如果是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:54:01