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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:48:37