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

如何用JavaScript实现基于3个子数组的三子棋(Tic Tac Toe)获胜者检测函数?

解决三子棋获胜者判断问题的方案

嘿,作为编程初学者搞不定这个函数太正常了,我来一步步帮你实现它!

核心思路

要判断获胜者,我们需要检查所有可能的三子连线:

  • 3行
  • 3列
  • 2条对角线

然后统计满足获胜条件的玩家数量,再根据规则返回对应结果:

  • 1个玩家获胜 → 返回该玩家("x"或"o")
  • 0个玩家获胜 → 返回"draw"
  • 2个玩家同时获胜 → 返回"error"

Python 实现代码

def winner(x):
    # 收集所有可能的获胜连线
    winning_lines = []
    
    # 添加3行
    winning_lines.extend(x)
    
    # 添加3列(zip(*x)会把列转成元组,转成列表方便后续处理)
    winning_lines.extend([list(col) for col in zip(*x)])
    
    # 添加2条对角线
    winning_lines.append([x[0][0], x[1][1], x[2][2]])
    winning_lines.append([x[0][2], x[1][1], x[2][0]])
    
    # 统计获胜的玩家
    winners = set()
    for line in winning_lines:
        # 检查这条线是否三个元素相同,且是有效的玩家标记(x或o)
        if len(set(line)) == 1 and line[0] in ['x', 'o']:
            winners.add(line[0])
    
    # 根据获胜玩家数量返回结果
    if len(winners) == 2:
        return "error"
    elif len(winners) == 1:
        return winners.pop()
    else:
        return "draw"

代码解释

  1. 收集获胜连线:

    • 直接把输入的3行加入winning_lines列表
    • 用zip(*x)转置矩阵,获取3列并转成列表后加入
    • 手动提取两条对角线的元素加入列表
  2. 检测获胜玩家:

    • 遍历每条连线,用set(line)去重,若长度为1说明三个元素完全相同
    • 同时确保这个元素是"x"或"o"(避免空棋盘或无效标记的干扰)
    • 把符合条件的玩家加入winners集合(自动去重,避免同一玩家多次获胜被重复统计)
  3. 返回结果:

    • 如果集合里有2个玩家 → 说明同时存在x和o的获胜连线,返回"error"
    • 如果集合里有1个玩家 → 返回该玩家的标记
    • 否则返回"draw"表示平局

测试示例

  • 你提供的输入:
    x = [["x","o","x"],["o","x","o"],["o","o","x"]]
    print(winner(x))  # 输出: "x"
    
  • 双获胜者的错误情况:
    x = [["x","x","x"],["o","o","o"],["","",""]]
    print(winner(x))  # 输出: "error"
    
  • 平局情况:
    x = [["x","o","x"],["x","o","o"],["o","x","o"]]
    print(winner(x))  # 输出: "draw"
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:19:10