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

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)自然会报错。

修复步骤

  1. 修正条件判断逻辑:把所有position == x,y,z改成position in (x,y,z),这样才能正确判断输入的位置属于哪一行。
  2. 优化棋盘状态管理:你当前的写法每次调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:20:40