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

Python3编写的井字棋代码无法正确检测获胜者是什么原因?

井字棋代码问题修复

核心错误说明

  • 获胜判定逻辑语法错误:你写的board[0] and board[1] and board[2] == board[0]不符合Python语义,实际只会判断board[2]是否等于board[0],无法校验三个位置值是否完全相等,正确判断写法为board[0] == board[1] == board[2] != "-"
  • 获胜判定函数返回值错误:columns()、diagonals()中大量分支返回了不相关的棋盘位置值,比如匹配第二列获胜时错误返回board[3],匹配对角线获胜时错误返回board[3],导致获胜玩家识别完全错误
  • 游戏流程逻辑错误:handle_turn函数内的turn为局部变量,修改后不会同步全局轮次值,导致轮次逻辑完全混乱;落子去重逻辑错误,先将位置存入已占列表再判断重复,重复时还误修改了棋盘已有棋子;获胜检测时机滞后,落子后未立即触发检测,导致获胜后多轮才判定
  • 平局判定逻辑缺失:未判断棋盘满子的平局场景,满子后不会正常结束游戏

修复后可运行代码

winner = None
already_taken = []
board = [
    "-", "-", "-",
    "-", "-", "-",
    "-", "-", "-"
]
current_player = "X"

def display_board():
    print(board[0] + "|" + board[1] + "|" + board[2])
    print(board[3] + "|" + board[4] + "|" + board[5])
    print(board[6] + "|" + board[7] + "|" + board[8])

def handle_turn():
    global current_player
    while True:
        position = int(input(f"Choose a position from 1-9 to add an \"{current_player}\": ")) - 1
        if position in already_taken or position <0 or position >8:
            print("Position invalid or already taken.")
            continue
        already_taken.append(position)
        board[position] = current_player
        display_board()
        # 切换玩家
        current_player = "O" if current_player == "X" else "X"
        break

def check_rows():
    global winner
    if board[0] == board[1] == board[2] != "-":
        winner = board[0]
        return True
    if board[3] == board[4] == board[5] != "-":
        winner = board[3]
        return True
    if board[6] == board[7] == board[8] != "-":
        winner = board[6]
        return True
    return False

def check_columns():
    global winner
    if board[0] == board[3] == board[6] != "-":
        winner = board[0]
        return True
    if board[1] == board[4] == board[7] != "-":
        winner = board[1]
        return True
    if board[2] == board[5] == board[8] != "-":
        winner = board[2]
        return True
    return False

def check_diagonals():
    global winner
    if board[0] == board[4] == board[8] != "-":
        winner = board[0]
        return True
    if board[2] == board[4] == board[6] != "-":
        winner = board[2]
        return True
    return False

def check_if_win():
    return check_rows() or check_columns() or check_diagonals()

def check_if_tie():
    return len(already_taken) == 9

def check_if_game_over():
    return check_if_win() or check_if_tie()

# 主游戏流程
display_board()
running = True
while running:
    handle_turn()
    if check_if_game_over():
        running = False

if winner:
    print(f"Player {winner} has won!")
else:
    print("Whoops! Looks like you both tie.")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:45:08