我想创建一个简单的太空游戏,但是每次我想射击外星人时,我总是得到ValueError:list.removex:x不在列表中

如何解决我想创建一个简单的太空游戏,但是每次我想射击外星人时,我总是得到ValueError:list.removex:x不在列表中

我是Python的新手(已有3个月的经验),我刚刚开始学习Pygame。我想创建一个射击外星人的太空游戏,但我收到“ ValueError:list.remove(x):x not list”。我尝试了其他解决方案,例如使用“ while len(listname)

这是Player类:

class Player:
    def __init__(self,DISPLAYSURF):
        self.PLAYER      = pygame.image.load('SpaceRocket.png') #SpaceShip by dawnydawny from Pixabay
        self.XPLAYER     = (WINDOWWIDTH / 2) - 10
        self.YPLAYER     = WINDOWHEIGHT - 75
        self.FONT        = pygame.font.Font('freesansbold.ttf',15)
        self.PBOX        = (self.XPLAYER,self.YPLAYER,44,77)
        self.DISPLAYSURF = DISPLAYSURF
        self.color       = WHITE
    
    
    def spaceMessage(self,message):
       self.message = message
       self.mesg    = self.FONT.render(self.message,True,self.color)
       self.DISPLAYSURF.blit(self.mesg,[50,WINDOWHEIGHT - 500])
    
   def showScore(self,score):
       self.score = score
       self.spaceMessage("SCORE: %s" % score)

这是不明飞行物类:

class UFO:
    def __init__(self,XUFO,YUFO):
        self.XUFO = XUFO
        self.YUFO = YUFO
        self.UFO  = pygame.image.load('SpaceUFO.png') #Image by Mostafa Elturkey from Pixabay
        self.UBOX = (self.XUFO,self.YUFO,95,52)
    
    def makeUFO(self,DISPLAYSURF):
        self.DISPLAYSURF = DISPLAYSURF
        self.DISPLAYSURF.blit(self.UFO,[self.XUFO,self.YUFO])

这是主要的游戏循环:

SpaceUFO    = []
SpaceBullet = []
def runGame(Player):
    global FPSCLOCK,BACKGROUNDIMG,DISPLAYSURF,SpaceUFO

    DISPLAYSURF   = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT))
    BACKGROUNDIMG = pygame.image.load('SpaceBackground.jpg') # Image by Free-Photos from Pixabay 
    FPSCLOCK      = pygame.time.Clock()
    Player        = Player(DISPLAYSURF)
    SpaceKill     = 0
    SCORE         = 0
    BulletSound   = mixer.Sound('BulletSound.wav') # From https://www.freesoundeffects.com/
    pygame.display.set_caption('Space Fight by MadCoderErrr')
    mixer.music.load('SpaceSound.mp3') # Music: https://www.bensound.com
    mixer.music.play(-1)

    if SpaceKill > 0:
        SpaceKill += 1
    if SpaceKill > 10:
        SpaceKill = 0

    while True:
        DISPLAYSURF.blit(BACKGROUNDIMG,[0,0])
    
        for event in pygame.event.get():
            if event.type == QUIT:
                terminate()
            
        if len(SpaceUFO) < 5:
            SpaceUFO.append(UFO(round(random.randrange(0,WINDOWWIDTH - 20.0 ** 2) * 20.0) / 20.0,WINDOWHEIGHT - 570))
            print('making new aliens')
        
        for ufo in SpaceUFO.copy():
            ufo.makeUFO(DISPLAYSURF)
            ufo.YUFO += FPS / 4
        
        for ufo in SpaceUFO:
            if ufo.YUFO >= WINDOWHEIGHT:
                SpaceUFO.pop(SpaceUFO.index(ufo))
                print('Alien is gone')
            
        for bullet in SpaceBullet.copy():
            DISPLAYSURF.blit(bullet.SpaceBulletIMG,[bullet.bulletx,bullet.bullety])
            if bullet.bullety > 0:
                bullet.bullety -= FPS
            if bullet.bullety < 0:
                SpaceBullet.pop()
                print('Bullet is now gone!')
                
        if SpaceBullet:
            for b in SpaceBullet.copy():
                for u in SpaceUFO.copy():
                    if b.bullety < ufo.UBOX[1] + ufo.UBOX[3] and b.bullety > u.UBOX[1]:
                        if b.bulletx > u.UBOX[0] and b.bulletx < u.UBOX[0] + u.UBOX[2]:
                            SpaceUFO.remove(u)
                            SpaceBullet.remove(b)
                            SCORE += 1
                            print('You killed the alien')
            
        if event.type == KEYDOWN:
            if event.key == K_LEFT and not Player.XPLAYER <= 0:
                Player.XPLAYER -= FPS
            if event.key == K_RIGHT and Player.XPLAYER < WINDOWWIDTH - (FPS * 3):
                Player.XPLAYER += FPS
            if event.key == K_SPACE and SpaceKill < 10:
                if len(SpaceBullet) < 10:
                    SpaceBullet.append(Bullet(Player.XPLAYER,Player.YPLAYER))
                SpaceKill = 1
                BulletSound.play()
            
        Player.showScore(SCORE)
        DISPLAYSURF.blit(Player.PLAYER,[Player.XPLAYER,Player.YPLAYER])
        FPSCLOCK.tick(FPS)
        pygame.display.flip()
        pygame.display.update()
    
if __name__ == '__main__':
    runGame(Player)

这是我经常出错的地方:

    if SpaceBullet:
        for b in SpaceBullet.copy():
            for u in SpaceUFO.copy():
                if b.bullety < ufo.UBOX[1] + ufo.UBOX[3] and b.bullety > u.UBOX[1]:
                    if b.bulletx > u.UBOX[0] and b.bulletx < u.UBOX[0] + u.UBOX[2]:
                        SpaceUFO.remove(u)
                        SpaceBullet.remove(b)
                        SCORE += 1
                        print('You killed the alien')

这是完整的追溯:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-1-80ff4a993e41> in <module>
    137 
    138 if __name__ == '__main__':
--> 139     runGame(Player)

<ipython-input-1-80ff4a993e41> in runGame(Player)
    115                         if b.bulletx > u.UBOX[0] and b.bulletx < u.UBOX[0] + u.UBOX[2]:
    116                             SpaceUFO.remove(u)
--> 117                             SpaceBullet.remove(b)
    118                             SCORE += 1
    119                             print('You killed the alien')

ValueError: list.remove(x): x not in list

伙计们,我现在真是一无所知,我已经编码了将近40个小时,但我仍在努力。 谢谢大家

解决方法

问题似乎是由一颗子弹击中多个ufos引起的。在这种情况下,b被尝试多次删除。 break摧毁子弹时的内循环:

if SpaceBullet:
    for b in SpaceBullet.copy():
        for u in SpaceUFO.copy():
            if b.bullety < ufo.UBOX[1] + ufo.UBOX[3] and b.bullety > u.UBOX[1]:
                if b.bulletx > u.UBOX[0] and b.bulletx < u.UBOX[0] + u.UBOX[2]:
                    SpaceUFO.remove(u)
                    SpaceBullet.remove(b)
                    SCORE += 1
                    print('You killed the alien')
                    
                    break

我建议使用pygame.Rect / collidepoint()进行碰撞测试:

if SpaceBullet:
    for u in SpaceUFO.copy():
        u_rect = pygame.Rect(*u.UBOX)
        for b in SpaceBullet.copy():
            if u_rect.collidepoint(b.bulletx,b.bullety):
                SpaceUFO.remove(u)
                SpaceBullet.remove(b)
                SCORE += 1
                print('You killed the alien')
                    
                break

请注意,使用pygame.sprite.Grouppygame.sprite.Spritepygame.sprite.Sprite.kill可以大大简化代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?