如何用Python实现Nim游戏的Minimax算法?递归实现结果异常求助
用Python实现Nim游戏的Minimax算法(附问题排查)
嘿,刚接触递归和Minimax确实容易绕得头晕,我来帮你理清楚Nim游戏里的Minimax逻辑,顺便找找你返回值不对的问题~
首先得明确Nim游戏的核心规则(咱们假设是经典的1-3取石子玩法:每次可以拿1、2、3颗,取最后一颗的人赢),以及Minimax算法的本质:这是个零和游戏,两个玩家分别是「最大化玩家」(想让自己的得分最高,赢的话得100分)和「最小化玩家」(想让对手的得分最低,也就是让自己的损失最小,输的话得-100分)。递归的过程就是模拟双方轮流选择最优走法的过程。
正确的Minimax实现代码
def minimax(n, is_maximizing): # 终止条件:当前玩家能直接取完所有石子,赢了 if n <= 3: return 100 if is_maximizing else -100 if is_maximizing: best_score = -float('inf') # 遍历所有合法取法 for take in [1, 2, 3]: # 递归调用,轮到对手(最小化玩家)行动 score = minimax(n - take, False) # 最大化玩家选得分最高的走法 best_score = max(best_score, score) return best_score else: best_score = float('inf') for take in [1, 2, 3]: score = minimax(n - take, True) # 最小化玩家选得分最低的走法(对对手最不利) best_score = min(best_score, score) return best_score # 测试案例 print(minimax(5, True)) # 输出100(先手能赢) print(minimax(4, True)) # 输出-100(先手必败)
你返回值异常的常见原因
结合你说的递归逻辑问题,大概率是这几个点搞反了:
- 最大化/最小化分支的选择逻辑搞反:比如在最大化玩家的代码块里用了
min()而不是max(),导致本该选最优的赢法,结果选了最差的输法。 - 终止条件的返回值搞反:比如当玩家能直接赢的时候,给最大化玩家返回了-100,给最小化玩家返回了100,完全颠倒了胜负得分。
- 递归传递的玩家状态错了:比如调用递归时把
is_maximizing的布尔值传反了,导致玩家身份混乱,得分逻辑自然出错。
调试递归的小技巧
刚学递归最头疼的就是看不到内部流程,你可以在函数开头加一行打印,跟踪每一步的递归状态:
def minimax(n, is_maximizing): print(f"当前石子数:{n},当前玩家是最大化玩家?{is_maximizing}") # 后面的代码不变...
这样就能清晰看到每一步的玩家身份和剩余石子数,很容易定位到哪一步的逻辑偏离了预期。
内容的提问来源于stack exchange,提问作者Vural Erdogan
相关产品推荐
相关产品推荐

