微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Pygame 的 Space Invader 游戏中随着时间的推移添加更多敌人

如何解决在 Pygame 的 Space Invader 游戏中随着时间的推移添加更多敌人

随着时间的推移,我尝试添加更多敌人,例如当您的分数大于 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 之后添加一些代码,通过向 enemyXenemyYenemyX_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()

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