Python井字棋开发报错:'NoneType' object has no attribute 'format' 求解
问题分析与解决方案
核心错误:条件判断写法不符合Python语法
你代码里的if(position == 1,2,3)这种写法完全错误——Python会把它解析成一个元组(position == 1, 2, 3),而非空元组在布尔判断里永远为True,所以第一个if分支永远会触发。当你输入4-9时,第一个分支里的options字典没有对应键,options.get(position)返回None,调用None.format(player)自然会报错。
修复步骤
- 修正条件判断逻辑:把所有
position == x,y,z改成position in (x,y,z),这样才能正确判断输入的位置属于哪一行。 - 优化棋盘状态管理:你当前的写法每次调用
board都会重新打印空棋盘,根本没法记录之前的落子。应该用一个列表来存储棋盘的实时状态,每次落子后更新列表再打印整个棋盘。
修复后的完整代码
# 初始化棋盘:用9个元素的列表表示1-9位置,初始都是'-' board_state = ['-'] * 9 def update_board(player, position): # 把输入的1-9转换成列表索引0-8 index = position - 1 if 0 <= index < 9: if board_state[index] == '-': board_state[index] = player # 打印完整棋盘 print(f" {board_state[0]} | {board_state[1]} | {board_state[2]} ") print("-----------") print(f" {board_state[3]} | {board_state[4]} | {board_state[5]} ") print("-----------") print(f" {board_state[6]} | {board_state[7]} | {board_state[8]} ") else: print("这个位置已经被占了!换个位置吧") else: print("位置不对!请输入1-9之间的数字") # 获取玩家输入 ox = input("你是哪个玩家?(输入X或O) ") pos = int(input("你要下在哪个位置?(1-9) ")) update_board(ox, pos)
额外提醒
- 别用
eval(input(...)),换成int(input(...))就行——eval会执行任意输入的代码,有安全风险,而且你本来就只需要整数输入。 - 用列表存棋盘状态后,你可以多次调用
update_board实现多回合对战,这才是井字棋该有的样子。
内容的提问来源于stack exchange,提问作者stuck overflawed
相关产品推荐
相关产品推荐

