我正在用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纹理
答案 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]
。但是在第三遍时,列表只有两个元素长-0
和1
,但是i
是2
!超出范围了。
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