新手程序员井字棋(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 = TrueO玩家回合缺少重复落子检查
目前只有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
相关产品推荐
相关产品推荐

