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

Python3文本式井字棋游戏胜负平局检测功能异常求助

问题原因
  • board_lines_win_check 仅在程序初始化时赋值一次,存储的是棋盘初始的数字字符,后续修改board字典的落子状态时,该变量不会同步更新,永远无法检测到获胜条件。
  • win_tie_check 函数遍历board_lines_win_check时,取到的是字典的键("row1"、"row2"这类字符串),而非键对应的行/列列表,判断line[0] == "X"本质是判断字符串首字符是否为X,逻辑完全不成立。
  • 原有平局检测逻辑存在错误,会提前返回空值导致平局判断失效。
修正后的完整代码
board = {
    1: "1", 2: "2", 3: "3",
    4: "4", 5: "5", 6: "6",
    7: "7", 8: "8", 9: "9"
}
taken_spaces = []
players = ("X", "O")
current_player = players[0]


def print_board():
    print(f'''
    {board[1]} | {board[2]} | {board[3]}
  ----|---|----
    {board[4]} | {board[5]} | {board[6]}
  ----|---|----
    {board[7]} | {board[8]} | {board[9]}''')


def player_input():
    print_board()
    print('')
    print(f"Player {current_player}'s turn!")
    while True:
        try:
            while True:
                player_move = int(input(f'Please enter the number of the place you want to set your mark: '))
                if (player_move >= 1) and (player_move <= 9) and player_move not in taken_spaces:
                    break
                else:
                    print('Please enter a number between 1 and 9 that has not yet been taken!')
            break
        except ValueError:
            print('Please enter a valid number')
    taken_spaces.append(player_move)
    return player_move


def move():
    player_move = player_input()
    board[player_move] = current_player
    return board


def win_tie_check():
    # 每次检测动态生成最新的棋盘线数据
    board_lines_win_check = {
        "row1": [board[1], board[2], board[3]],
        "row2": [board[4], board[5], board[6]],
        "row3": [board[7], board[8], board[9]],
        "col1": [board[1], board[4], board[7]],
        "col2": [board[2], board[5], board[8]],
        "col3": [board[3], board[6], board[9]],
        "diagonal_lr": [board[1], board[5], board[9]],
        "diagonal_rl": [board[3], board[5], board[7]]
    }
    # 检测获胜条件
    for line in board_lines_win_check.values():
        if line[0] == line[1] == line[2] == "X":
            return 1
        elif line[0] == line[1] == line[2] == "O":
            return -1
    # 检测平局
    for val in board.values():
        if val not in ("X", "O"):
            return ""
    return 0


for i in range(9):
    move()
    if current_player == players[0]:
        current_player = players[1]
    else:
        current_player = players[0]
    check_res = win_tie_check()
    if check_res == 1:
        print('Player X wins! Congratulations!')
        break
    elif check_res == -1:
        print('Player O wins! Congratulations')
        break
    elif check_res == 0:
        print("It's a tie! Good game!")
        break
print_board()
核心改动说明
  • 删除了全局的board_lines_win_check定义,改在win_tie_check函数内部每次动态生成,保证拿到的是最新的落子状态
  • 修正遍历逻辑为遍历字典的.values(),获取行/列/对角线的实际列表数据进行判断
  • 简化平局检测逻辑,无获胜条件时直接检查所有棋盘格子是否都被占满,是则返回平局,否则返回空值表示游戏继续
  • 优化主循环中win_tie_check的调用逻辑,仅调用一次存为变量,避免重复计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:30:01