问题描述
随着时间的推移,我尝试添加更多敌人,例如当您的分数大于 5 时,应该有 2 个敌人等等。但是每次当我打到 5 分时,游戏都会崩溃并显示错误代码:
Traceback (most recent call last):
File "Y:\PycharmProjects\SpaceInvaders\main.py",line 106,in <module>
enemyX[i] += enemyX_change[i]
IndexError: list index out of range
我尝试了几种方法,例如在循环中添加分数检测部分,但我尝试的所有方法都不起作用。 这是游戏的代码
import pygame
import random
import math
pygame.init()
screen = pygame.display.set_mode((800,600))
pygame.display.set_caption("Space Invaders")
icon = pygame.image.load('ufo.png')
pygame.display.set_icon(icon)
playerImg = pygame.image.load('player.png')
playerX = 370
playerY = 480
playerX_change = 0
enemyImg = []
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
enemies = 1
for i in range(enemies):
enemyImg.append(pygame.image.load('alien.png'))
enemyX.append(random.randint(0,735))
enemyY.append(-32)
enemyX_change.append(0.2)
enemyY_change.append(100)
bulletImg = pygame.image.load('bullet.png')
bulletX = 0
bulletY = 480
bulletY_change = 1
bullet_state = "ready"
score = 0
def player(x,y):
screen.blit(playerImg,(x,y))
def enemy(x,y,i):
screen.blit(enemyImg[i],y))
def fire_bullet(x,y):
global bullet_state
bullet_state = "fire"
screen.blit(bulletImg,(x + 16,y + 10))
def isCollision(enemyX,enemyY,bulletX,bulletY):
distance = math.sqrt((math.pow(enemyX - bulletX,2)) + (math.pow(enemyY - bulletY,2)))
if distance < 27:
return True
else:
return False
running = True
while running:
screen.fill((0,20))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
playerX_change = -0.3
if event.key == pygame.K_d:
playerX_change = 0.3
if event.key == pygame.K_SPACE:
if bullet_state == "ready":
bulletX = playerX
fire_bullet(bulletX,bulletY)
if event.type == pygame.KEYUP:
if event.key == pygame.K_a or event.key == pygame.K_d:
playerX_change = 0
playerX += playerX_change
if playerX < -20:
playerX = 820
if playerX > 820:
playerX = -20
player(playerX,playerY)
for i in range(enemies):
enemyX[i] += enemyX_change[i]
if enemyX[i] <= 0:
enemyX_change[i] = 0.2
enemyY[i] += enemyY_change[i] / 7
elif enemyX[i] >= 736:
enemyX_change[i] = -0.2
enemyY[i] += enemyY_change[i] / 7
collision = isCollision(enemyX[i],enemyY[i],bulletY)
if collision:
bulletY = 480
bullet_state = "ready"
score += 1
print(score)
enemyX[i] = random.randint(0,735)
enemyY[i] = -32
enemy(enemyX[i],i)
if bulletY <= 0:
bulletY = 480
bullet_state = "ready"
if bullet_state == "fire":
fire_bullet(bulletX,bulletY)
bulletY -= bulletY_change
if score > 5:
enemies = 2
if score > 15:
enemies = 3
if score > 25:
enemies = 4
if score > 55:
enemies = 5
pygame.display.update()
当我达到正确的分数时,如何添加更多敌人而不导致游戏崩溃?
解决方法
添加新敌人时似乎没有增加 enemyX
的长度。然后,在这段代码中,i
超过了enemyX
的最大索引,导致报错:
for i in range(enemies):
enemyX[i] += enemyX_change[i]
为了解决这个问题,我会在 enemies = 2
之后添加一些代码,通过向 enemyX
、enemyY
、enemyX_change
和 {{ 添加一个项目来创建一个新的敌人1}}。
在您当前的代码中,实际上只在开头添加了敌人,位于
for i in range(enemies):
enemyImg.append(pygame.image.load('alien.png'))
enemyX.append(random.randint(0,735))
enemyY.append(-32)
enemyX_change.append(0.2)
enemyY_change.append(100)
当您增加 enemies
变量时,您不会添加任何 enemyX
等列表。这就是为什么当您尝试访问不在列表中的敌人信息时会出现超出范围错误的原因。
您应该做的是在增加变量的同时将一个新的敌人添加到您的列表中。既然你已经有一段很好的代码来创建一个敌人,我认为你应该把它放在一个函数中。您也可以将 enemy
变量的增量放入此函数中。
def spawnEnemy():
global enemies
enemies+=1
enemyImg.append(pygame.image.load('alien.png'))
enemyX.append(random.randint(0,735))
enemyY.append(-32)
enemyX_change.append(0.2)
enemyY_change.append(100)
然后,您可以在初始生成和更高分数的新生成中使用它。
for i in range(enemies):
spawnEnemy()
还有:
if score > 5:
spawnEnemy()
if score > 15:
spawnEnemy()
if score > 25:
spawnEnemy()
if score > 55:
spawnEnemy()
但是,您当前生成敌人的条件不正确,因为只要分数大于给定的数量,就会每帧生成一个新敌人。您应该只使用 ==
而不是 >
,这样它只会生成一次。
if score == 5:
spawnEnemy()
if score == 15:
spawnEnemy()
if score == 25:
spawnEnemy()
if score == 55:
spawnEnemy()