我正在尝试创建一个 Missile Command 克隆来挑战/扩展我的 Python 和 Pygame 技能和知识。以下是目前游戏的代码(它是基本的,我是初学者):
import math
import pygame
class Missile:
def __init__(self, surface):
self.surface = surface
self.missileList = []
self.color = (0, 255, 0)
def draw(self):
if len(self.missileList) > 0:
self.missileList.sort()
for i in range(0, len(self.missileList)):
if self.missileList[i][1] < self.missileList[i][4]:
self.missileList.pop(i)
else:
self.update(i)
self.surface.set_at((int(self.missileList[i][0]), int(self.missileList[i][1])), self.color)
def update(self, i):
self.missileList[i][0] -= self.missileList[i][3] * math.cos(self.missileList[i][2])
self.missileList[i][1] -= self.missileList[i][3] * math.sin(self.missileList[i][2])
width = 640
height = 480
BGCOLOR = (0, 0, 0)
mousex = 0
mousey = 0
screen = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
startx = int(width / 2)
starty = height - 10
speed = 2
missile = Missile(screen)
running = True
while running:
screen.fill(BGCOLOR)
missile.draw()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
elif event.type == pygame.MOUSEMOTION:
mousex, mousey = event.pos
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
endx = mousex
endy = mousey
trajectory = math.atan2(height - endy, (width / 2) - endx)
missile.missileList += [[startx, starty, trajectory, speed, endy]]
pygame.display.flip()
clock.tick(75)
因此,每次我单击鼠标按钮时,missile.missileList 都会附加从开始到结束获取“导弹”所需的所有信息。当导弹到达其终点时,这些列表条目将被删除。问题是,如果有另一枚导弹被跟踪,此后会抛出列表索引并抛出错误(列表索引超出范围)。我认为在每次 draw() 调用开始时对列表进行排序会有所帮助,但事实并非如此。有什么想法吗?
最佳答案
您在迭代列表的同时修改了它,这通常是一个错误。在这种情况下,使代码正常工作的最简单方法是向后迭代:
for i in range(len(self.missileList)-1, -1, -1)
这是可行的,因为您只会删除循环中的当前项目 - 当您向后迭代时,删除当前项目只会影响您已经看到的那些项目的索引。
关于python - Pygame、Python列表索引问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6727222/