You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python TypeError:'Piece'对象不可下标访问问题排查

解决Piece对象不可下标访问的错误

你遇到的TypeError: 'Piece' object is not subscriptable错误,核心原因是你把自定义的Piece类实例当成了列表/元组这类序列来用下标访问,但Python的类对象默认不支持下标操作

具体看你的代码:

  • 你创建了a = Piece(...),这是一个Piece类的实例,不是列表或元组,所以a[2]这种写法完全不对——要访问实例里的属性,得用.语法,比如你要取车的参数,应该写a.rook2而不是a[2]

除了这个核心错误,你的代码还有两个需要修正的地方:

1. random模块的使用错误

你写的rnd.random是错的:

  • 首先要先导入random模块(import random);
  • 其次random.random()是生成0到1之间的浮点数,这和车的移动逻辑完全不搭——车是沿直线走任意步数,应该是随机选择方向,而不是生成随机小数。

2. 棋子移动规则的设计问题

你现在给rook传的参数是(0,1),这个定义有点模糊。哪怕是非传统国际象棋,车的核心移动逻辑也是沿x或y轴直线移动,所以更合理的设计是给每个棋子定义方向向量集合,比如车的方向是[(1,0), (-1,0), (0,1), (0,-1)],代表沿x正、x负、y正、y负方向移动。

修正后的代码示例

我调整了你的代码,修复了所有问题,同时优化了棋子规则的设计,更适配非传统象棋的扩展需求:

import random

class Piece:
    def __init__(self):
        # 用方向向量集合定义每个棋子的移动规则,可根据你的非传统规则调整
        self.pawn = [(1, 2)]  # 对应你初始传入的(1,2)
        self.rook = [(1, 0), (-1, 0), (0, 1), (0, -1)]  # 车的四个直线方向
        self.knight = [(3, 1), (3, -1), (-3, 1), (-3, -1), (1, 3), (1, -3), (-1, 3), (-1, -3)]  # 基于你传入的(3,1)扩展成完整L型移动
        self.bishop = [(1, 1), (1, -1), (-1, 1), (-1, -1)]  # 象的斜线方向
        self.queen = [(0, 1), (0, -1), (1, 0), (-1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)]  # 结合你传入的(0,1,1)调整
        self.king = [(0, 1), (0, -1), (1, 0), (-1, 0)]  # 对应你初始传入的(0,1)

# 创建棋子规则实例
piece_rules = Piece()

def rook_move(n):
    # 随机选择车的一个移动方向,乘以步数n得到最终移动坐标
    chosen_direction = random.choice(piece_rules.rook)
    return (chosen_direction[0] * n, chosen_direction[1] * n)

# 测试调用,会输出类似(3,0)、(-3,0)、(0,3)、(0,-3)的结果
print(rook_move(3))

关键修正点说明

  • .语法访问实例属性:比如piece_rules.rook,替代错误的下标访问;
  • 正确使用random模块:用random.choice()从方向列表里随机选一个方向,符合车的移动逻辑;
  • 重构了棋子规则的定义:用方向向量集合来表示移动可能性,更清晰也更易扩展你的非传统规则。

内容的提问来源于stack exchange,提问作者Adrian Mirza

火山引擎 最新活动