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

Python Tic-Tac-Toe程序:如何更高效检测玩家三连获胜?

井字棋获胜检测的代码优化与性能分析

原代码存在的问题

  1. 全局变量作用域问题:winner是全局变量,但checkIfWon函数内直接赋值时未声明global winner,会导致函数内创建局部变量,无法修改全局的winner值。
  2. 冗余检查逻辑:每次调用checkIfWon都会遍历所有行、列和对角线,即便已经找到获胜条件也会继续执行;同时循环内先后调用checkIfWon(1)和checkIfWon(2),会重复检查整个棋盘两次。
  3. 代码重复冗余:行、列、对角线的检查逻辑重复,没有复用性,后续修改规则成本高。

代码简化方案

可以把所有可能的获胜连线(3行、3列、2条对角线)预定义为坐标组合列表,统一遍历检查,让代码更简洁易维护:

board = [
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0]
]
winner = 0

def check_winner():
    # 定义所有获胜连线的坐标组合
    winning_lines = [
        # 行
        [(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 line in winning_lines:
        vals = [board[x][y] for x, y in line]
        # 排除空值(0),检查是否全为同一玩家
        if vals[0] != 0 and all(v == vals[0] for v in vals):
            return vals[0]
    # 无获胜者返回0
    return 0

run_game = True

while run_game:
    # 游戏核心逻辑(玩家落子等)
    winner = check_winner()
    if winner != 0:
        print(f"玩家{winner}获胜!")
        run_game = False

性能分析

对于井字棋这种极小的棋盘(仅9个格子),无论哪种实现方式,性能差异都可以忽略不计——最多只需要检查8条连线,每条连线仅3个元素,计算量微乎其微。相比性能,代码的可读性、可维护性优先级更高,上面的简化方案把所有获胜规则集中在一处,后续如果调整规则(比如扩展为4连玩法)也更容易修改。

原代码的实现本身性能没有问题,只是代码结构可以进一步优化。

内容的提问来源于stack exchange,提问作者jand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:27:32