Python井字棋异常边界案例处理:无效输入与重复落子bug排查求助
井字棋边界故障修复方案
问题根因
- 回合错误切换问题:
analyzeMove函数校验落子失败时直接递归调用main(),相当于重启整个游戏流程,无论当前处于哪个玩家的回合,重启后都会回到玩家1的落子阶段,同时递归调用会持续堆积调用栈,存在溢出风险。 - 落子覆盖问题:
analyzeMove函数的判断顺序存在逻辑漏洞,先判断落子是否在合法位置列表就直接返回结果,根本不会执行后续「是否已被占用」的校验逻辑,导致已占用的位置可以被重复写入。
修复要点
- 调整
analyzeMove校验顺序:先判断是否为合法位置,再判断是否已被占用,校验失败返回布尔值False,不修改全局执行流程 - 为单个玩家的落子逻辑增加循环校验,校验不通过时始终让当前玩家重试,不切换回合
- 移除递归调用
main()的错误逻辑,避免流程混乱和栈溢出
修复后完整代码
possibleTurns = ("A1","A2","A3","B1","B2","B3","C1","C2","C3") movesUsed = [] def main(): players = ["X","O"] while len(movesUsed) <9: # 玩家1落子,校验不通过持续重试 while True: turnp1 = input(f"Choose a move Player 1: ") print(f"Your move was: {turnp1}") validMove = analyzeMove(turnp1) if validMove: break move(validMove,players[0]) score() movesUsed.append(validMove) # 提前判断是否满步,避免玩家1落子后已满局还提示玩家2落子的额外问题 if len(movesUsed) >=9: break # 玩家2落子,校验不通过持续重试 while True: turnp2 = input(f"Choose a move Player 2: ") print(f"Your move was: {turnp2}") validMove = analyzeMove(turnp2) if validMove: break move(validMove,players[1]) score() movesUsed.append(validMove) def analyzeMove(themove): move_upper = themove.upper() # 先校验位置合法性 if move_upper not in possibleTurns: print("Invalid Move") return False # 再校验位置是否已被占用 if move_upper in movesUsed: print("That move was used!") return False # 校验通过返回标准化大写落子值 return move_upper
注:代码中
move()、score()为原有落子写板、算分逻辑,保持原有实现即可。
内容的提问来源于stack exchange,提问作者madil26
相关产品推荐
相关产品推荐

