Space Invaders IndexError:列表索引超出范围

时间:2016-11-27 18:04:35

标签: python python-3.5

我正在为学校项目重建太空入侵者。

当试图让子弹击中其中一个敌人并添加分数时我会收到错误

  

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)

1 个答案:

答案 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)

如果母舰的健康状况超过零

,这只会吸引母舰