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

井字棋游戏循环迭代异常:获胜后仍多执行一次循环的原因咨询

问题原因与修复方案

你的问题本质不是循环多迭代,而是主游戏循环的逻辑漏洞:当X落子后已经触发获胜条件,程序没有立刻终止循环,而是继续执行了O的回合,才会让你觉得"多跑了一次"。

核心修复:主循环逻辑调整

在X落子并检查获胜后,必须立刻判断win状态,如果为True就直接跳出循环,跳过后续O的操作。修改后的主循环代码如下:

win = False

while win == False:
    print("\nCrosses\n")
    column = int(input("Enter a Column\n"))
    row = int(input("Enter a Row\n"))
    grid[row][column] = "X"
    for x in grid: print(x)
    win = checkwin(grid, row, column)
    # X获胜后直接终止循环,不让O再走
    if win:
        break
    
    print("\nNoughts\n")
    column = int(input("Enter a Column\n"))
    row = int(input("Enter a Row\n"))
    grid[row][column] = "O"
    for x in grid: print(x)  
    win = checkwin(grid, row, column)

额外优化:补全获胜判定逻辑

你的checkwin函数只检查了主对角线(左上→右下),漏掉了副对角线(右上→左下)的判定,补上这部分才能完整识别所有获胜情况:

def checkwin(grid, row, column):
    won = False

    sum = 0
    # 检查主对角线(左上到右下)
    for i in range(3):
        if grid[i][i] == "X":
            sum +=1
        elif grid[i][i] == "O":
            sum -=1
    if sum == 3 or sum == -3:
        won = True

    sum = 0
    # 新增:检查副对角线(右上到左下)
    for i in range(3):
        if grid[i][2 - i] == "X":
            sum +=1
        elif grid[i][2 - i] == "O":
            sum -=1
    if sum == 3 or sum == -3:
        won = True

    sum = 0
    # 检查当前行
    for i in range(3):
        if grid[row][i] == "X":
            sum +=1
        elif grid[row][i] == "O":
            sum -=1
    if sum == 3 or sum == -3:
        won = True

    sum = 0
    # 检查当前列
    for i in range(3):
        if grid[i][column] == "X":
            sum +=1
        elif grid[i][column] == "O":
            sum -=1
    if sum == 3 or sum == -3:
        won = True    

    return won

其他小建议

  • 变量名sum是Python内置函数名,建议改成row_sum/diag_sum这类更清晰的名字,避免冲突。
  • 可以添加落子位置合法性检查(比如是否超出0-2范围、是否已经被占用),避免非法输入导致报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:01:18