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

井字棋代码问题:获胜条件触发后无法终止while循环求排查

井字棋获胜检测失效问题修复

问题现象

编写井字棋代码时,当某一方达成三子连线的获胜条件,代码无法识别该状态,while循环会继续执行。检测函数(row/column/diagonal)在满足条件时确实返回True,但后续if语句无法触发终止逻辑,且标记获胜方的aa/bb变量始终未生效。

原代码

board = [["-", "-","-"],["-","-","-"],["-","-","-"] ]
win = False
count = 0
aa = None
bb = None
def printboard():
  print(board[0][0],"|", board[0][1],"|",board[0][2])
  print("_", "  _ ", " _ " )
  print(board[1][0],"|", board[1][1],"|",board[1][2])
  print("_", "  _ ", " _ ")
  print(board[2][0],"|", board[2][1],"|",board[2][2])
def row(board):
  for i in board:
    if i[0] == i[1] == i[2]:
      if i[0] == "x":
        aa = True
        return True
      if i[0] == "o":
        bb = True
        return True
  return False

def column(board):
  for j in range(0,3):
    if board[0][j] == board[1][j] == board[2][j]:
      if board[0][j] == "x":
        aa = True
        return True
      if board[0][j] == "o":
        bb = True
        return True
  return False

def diagonal(board):
  if board[0][0] == board[1][1] == board[2][2]:
    if board[0][0] == "x":
      aa = True
      return True
    if board[0][0] == "o":
      bb = True
      return True
  if board[0][2] == board[1][1] == board[2][0]:
     if board[0][2] == "x":
      aa = True
      return True
     if board[0][2] == "o":
      bb = True
      return True
  return False

while count < 10 and win == False:
  x1 = int(input("Choose row "))
  y1 = int(input("Choose column "))
  x2 = int(input("Choose row "))
  y2 = int(input("Choose column "))
  board[x1][y1] = "x"
  board[x2][y2] = "o"
  printboard()
  row(board)
  diagonal(board)
  print(row(board))
  print(column(board))
  print(diagonal(board))
  if row(board) is True or column(board) is True or diagonal(board) is True:
    if aa == True:
      print("Player 1 wins!")
      win = True
      break
    if bb == True:
      print("Player 2 wins!")
      win = True
      break
  else:
      continue
  count += 1 

问题根源

  1. 变量作用域错误:函数row/column/diagonal中修改的aa、bb是局部变量,不会影响全局的aa、bb变量,导致后续判断aa == True或bb == True永远不成立。
  2. 重复调用检测函数:每次判断获胜时多次调用row/column/diagonal,不仅冗余,而且每次调用都会重新遍历棋盘,没有复用结果。
  3. 回合逻辑错误:当前循环中每次同时让x和o各走一步,不符合井字棋轮流下棋的规则,容易导致状态混乱。

修复方案

方案1:修正变量作用域(不推荐,全局变量易维护性差)

在每个检测函数开头声明global aa, bb,让函数内的修改作用于全局变量:

def row(board):
  global aa, bb
  # 后续代码不变

方案2:让检测函数返回获胜方(推荐,无全局变量)

重构检测函数,直接返回获胜的玩家("x"/"o")或None,简化逻辑:

board = [["-", "-","-"],["-","-","-"],["-","-","-"] ]
win = False
count = 0

def printboard():
  print(board[0][0],"|", board[0][1],"|",board[0][2])
  print("_", "  _ ", " _ " )
  print(board[1][0],"|", board[1][1],"|",board[1][2])
  print("_", "  _ ", " _ ")
  print(board[2][0],"|", board[2][1],"|",board[2][2])

def check_win(board):
  # 检测行
  for row in board:
    if row[0] == row[1] == row[2] != "-":
      return row[0]
  # 检测列
  for j in range(3):
    if board[0][j] == board[1][j] == board[2][j] != "-":
      return board[0][j]
  # 检测对角线
  if board[0][0] == board[1][1] == board[2][2] != "-":
    return board[0][0]
  if board[0][2] == board[1][1] == board[2][0] != "-":
    return board[0][2]
  # 无获胜方
  return None

# 修正回合逻辑,轮流下棋
current_player = "x"
while count < 9 and not win:
  print(f"Player {1 if current_player == 'x' else 2}'s turn")
  x = int(input("Choose row (0-2): "))
  y = int(input("Choose column (0-2): "))
  # 检查位置是否为空
  if board[x][y] != "-":
    print("This position is taken, choose another!")
    continue
  board[x][y] = current_player
  printboard()
  winner = check_win(board)
  if winner:
    print(f"Player {1 if winner == 'x' else 2} wins!")
    win = True
    break
  # 切换玩家
  current_player = "o" if current_player == "x" else "x"
  count += 1
if not win:
  print("It's a tie!")

修复说明

  • 合并三个检测函数为check_win,直接返回获胜方,避免冗余代码和全局变量。
  • 修正回合逻辑,实现玩家轮流下棋,符合井字棋规则。
  • 添加位置合法性检查,防止玩家重复落子。
  • 减少函数调用次数,只在每次落子后调用一次获胜检测。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:57:15