Python 3井字棋游戏报错:TypeError: list indices must be integers or slices, not NoneType
解决井字棋游戏的TypeError: list indices must be integers or slices, not NoneType问题
我一眼就看出问题出在哪了——你的computer_move()函数在某些场景下会返回None,然后你在main()里尝试用这个None去索引棋盘列表board[move],这不报错才怪!
问题根源分析
虽然从逻辑上看,computer_move里的三个循环(找赢点、堵人类、选最佳位置)应该总能找到合法的移动位置,但你的函数没有设置兜底的返回语句。万一出现极端边界情况(比如代码逻辑疏漏导致循环没触发return),Python函数会默认返回None。这时候main()里的board[move] = computer就会抛出那个恼人的类型错误。
另外,你之前尝试的move = computer完全是走错路了——computer是字符'O'或'X',不是棋盘的索引值(0-8的整数),这么赋值后等于直接跳过了修改棋盘的步骤,自然看不到电脑落子。
修复方案
给computer_move函数添加明确的兜底返回,同时提前获取合法移动列表(避免重复调用legal_moves,提升效率)。修改后的函数代码如下:
def computer_move(board, computer, human): board = board[:] BEST_MOVES = (4, 0, 2, 6, 8, 1, 3, 5, 7) legal = legal_moves(board) # 提前获取所有合法位置,避免重复计算 print("I shall take square number", end=" ") # 优先检查自己能不能一步赢 for move in legal: board[move] = computer if winner(board) == computer: print(move) return move board[move] = EMPTY # 其次堵人类的赢点 for move in legal: board[move] = human if winner(board) == human: print(move) return move board[move] = EMPTY # 按预设的最佳位置选点 for move in BEST_MOVES: if move in legal: print(move) return move # 兜底:理论上不会走到这里,但防万一,直接选第一个合法位置 print(legal[0]) return legal[0]
修复效果
修改后,computer_move永远会返回一个0-8之间的整数索引,board[move] = computer就能正常给棋盘填充'O'(或'X'),电脑回合会正常执行,再也不会出现NoneType的报错了。
内容的提问来源于stack exchange,提问作者attachPost
相关产品推荐
相关产品推荐

