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

如何修正井字棋游戏中的平局判定逻辑?

修复井字棋平局判定未触发的问题

问题根源

  1. 语法错误导致代码失效:平局判断的代码被反引号(`)包裹,Python会将这段内容识别为字符串字面量,而非可执行逻辑,因此永远不会触发平局判定。
  2. 循环次数逻辑错误:原代码使用range(1,10),会执行9次循环,每次循环两个玩家各走一步,这会尝试走18步,远超井字棋仅有的9个格子上限,实际最多只需要5轮循环(玩家1最多走5步,玩家2走4步)。
  3. 判断时机错误:即便去掉反引号,i == 9的条件也永远无法满足,因为当9个格子填满时,循环最多执行到第5轮就会结束。

修复后的完整代码

# 假设前面的初始化代码(theBoard、make_move、printBoard等)已正确定义
for i in range(1, 6):  # 修正循环次数为5轮,覆盖所有可能的走法
    valid_move = False
    while not valid_move:
        move = input("Player1 your turn with X. Please choose a cell: ")
        if not move.isdigit():
            print("Please insert a cell number from 1-9.")
        else:
            valid_move = make_move(player1, move)
            if valid_move:
                printBoard(theBoard)
                break

    # 玩家1获胜判断
    if (theBoard['7'] == theBoard['8'] == theBoard['9'] == player1) or \
            (theBoard['4'] == theBoard['5'] == theBoard['6'] == player1) or \
            (theBoard['1'] == theBoard['2'] == theBoard['3'] == player1) or \
            (theBoard['7'] == theBoard['4'] == theBoard['1'] == player1) or \
            (theBoard['8'] == theBoard['5'] == theBoard['2'] == player1) or \
            (theBoard['9'] == theBoard['6'] == theBoard['3'] == player1) or \
            (theBoard['7'] == theBoard['5'] == theBoard['3'] == player1) or \
            (theBoard['9'] == theBoard['5'] == theBoard['1'] == player1):
        print("Player1 wins!")
        theBoard = {key: ' ' for key in theBoard}  # 重置棋盘
        break

    # 玩家2回合,仅在格子未填满时执行(第5轮玩家1走完后格子已满)
    if i < 5:
        valid_move = False
        while not valid_move:
            move = input("Player2 your turn with O. Please choose a cell: ")
            if not move.isdigit():
                print("Please insert a cell number.")
            else:
                valid_move = make_move(player2, move)
                if valid_move:
                    printBoard(theBoard)
                    break

        # 玩家2获胜判断
        if (theBoard['7'] == theBoard['8'] == theBoard['9'] == player2) or \
                (theBoard['4'] == theBoard['5'] == theBoard['6'] == player2) or \
                (theBoard['1'] == theBoard['2'] == theBoard['3'] == player2) or \
                (theBoard['7'] == theBoard['4'] == theBoard['1'] == player2) or \
                (theBoard['8'] == theBoard['5'] == theBoard['2'] == player2) or \
                (theBoard['9'] == theBoard['6'] == theBoard['3'] == player2) or \
                (theBoard['7'] == theBoard['5'] == theBoard['3'] == player2) or \
                (theBoard['9'] == theBoard['5'] == theBoard['1'] == player2):
            print("Player2 wins!")
            theBoard = {key: ' ' for key in theBoard}  # 重置棋盘
            break
else:
    # 循环正常结束(未因玩家获胜触发break),判定为平局
    print("It's a draw!")
    theBoard = {key: ' ' for key in theBoard}

# 原代码后续逻辑
if start_question.lower() == "no":
    print("The game is over.")
    game = False
else:
    print("Please respond 'Yes' or 'No'.")

关键修改说明

  1. 修正循环范围:将range(1,10)改为range(1,6),匹配井字棋最多5轮的实际规则。
  2. 移除无效包裹:删除平局判断代码周围的反引号,让逻辑可执行。
  3. 使用for-else结构:当循环未被break打断(即无玩家获胜),自动触发平局判定,这是Python中判断循环正常完成的标准写法。
  4. 优化玩家2回合:添加if i <5的判断,避免第5轮玩家1走完后,玩家2尝试无效走步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:10:35