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

井字棋TicTacToe棋盘状态检测代码运行异常,如何排查修复?

井字棋获胜判断代码问题分析及修复

现有代码问题

  • 预设获胜组合存在无效项:winning_moves列表中包含[[1,0],[2,1],[3,1]]错误组合,井字棋行/列坐标取值范围仅为0~2,不存在坐标3,该位置应为第三列获胜组合[[0,2],[1,2],[2,2]]。
  • 匹配逻辑存在根本性错误:match函数将玩家所有落子排序后直接和获胜组合做全等对比,仅在玩家刚好落子3次且完全匹配某一获胜组合时才能判断成功,当玩家落子数大于3时,长度不匹配永远返回False,完全无法覆盖正常对局场景。
  • 列表排序对比的实现易出错:直接对比列表需要严格保证顺序一致,即使修复长度问题,也需要对每个获胜组合提前排序才能匹配成功。

修复后代码

def match(player_moves, winning_combinations):
    # 把玩家落子转成元组集合,方便快速判断包含关系
    move_set = set(tuple(m) for m in player_moves)
    for combo in winning_combinations:
        # 判断获胜组合的所有位置都在玩家落子中即可,不限制玩家总落子数
        if all(pos in move_set for pos in combo):
            return True
    return False

def ticTacToeWinner(moves, n):
    p1 = []
    p2 = []
    # 修正错误的获胜组合,所有组合提前转成元组方便匹配
    winning_moves = [
        ((0,0),(0,1),(0,2)),
        ((1,0),(1,1),(1,2)),
        ((2,0),(2,1),(2,2)),
        ((0,0),(1,0),(2,0)),
        ((0,1),(1,1),(2,1)),
        ((0,2),(1,2),(2,2)),
        ((0,0),(1,1),(2,2)),
        ((0,2),(1,1),(2,0)),
    ]

    # 分离双方落子
    for i in range(n):
        if i % 2 == 0:
            p1.append(moves[i])
        else:
            p2.append(moves[i])

    # 校验获胜方
    if len(p1) >= 3 and match(p1, winning_moves):
        return 'player1'
    if len(p2) >= 3 and match(p2, winning_moves):
        return 'player2'
    
    # 无获胜方时判断平局/未结束
    return 'draw' if n == 9 else 'uncertain'

内容的提问来源于stack exchange,提问作者John Vladimir Monge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:06:03