python - 敌人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()
解决方案
分数有错误,否则压痕很糟糕,但现在很好
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()
推荐阅读
- flutter - 堆栈和定位在颤振中的设置位置问题
- sql - 选择具有重复成员身份的重复人员
- python - 如何使用 Python 和 VTK 从分割 MRI 文件创建网格表面
- python - 将函数中的特定字符串替换为另一个字符串的装饰器
- python - 我想在其模板中访问结构块默认 ID
- c++ - 为什么 cl.exe(Visual Studio 编译器)无法使用 CMake(错误报告)编译项目?
- django - 具有 pk 或 id 的 url 重定向到 Django 错误消息中的更新页面
- excel - 未设置对象变量或块变量。代码突然放上错误
- r - 使用 ggplot 从具有不同因子的不同数据中绘制不同的线
- php - 了解api curl指令