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

C# WinForms井字棋Minimax算法失效修复咨询

井字棋Minimax算法修复方案

核心问题分析

你的AI未做出最优落子,根源在于AI落子逻辑的目标判断完全搞反,同时评估函数未考虑深度权重,导致算法无法区分不同获胜/失败路径的优先级。


具体修复步骤

1. 修正评估函数(加入深度权重)

原评估函数仅返回固定得分,无法让AI优先选择最快获胜或最慢失败的路径。修改后加入深度参数,调整得分权重:

int evaluate(int[] grid, int depth)
{
    // 检查横向获胜
    for(int i = 0; i < 9; i += 3)
    {
        if (grid[i] == 0) continue;
        if (grid[i] == grid[i + 1] && grid[i] == grid[i + 2])
            return grid[i] == 1 ? (10 - depth) : (-10 + depth);
    }

    // 检查纵向获胜
    for (int i = 0; i < 3; i++)
    {
        if (grid[i] == 0) continue;
        if (grid[i] == grid[i + 3] && grid[i] == grid[i + 6])
            return grid[i] == 1 ? (10 - depth) : (-10 + depth);
    }

    // 检查对角线获胜(拆分逻辑避免误判)
    if (grid[0] != 0 && grid[0] == grid[4] && grid[4] == grid[8])
        return grid[0] == 1 ? (10 - depth) : (-10 + depth);
    
    if (grid[2] != 0 && grid[2] == grid[4] && grid[4] == grid[6])
        return grid[2] == 1 ? (10 - depth) : (-10 + depth);

    return 0;
}

2. 更新Minimax函数的评估调用

将评估函数的depth参数传入,确保得分计算结合当前搜索深度:

int miniMax(int[] grid, int depth, bool isMax) 
{
    int score = evaluate(grid, depth);

    // 终止条件:当前玩家已获胜
    if (score == 10 - depth || score == -10 + depth)
        return score;

    // 无空位则平局
    if(!isMovesLeft(grid))
        return 0;

    if (isMax)
    {
        int best = int.MinValue;

        for(int i = 0; i < grid.Length; i++)
        {
            if (grid[i] == 0)
            {
                grid[i] = 1; // 人类玩家落子

                best = Math.Max(best, miniMax(grid, depth + 1, !isMax));

                grid[i] = 0; // 回溯
            }
        }

        return best;
    }
    else
    {
        int best = int.MaxValue;

        for (int i = 0; i < grid.Length; i++)
        {
            if (grid[i] == 0)
            {
                grid[i] = 2; // AI玩家落子

                best = Math.Min(best, miniMax(grid, depth + 1, !isMax));

                grid[i] = 0; // 回溯
            }
        }

        return best;
    }
}

3. 修正AI落子逻辑(核心错误修复)

原代码中AI的目标判断完全反转,AI作为玩家2(对应负得分),需要寻找能让最终得分最小的落子(-10代表AI获胜,0代表平局,10代表人类获胜):

void moveByAI()
{
    int bestScore = int.MaxValue; // 初始化为最大值,寻找更小的得分
    int bestMove = -1;

    for(int i = 0; i < 9; i++)
    {
        if (grids[i] == 0)
        {
            grids[i] = 2; // 尝试AI落子

            // 落子后轮到人类玩家(最大化得分),传入isMax=true
            int currentScore = miniMax(grids, 0, true);

            grids[i] = 0; // 回溯

            // 优先选择得分最小的落子(AI获胜>平局>失败)
            if (currentScore < bestScore)
            {
                bestScore = currentScore;
                bestMove = i;
            }
        }
    }
    
    if (bestMove != -1)
        buttons[bestMove].PerformClick();
}

4. 修复语法小问题

原评估函数中grid [i] == grid[i + 2]存在多余空格,修正为grid[i] == grid[i + 2],避免潜在编译问题。


修复后效果

AI将按照优先级做出最优落子:

  1. 优先选择能直接获胜的位置
  2. 其次选择阻止人类获胜的位置
  3. 无胜负机会时,选择引导平局的位置

内容的提问来源于stack exchange,提问作者Khoi58

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:10:26