接收到“TypeError:‘bool’对象不可下标”,并且不确定为什么或如何修复它

2024-10-01 02:30:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用pygame制作一个简单的游戏,在试图减少代码时遇到了一个错误

bulletDirectionBoolean = [bulletRight, bulletLeft, bulletDown, bulletUp]
firstTime = [firstTime1, firstTime2, firstTime3, firstTime4]
bulletDirectionX = [bulletRightX, bulletLeftX, bulletDownX, bulletUpX]
bulletDirectionY = [bulletRightY, bulletLeftY, bulletDownY, bulletUpY]
bulletDirectionMoving = [bulletRightX, bulletLeftX, bulletDownY, bulletUpY]
directionList = [1,-1,1,-1]
limits = [screenX, -20, screenY, -20]

for i in range(4):
    if bulletDirectionBoolean[i] or powerupAbility[3]:
        if firstTime[i]:
            firstTime[i] = False
            bulletDirectionX[i] = player_posX
            bulletDirectionY[i] = player_posY
        screen.blit(bullet_img, (bulletDirectionX[i], bulletDirectionY[i]))
        bulletDirectionMoving[i] += bulletSpeed*directionList[i]

        if directionList[i] == 1:
            if bulletDirectionMoving[i] > limits[i]:
                bulletDirectionBoolean = False
                firstTime[i] = True
        if directionList[i] == -1:
            if bulletDirectionMoving[i] < limits[i]:
                bulletDirectionBoolean = False
                firstTime[i] = True

这是失败的代码块。for循环后的第一行是它中断的地方。powerupAbility是代码中未显示的另一个具有布尔值的列表。列表bulletDirectionBoolean也是如此。列表中的所有值都是由用户控制的布尔值。我试图同时访问四个不同项目符号的每个列表中的每个值

为什么它会给我这个错误?我能做些什么来修复它


Tags: 代码false列表if错误limitsfirsttimedirectionlist
2条回答

懒惰已经解决了你当前的问题。我只想补充一点,“并行列表”是一种反模式,如果它们不是严格本地的,则更是如此——如果代码的任何其他部分以意外的方式接触到其中一个列表(排序、反转、推到列表或从列表中弹出等),则所有赌注都被取消

更好的设计是元组、dict或数据类的列表,即:

# brittle
foos = ["a", "b", "c"]
bars = [1, 2, 3]

for i in range(3):
    print("{} : {}" .format(foos[i], bars[i]))

# more robust    
foobars = [("a", 1), ("b", 2), ("c", 3)]
for foo, bar in foobars:
    print("{} : {}".format(foo, bar))


# more robust and more explicit:
foobars = [{"foo": "a", "bar": 1}, {"foo":"b", "bar": 2}, ("foo": "c", "bar:3}]

for foobar in foobars:
    print("{} : {}".format(foobar["foo"], foobar["bar"]))

此外,如果您的“列表”应该是固定大小的(在您的示例中,所有内容的长度似乎都是4),那么您可能需要定义自己的专用容器类,这将强制集合的大小(可能还有其他不变量)

这里将bulletDirectionBoolean更改为布尔值:

...
    if directionList[i] == 1:
        if bulletDirectionMoving[i] > limits[i]:
            bulletDirectionBoolean = False
...

我猜你是想这么做的

...
    if directionList[i] == 1:
        if bulletDirectionMoving[i] > limits[i]:
            bulletDirectionBoolean[i] = False

...

而不是像这样

相关问题 更多 >