如何解决我想创建一个简单的太空游戏,但是每次我想射击外星人时,我总是得到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.Group
,pygame.sprite.Sprite
和pygame.sprite.Sprite.kill
可以大大简化代码。