首页 > 解决方案 > 敌人X[i] += 敌人X_change[i] IndexError: 列表索引超出范围,黑屏

问题描述

我开始使用 Python 将近一个星期。我正在创建一个游戏,它的名字是“Space Invaders”。我正在尝试添加更多敌人而不是一个。我正在使用 PyGame。Python 版本 3.8.7。我有2个问题。首先:当我在终端中运行 Python 文件时,我只得到一个黑屏。第二:当我关闭窗口时,出现此错误。enemyX[i] += enemyX_change[i] IndexError: list index out of range 这是完整的代码:

    import pygame
import math
import random


# Initialize the pygame
pygame.init()

#create the screen
screen = pygame.display.set_mode((800, 600))


# Title and Icon
pygame.display.set_caption('Space Invaders')
icon = pygame.image.load('C:/Users/Utente/Downloads/ufo.png')
pygame.display.set_icon(icon)

# Player
playerimg = pygame.image.load('C:/Users/Utente/Downloads/battleship.png')
playerX = 370
playerY = 480
playerX_change = 0

# Enemy
enemyimg = []
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
num_of_enemies = 6

for i in range(num_of_enemies):
 enemyimg.append(pygame.image.load('C:/Users/Utente/Downloads/alien-ufo-pixelated-game-shape.png'))
enemyX.append(random.randint(0, 735))
enemyY.append(random.randint(50, 150))
enemyX_change.append(0.3)
enemyY_change.append(40)

# Bullet

# Ready - You can't see the bullet on the screen
# Fire - The bullet is currently moving

bulletimg = pygame.image.load('C:/Users/Utente/Downloads/bullet.png')
bulletX = 0
bulletY = 480
bulletX_change = 0
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], (x, 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
# Game Loop
running = True
while running:

    # RGB = Red, Green, Blue
    screen.fill((0, 0, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        # if keystroke is pressed check whether its right or left
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                playerX_change = -0.3
            if event.key == pygame.K_RIGHT:
                playerX_change = 0.3
            if event.key == pygame.K_SPACE:
             if bullet_state == "ready":
                     # Get the current x coordinate of the spaceship
                     bulletX = playerX
                     fire_bullet(bulletX,bulletY)

        if event.type == pygame.KEYUP:
         if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerX_change = 0

    # 5 = 5 + -0.1 -> 5 = 5 - 0.1
    # 5 = 5 + 0.1

    # Checking For Boundaries Of Spaceship So It Doesn't Go Out Of Bounds
    playerX += playerX_change

    if playerX <=0:
        playerX = 0
    elif playerX >=736:
        playerX = 736


# Enemy Movement
for i in range(num_of_enemies):
    enemyX[i] += enemyX_change[i]
    if enemyX[i] <=0:
        enemyX_change[i] = 0.2
        enemyY[i] += enemyY_change[i]
    elif enemyX[i] >=736:
        enemyX_change[i] = -0.2
        enemyY[i] += enemyY_change[i]

    # Collision
    collision = isCollision(enemyX[i] ,enemyY[i] ,bulletX,bulletY  )
    if collision:
        bulletY = 480
        bullet_state = "ready"
        Score += 1
        print(Score)
        enemyX[i] = random.randint(0, 735)
        enemyY[i] = random.randint(50, 150)

    enemy(enemyX[i], enemyY[i], i)


    # Bullet Movement
    if bulletY <=0 :
        bulletY = 480
        bullet_state = "ready"

    if bullet_state == "fire":
        fire_bullet(bulletX, bulletY)
        bulletY -= bulletY_change    
    
    player(playerX, playerY)
    pygame.display.update()

标签: python

解决方案


分数有错误,否则压痕很糟糕,但现在很好

import pygame
import math
import random


# Initialize the pygame
pygame.init()

#create the screen
screen = pygame.display.set_mode((800, 600))


# Title and Icon
pygame.display.set_caption('Space Invaders')
icon = pygame.image.load('C:/Users/Utente/Downloads/ufo.png')
pygame.display.set_icon(icon)
# Player
playerimg = pygame.image.load('C:/Users/Utente/Downloads/battleship.png')
playerX = 370
playerY = 480
playerX_change = 0

# Enemy
enemyimg = []
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
num_of_enemies = 6

for i in range(num_of_enemies):
 enemyimg.append(pygame.image.load('C:/Users/Utente/Downloads/alien-ufo-pixelated-game-shape.png'))
 enemyX.append(random.randint(0, 735))
 enemyY.append(random.randint(50, 150))
 enemyX_change.append(0.3)
 enemyY_change.append(40)
# Bullet

# Ready - You can't see the bullet on the screen
# Fire - The bullet is currently moving

bulletimg = pygame.image.load('C:/Users/Utente/Downloads/bullet.png')
bulletX = 0
bulletY = 480
bulletX_change = 0
bulletY_change = 1
bullet_state = "ready"


def player(x, y):
    screen.blit(playerimg, (x, y))

def enemy(x, y, i):
    screen.blit(enemyimg[i], (x, 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
# Game Loop
Score=0
running = True
while running:

    # RGB = Red, Green, Blue
    screen.fill((0, 0, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        # if keystroke is pressed check whether its right or left
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                playerX_change = -0.3
            if event.key == pygame.K_RIGHT:
                playerX_change = 0.3
            if event.key == pygame.K_SPACE:
             if bullet_state == "ready":
                     # Get the current x coordinate of the spaceship
                     bulletX = playerX
                     fire_bullet(bulletX,bulletY)

        if event.type == pygame.KEYUP:
         if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerX_change = 0

    # 5 = 5 + -0.1 -> 5 = 5 - 0.1
    # 5 = 5 + 0.1

    # Checking For Boundaries Of Spaceship So It Doesn't Go Out Of Bounds
    playerX += playerX_change

    if playerX <=0:
        playerX = 0
    elif playerX >=736:
        playerX = 736


    # Enemy Movement
    for i in range(num_of_enemies):
        enemyX[i] += enemyX_change[i]
        if enemyX[i] <=0:
            enemyX_change[i] = 0.2
            enemyY[i] += enemyY_change[i]
        elif enemyX[i] >=736:
            enemyX_change[i] = -0.2
            enemyY[i] += enemyY_change[i]
    
        # Collision
        collision = isCollision(enemyX[i] ,enemyY[i] ,bulletX,bulletY  )
        if collision:
            bulletY = 480
            bullet_state = "ready"
            Score += 1
            print(Score)
            enemyX[i] = random.randint(0, 735)
            enemyY[i] = random.randint(50, 150)
    
        enemy(enemyX[i], enemyY[i], i)
    
    
        # Bullet Movement
        if bulletY <=0 :
            bulletY = 480
            bullet_state = "ready"
    
        if bullet_state == "fire":
            fire_bullet(bulletX, bulletY)
            bulletY -= bulletY_change    
        
        player(playerX, playerY)
        pygame.display.update()

推荐阅读