井字棋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
相关产品推荐
相关产品推荐

