Pygame:每当我尝试捡起已经扔出的瓷砖时,都会收到错误消息

时间:2020-05-14 22:13:00

标签: pygame

我正在用pygame制作游戏,您可以捡起并扔掉它们。我遇到了一个问题,如果我扔了一块积木并尝试将其拾起,则会出现错误。我知道问题出在哪里,但我不知道如何解决

IndexError:弹出索引超出范围 这将获取我要拾取的块的索引:

# Checks if player is touching a block and pressing down arrow to remove a block and add a block above the player's head
    if collisions["left"] and pick_block or collisions["right"] and  pick_block:
        for tile in xcollisions:
            if pick_block_count == 0:
                if not holding_block:
                    tpb = tile
                    tile_pops.append(tile_rects.index(tile))
                    holding_block = True
                    pick_block_count += 1
    else:
        xcollisions = 0
# Removes the tile that is picked up
    for tile in tile_pops:
        tile_rects.pop(tile)
        drectp = display_rects.pop(tile)

这将删除该块。我知道问题出在哪里,但我不知道如何解决

这是我的完整代码:https://pastebin.com/3eszkgkK 这是我使用的地图:https://pastebin.com/ftWL4mVD 对于纹理,您可以使用任何16x16纹理

2 个答案:

答案 0 :(得分:1)

考虑这段代码:

fruits = [ 'apple', 'banana', 'cherry', 'durian' ]

for i in range( len( fruits ) ):
   print( "i == %d" % ( i ) )
   fruits.pop( i )
   print( "-------------------------" )
   print( "fruits now: "+str( fruits ) )

它失败并显示:

Traceback (most recent call last):
  File "./bad_pop.py", line 5, in <module>
    fruits.pop( i )
IndexError: pop index out of range

这是因为在循环的第一次迭代中,它删除了fruits[0]。没关系。然后fruits[1]。但是在第三遍时,列表只有两个元素长-01,但是i2!超出范围了。

pop()就是这种情况,随着列表的缩小,要删除的索引也不会随之缩小。

remove fruits[0] - [apple]
fruits now: ['banana', 'cherry', 'durian']
-------------------------
remove fruits[1] - [cherry]
fruits now: ['banana', 'durian']
-------------------------
Traceback (most recent call last):
  File "./bad_pop.py", line 5, in <module>
    f = fruits.pop( i )
IndexError: pop index out of range

那你该怎么办。重新处理循环,使其仅使用pop()来取第0个元素。或从len( list )向下循环到0,因此列表的缩小大小无关紧要。

编辑: 也许像这样:

tile_pops.sort()
tile_pops.reverse()
for tile in tile_pops:
    tile_rects.pop(tile)
    drectp = display_rects.pop(tile)

但这是一种相当昂贵的计算方式。

答案 1 :(得分:0)

我终于修复了我的代码。问题不是因为随着列表的缩小,要删除的索引也不会随之缩小,但这是我最初所说的。我必须从thrown_drect列表中弹出磁贴,并从tile_pops中弹出磁贴。这是我要解释的内容:

# If the tile that is being popped has been thrown before, it pops it from thrown_drect (or else it would cause an error)
    if ttpop:
        print(abs((len(tile_rects)-tile_pops[-1]) - len(thrown_drect)))
        tpopped_value = thrown_drect.pop(abs((len(tile_rects)-tile_pops[-1]) - len(thrown_drect)))
        tile_pops.pop(-1)
    # Removes the tile that is picked up
    for tile in tile_pops:
        tile_rects.pop(tile)
        drectp = display_rects.pop(tile)
    if ttpop:
        print("yes")
        drectp = tpopped_value
        print(drectp[0])
        ttpop = False