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

如何在类XCOM简化游戏的MinMax算法中实现移动与攻击选择

类XCOM战棋游戏MinMax算法中移动/攻击二选一逻辑实现问题

我开发了一款类XCOM的简化战棋游戏,玩家可在网格上移动,或攻击射程内的敌人。目前已实现MinMax算法,通过遍历move HashSet处理移动逻辑,但还存在独立的attack HashSet(攻击范围与移动范围不同)。请问如何实现移动与攻击的二选一逻辑?是在移动循环下方调用另一个MinMax,还是在移动循环内新增攻击循环?

当前代码片段:

if (depth == 0 || GM.checkWin() != 0)
{
    return GM.evaluateScore(map) ;
}
HashSet<Node> moves = map.getActualMovementOptions();
HashSet<Node> attacks = map.getUnitAttackOptions();

if (maxPlayer)
{
    double bestScore = double.MinValue;
    foreach (Node m in moves)
    {
        map.doMove(m);
        double score = minimax(map, false, depth - 1, alpha, beta);
        Debug.Log("score :" + score);
        
        map.redoMove(m);
        bestScore = Math.Max(score, bestScore);
        alpha = Math.Max(alpha, bestScore);
        Debug.Log("bestscroe: " + bestScore);
        if (beta <= alpha)
        {
            break;
        }
    }
    return bestScore;
}

实现方案:平级处理移动与攻击动作

不用单独调用另一个MinMax,也不需要嵌套循环,直接把移动和攻击视为同一层级的可选动作,在同一个逻辑分支里平级遍历即可——这样MinMax会自动处理“二选一”的决策(每回合只能执行一个动作)。

修改后的核心代码:

if (depth == 0 || GM.checkWin() != 0)
{
    return GM.evaluateScore(map);
}
HashSet<Node> moves = map.getActualMovementOptions();
HashSet<Node> attacks = map.getUnitAttackOptions();

if (maxPlayer)
{
    double bestScore = double.MinValue;
    // 遍历所有移动动作
    foreach (Node m in moves)
    {
        map.doMove(m);
        double score = minimax(map, false, depth - 1, alpha, beta);
        Debug.Log("移动得分:" + score);
        
        map.redoMove(m);
        bestScore = Math.Max(score, bestScore);
        alpha = Math.Max(alpha, bestScore);
        if (beta <= alpha) break;
    }
    // 平级遍历所有攻击动作
    foreach (Node a in attacks)
    {
        map.doAttack(a); // 需要实现对应的攻击状态修改方法
        double score = minimax(map, false, depth - 1, alpha, beta);
        Debug.Log("攻击得分:" + score);
        
        map.redoAttack(a); // 实现攻击状态回滚方法
        bestScore = Math.Max(score, bestScore);
        alpha = Math.Max(alpha, bestScore);
        if (beta <= alpha) break;
    }
    return bestScore;
}

关键注意事项

  • 确保doAttack和redoAttack的逻辑与doMove/redoMove对齐,能正确修改、回滚游戏状态(比如敌人血量、单位位置等)
  • 移动和攻击是互斥动作,平级循环能让MinMax遍历所有可能的单步动作,选出最优决策
  • alpha-beta剪枝逻辑在两个循环中都要保留,避免无效计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:27:20