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

井字棋(Tic Tac Toe)胜负判定函数失效,求可行实现方案

井字棋胜负判定的正确实现方式

原代码的问题分析

你的代码存在几个关键错误:

  1. 循环里的for mark in board会覆盖传入的mark参数,导致判断时用的是棋盘内的元素而非目标标记(比如'O')。
  2. 切片逻辑错误:Python列表索引从0开始,棋盘第7、8、9位对应board[6:9],你写的board[7:]只包含第8、9位,漏掉了第7位。
  3. 循环内直接返回,会导致只检查第一行就终止,无法遍历所有行。

可行的实现方式

方式一:枚举所有获胜组合(最直观)

列出井字棋所有可能的获胜位置组合,逐一验证是否存在某组全为目标标记:

def win_check(board, mark):
    # 定义所有获胜位置的索引组合(索引从0开始)
    win_combinations = [
        # 行
        [0, 1, 2],
        [3, 4, 5],
        [6, 7, 8],
        # 列
        [0, 3, 6],
        [1, 4, 7],
        [2, 5, 8],
        # 对角线
        [0, 4, 8],
        [2, 4, 6]
    ]
    # 遍历每个组合,检查是否全为目标标记
    for combo in win_combinations:
        if board[combo[0]] == board[combo[1]] == board[combo[2]] == mark:
            return True
    # 无获胜情况返回False
    return False

方式二:分模块检查行、列、对角线

拆分逻辑,分别验证行、列、对角线的获胜条件:

def win_check(board, mark):
    # 检查行:每3个元素为一行
    for i in range(0, 9, 3):
        if board[i] == board[i+1] == board[i+2] == mark:
            return True
    # 检查列:每列间隔3个元素
    for i in range(3):
        if board[i] == board[i+3] == board[i+6] == mark:
            return True
    # 检查两条对角线
    if board[0] == board[4] == board[8] == mark:
        return True
    if board[2] == board[4] == board[6] == mark:
        return True
    # 无获胜情况返回False
    return False

方式三:仅修复行检查的简化版本

如果只需要先实现正确的行检查功能,修复后的代码如下:

def win_check(board, mark):
    # 遍历三行,每行取3个连续元素
    for i in range(3):
        row = board[i*3 : (i+1)*3]
        if all(cell == mark for cell in row):
            return True
    return False

测试示例(假设棋盘索引0-8对应第1-9位):

board = ['', '', '', '', '', '', 'O', 'O', 'O']
print(win_check(board, 'O'))  # 会返回True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:40:37