我正在为学校项目重建太空入侵者。
当试图让子弹击中其中一个敌人并添加分数时我会收到错误
IndexError:列表索引超出范围。
这是我的游戏的简化版本,可以重现问题:
import pygame, sys
from pygame.locals import *
import math
pygame.init()
FPS=30
fpsClock = pygame.time.Clock()
screen = pygame.display.set_mode((628, 602),0,32)
FILL=(0,162,232)
BLACK=(0,0,0)
font=pygame.font.Font('freesansbold.ttf',22)
mothership=pygame.image.load('mothership.png').convert()
mothership.set_colorkey(FILL)
bullet=pygame.image.load('bullet.png').convert()
player=pygame.image.load('player.png').convert()
player.set_colorkey(FILL)
def drawbullet(bulletx,bullety):
screen.blit(bullet,(bulletx,bullety))
def drawplayer():
screen.blit(player,(playerx,playery))
def drawmothership(mothershipx,mothershipy):
screen.blit(mothership,(mothershipx,mothershipy))
bulletx=[]
bullety=[]
score=0
mothershipx=-30
mothershipy=200
playerx=84
playery=483
firing=False
while True:
screen.fill(BLACK)
drawplayer()
drawmothership(mothershipx,mothershipy)
mothershipx=mothershipx+7
message=''+str(score)+''
text=font.render(message,True,FILL)
screen.blit(text,(143,59))
if mothershipx>=628:
mothershipx=-30
for l in range(len(bulletx)):
drawbullet(bulletx[l],bullety[l])
bullety[l]=bullety[l]-10
if math.hypot((bulletx[1]-mothershipx),(bullety[1]-mothershipy))<100:
score=score+10
pygame.display.update()
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
keys=pygame.key.get_pressed()
if keys[K_LEFT] and playerx>0:
playerx=playerx-5
if keys[K_RIGHT] and playerx<583:
playerx=playerx+5
if event.type==KEYDOWN:
if event.key==K_SPACE:
firing=True
firinglocationx=playerx+20
bulletx.append(firinglocationx)
bullety.append(483)
fpsClock.tick(FPS)
答案 0 :(得分:0)
错误似乎发生在这里:
if math.hypot((bulletx[1]-mothershipx),(bullety[1]-mothershipy))<100:
score=score+10
你试图检查两个数组的第二个对象是否达到了母舰的相关值,但是列表在开头没有元素
这是我的解决方案:
for l in range(len(bulletx)):
drawbullet(bulletx[l],bullety[l])
bullety[l]=bullety[l]-10
if math.hypot((bulletx[l]-mothershipx),(bullety[l]-mothershipy))<100:
score=score+10
因为如果两个列表中都没有元素,则不执行for循环。这将检查所有元素,而不仅仅是第二个元素。
为什么这么复杂?如何创建列表列表?
发起子弹列表:
bullets=[]
如果玩家按下Space,则附加一个子弹:
if event.type==KEYDOWN:
if event.key==K_SPACE:
firing=True
firinglocationx=playerx+20
bullets.append([firinglocationx,483})
画出子弹并检查碰撞:
for bullet in bullets:
drawbullet(bullet[0], bullet[1])
bullet[1]=bullet[1]-1;
if math.hypot((bullet[0]-mothershipx),(bullet[1]-mothershipy))<100:
score=score+10
对于有健康的母亲,创造一个变量健康:
mothershiphealth=100
这必须包含一些变化:
for l in range(len(bulletx)):
drawbullet(bulletx[l],bullety[l])
bullety[l]=bullety[l]-10
if math.hypot((bulletx[l]-mothershipx),(bullety[l]-mothershipy))<100:
score=score+10
mothershiphealth-=10 #whatever damage you want
bulletx.pop(l) #Delete bullet
bullety.pop(l) #Delete bullet
或者,如果你只使用一个列表,正如我建议你需要一个变量计数,来计算它的'n对象:
count=0;
for bullet in bullets:
drawbullet(bullet[0],bullet0[1])
bullet[1]=bullet[1]-10
if math.hypot((bullet[0]-mothershipx),(bullet[1]-mothershipy))<100:
score=score+10
mothershiphealth-=10 #whatever damage you want
bullet.pop(count) #Delete bullet
count+=1;
而且,为了解开母舰:
if mothershiphealth > 0:
drawmothership(mothershipx,mothershipy)
如果母舰的健康状况超过零
,这只会吸引母舰