如何在类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
相关产品推荐
相关产品推荐

