如何用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"
代码解释
收集获胜连线:
- 直接把输入的3行加入
winning_lines列表 - 用
zip(*x)转置矩阵,获取3列并转成列表后加入 - 手动提取两条对角线的元素加入列表
- 直接把输入的3行加入
检测获胜玩家:
- 遍历每条连线,用
set(line)去重,若长度为1说明三个元素完全相同 - 同时确保这个元素是"x"或"o"(避免空棋盘或无效标记的干扰)
- 把符合条件的玩家加入
winners集合(自动去重,避免同一玩家多次获胜被重复统计)
- 遍历每条连线,用
返回结果:
- 如果集合里有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
相关产品推荐
相关产品推荐

