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

Python实现Tic Tac Toe井字棋胜负判定玩家显示颠倒求助

井字棋胜负提示错位修复方案

问题根因

两个问题共同导致了胜负提示错位:

  • 执行顺序错误:当前代码在玩家落子完成后立刻切换了玩家身份,下一轮循环开头才做胜负校验,此时传入校验函数的玩家已经是对手的身份,自然会打印错误的获胜者
  • 校验函数逻辑缺陷:is_win函数仅判断棋盘存在三连的非空棋子,根本没有校验这个三连棋子是不是你传入的player,不管传入什么玩家,只要有三连就会打印这个玩家获胜,进一步放大了顺序问题的影响

修复代码

1. 修正is_win函数

修改后的校验逻辑会先确认三连棋子就是传入的玩家,再判定获胜:

def is_win(board,player):
    row1 = board[0]
    row2 = board[1]
    row3 = board[2]
    # 所有判断增加和player的比对,确认获胜的就是当前传入的玩家
    if row1[0] == row1[1] == row1[2] == player:
        print(player + " Has won!")
        return True
    elif row2[0] == row2[1] == row2[2] == player:
        print(player + " Has won!")
        return True
    elif row3[0] == row3[1] == row3[2] == player:
        print(player + " Has won!")
        return True
    elif row1[0] == row2[0] == row3[0] == player:
        print(player + " Has won!")
        return True
    elif row1[1] == row2[1] == row3[1] == player:
        print(player + " Has won!")
        return True
    elif row1[2] == row2[2] == row3[2] == player:
        print(player + " Has won!")
        return True
    elif row1[0] == row2[1] == row3[2] == player:
        print(player + " Has won!")
        return True
    elif row1[2] == row2[1] == row3[0] == player:
        print(player + " Has won!")
        return True
    else:
        return False

2. 调整game函数执行顺序

落子完成后先校验当前玩家是否获胜,确认未获胜再切换玩家:

def game():
    player = 'X'
    print_board(board)
    while True:
        # 先判断是否平局
        if is_full(board):
            print("draw")
            break
        # 获取输入落子
        row, col = get_user_input()
        set_cell(board, row, col, player)
        # 落子后立刻校验当前玩家是否获胜
        if is_win(board, player):
            break
        # 未获胜再切换玩家
        player = switch_turn(player)

额外优化建议

原代码中的board = initial_board属于浅引用,后续重置棋盘时建议直接调用board = empty_board()避免全局变量引用异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 04:24:01