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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 05:24:04