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

新手程序员井字棋(Noughts and Crosses)代码异常:首次落子即提示网格位置已满

解决井字棋重复落子检查的问题

嘿,我看到你在给井字棋添加「禁止重复落子」功能时踩了几个常见的Python语法坑,咱们一步步把它们修好!

核心问题分析

你的代码里有三个关键错误导致了首次落子就触发错误提示:

  • 错误的条件判断逻辑
    原代码中的if grid[row][column] == "X" or "O"是完全错误的写法。在Python中,or运算符需要两边都是完整的布尔表达式,而这里的"O"是一个非空字符串,会被Python自动视为True。这意味着不管当前格子是空的还是有棋子,这个条件都会返回True,所以每次输入都会立刻提示「Cannot place on a full grid space」。

    正确的写法应该是检查当前格子是否是"X"或者"O":

    # 写法一:完整的比较表达式
    if grid[row][column] == "X" or grid[row][column] == "O":
    # 写法二:更简洁的成员判断
    if grid[row][column] in ["X", "O"]:
    
  • 把赋值操作写成了比较操作
    在else分支里,你写的是repeat == True——这是在做相等比较,而不是把repeat变量设置为True。Python里赋值用单等号=,比较用双等号==。如果不改这个,你的内层循环会无限运行,因为repeat永远是False。正确的写法是:

    repeat = True
    
  • O玩家回合缺少重复落子检查
    目前只有X玩家的回合有(错误的)检查逻辑,O玩家的部分直接落子,没有验证格子是否被占用,这也需要补上同样的检查逻辑。

修正后的完整代码

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[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
    # 补充检查副对角线(原代码漏掉了!)
    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
    return won

#############################main program#############################
grid = [["-","-","-"], ["-","-","-"], ["-","-","-"]]
for x in grid:
    print(x)
win = False
repeat = False
while win == False:
    print("\nCrosses\n")
    repeat = False  # 重置重复标记
    while repeat == False:
        column = int(input("Enter a Column\n"))
        row = int(input("Enter a Row\n"))
        # 修正后的重复落子检查
        if grid[row][column] in ["X", "O"]:
            print("Cannot place on a full grid space")
        else:
            repeat = True
            grid[row][column] = "X"  # 只有检查通过才落子
    for x in grid:
        print(x)
    win = checkwin(grid, row, column)
    if win:
        print("Crosses win!")
        break
    print("\nNoughts\n")
    repeat = False  # 重置重复标记
    while repeat == False:
        column = int(input("Enter a Column\n"))
        row = int(input("Enter a Row\n"))
        # O玩家的重复落子检查
        if grid[row][column] in ["X", "O"]:
            print("Cannot place on a full grid space")
        else:
            repeat = True
            grid[row][column] = "O"  # 只有检查通过才落子
    for x in grid:
        print(x)
    win = checkwin(grid, row, column)
    if win:
        print("Noughts win!")
        break

额外补充

我还帮你补上了原代码漏掉的副对角线胜利检查(比如(0,2)、(1,1)、(2,0)这条线),不然这种情况的胜利不会被检测到哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:12:33