python - Pygame、Python列表索引问题

标签 python pygame

我正在尝试创建一个 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/

相关文章:

python - 碰撞点不会检测到框被点击

python - 我可以在不使用 Sprites 的情况下使用 .colliderect() 吗? -PyGame

python - Pandas 以负前瞻作为分隔符读取 csv

python - Jinja2 For 循环中的 Flask 表单处理

python中点线裁剪算法

python - 获取 NDB 查询计数的最佳方法 - App Engine

python - pygame key.set_repeat 不工作

Python:改变音频文件的音高

python - 如何在 pygame 窗口和函数之间转换

python - Django - 多个数据库 - 如何定义路由器?