【问题标题】:Receiving a "TypeError: 'bool' object is not subscriptable" and not sure why or how to fix it [closed]收到“TypeError:'bool'对象不可下标”并且不确定为什么或如何修复它[关闭]
【发布时间】:2020-04-30 06:37:51
【问题描述】:

我正在 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 也是如此。列表中的所有值都是由用户控制的布尔值。我正在尝试同时访问每个列表中四个不同项目符号的每个值。

为什么会出现此错误,我该如何解决?

【问题讨论】:

  • 你确定它在 range() 循环后的第一行中断了吗?不在bullectdirectionmoving[i] += .... ?
  • The first line after the for loop is where it breaks—您是指 inside for 循环的第一行,还是指 您实际发布的所有代码之后的一行?
  • 快速提示:使用并行列表通常不是很好,因为它们很容易失去同步。考虑使用属性direction_booleanfirst_timedirection_xdirection_ydirection_moving 创建一个Bullet 类。这样一来,您就可以只拥有一个包含项目符号对象的列表,而不是 5 个列表。

标签: python python-3.x pygame boolean typeerror


【解决方案1】:

在这里将bulletDirectionBoolean 更改为布尔值:

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

我猜你想这样做

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

...

取而代之或类似的东西。

【讨论】:

    【解决方案2】:

    Sloth 已经解决了您当前的问题。我只想补充一点,“并行列表”是一种反模式,如果它们不是严格本地的,则更是如此 - 如果代码的任何其他部分以意想不到的方式触及其中一个列表(对其进行排序,反转它,推到它而不是从中弹出等),所有赌注都关闭了。

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

    # 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),您可能希望定义自己的专用容器类,这将强制集合的大小(并且可能是其他不变量)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2016-08-20
      • 2020-01-30
      • 2019-09-27
      • 2021-07-16
      • 1970-01-01
      • 2021-07-13
      相关资源
      最近更新 更多