问题描述
请帮忙!!
我正在尝试按照本教程使用 Python 制作 Space Invaders:https://www.youtube.com/watch?v=FfWpgLFMI7w
当那个人开始添加 for 循环时,我对这部分感到非常困惑,因为我对它们很糟糕,我不太了解它们。
需要有多个敌人,所以我创建了一个 for 循环来遍历变量列表并绘制敌人。教程进行得很快,我不知道应该在旁边放什么“[i]”,什么不放。
当我运行我的代码(如下所示)时,它说:
Traceback (most recent call last):
File "C:/Users/geema/PycharmProjects/pythonpractice/Scripts/myfirstpygame.py",line 139,in <module>
enemyX[i] += enemyX_change[i]
我可以复制粘贴代码,但这个项目的目的是为了更好地理解 Python。请帮忙,我迫切需要解决这个问题。我检查了每一行代码,没有发现任何错误。
这是我的代码:
import pygame
import random
import math
# initializing pygame
pygame.init()
# creating screen
screen = pygame.display.set_mode((800,600))
backgroundImg = pygame.image.load('galaxybackground.jpg')
# title
pygame.display.set_caption('Donnaven\'s Game')
# icon
icon = pygame.image.load('gameicon.png')
pygame.display.set_icon(icon)
# player setup
playerImg = pygame.image.load('player.png')
playerX = 370
playerY = 480
playerX_change = 0
PLAYER_SPEED = 0.185 # pixels / frame
def drawPlayer(x,y):
screen.blit(playerImg,(x,y))
# enemy setup
enemyImg = []
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
ENEMY_SPEED = []
enemy_count = 6
for i in range(enemy_count):
enemyImg.append(pygame.image.load('enemy.png'))
enemyX.append(random.randint(0,735))
enemyY.append(random.randint(50,150))
ENEMY_SPEED.append(0.075)
enemyX_change.append(ENEMY_SPEED)
enemyY_change.append(40)
def drawEnemy(x,y,i):
screen.blit(enemyImg[i],y))
# bullet
bulletImg = pygame.image.load('bullet.png')
bulletX = 0
bulletY = 480
""" Bullet state: ready means that you can't
see the bullet on the screen,and if the user
presses space,it will fire. Fire means that
the bullet is currently being fired or moving."""
bullet_state = 'ready'
bulletY_change = 0.75
# scoring system
score = 0
def check_collision(x1,y1,x2,y2):
distance = math.sqrt((math.pow(x2 - x1,2)) + (math.pow(y2 - y1,2)))
if distance < 27:
return True
else:
return False
def fire_bullet(x,y):
global bullet_state
bullet_state = 'fire'
screen.blit(bulletImg,(x + 16,y + 10))
# gameloop
running = True
while running:
# drawing screen
screen.fill((93,92,99))
# adding background
screen.blit(backgroundImg,(0,0))
# checking for any events
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# checking if keystroke is pressed
if event.type == pygame.KEYDOWN:
# checking if its left or right
if event.key == pygame.K_LEFT:
playerX_change -= PLAYER_SPEED
if event.key == pygame.K_RIGHT:
playerX_change += PLAYER_SPEED
# seeing if space is pressed
if event.key == pygame.K_SPACE:
if bullet_state == 'ready':
bulletX = playerX
fire_bullet(playerX,bulletY)
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
playerX_change = 0
# setting the x based on input
playerX += playerX_change
# making sure player doesnt go beyond boundaries
if playerX < 0:
playerX = 0
elif playerX >= 736:
playerX = 736
# enemy movement
for i in range(enemy_count):
enemyX[i] += enemyX_change[i]
if enemyX[i] < 0:
enemyX_change[i] = ENEMY_SPEED
enemyY[i] += enemyY_change[i]
elif enemyX[i] >= 736:
enemyX_change[i] = -ENEMY_SPEED
enemyY[i] += enemyY_change[i]
# check collision
collision = check_collision(enemyX[i],enemyY[i],bulletX,bulletY)
if collision:
bulletY = 480
bullet_state = 'ready'
score += 100
# reset enemy position
enemyX[i] = random.randint(0,736)
enemyY[i] = random.randint(50,150)
drawEnemy(enemyX[i],i)
enemyX[i] += enemyX_change
# enemy boundaries
""" also make sure that enemy goes downwards a bit
when it reaches the edge"""
# bullet movement
if bulletY <= 0:
bulletY = 480
bullet_state = 'ready'
if bullet_state == 'fire':
fire_bullet(bulletX,bulletY)
bulletY -= bulletY_change
# drawing the player
drawPlayer(playerX,playerY)
# drawing the enemy
# update the screen every frame - must be done last
pygame.display.update()
非常感谢任何试图提供帮助的人。
解决方法
问题是由线路引起的
enemyX_change.append(ENEMY_SPEED)
由于每个敌人都有自己的速度,ENEMY_SPEED
是一个列表。因此,您需要通过订阅获取敌人的速度:
enemyX_change.append(ENEMY_SPEED[i])
然而,在第 153、157 和 175 行中仍然缺少一些 [i]
:
while running:
# [...]
# enemy movement
for i in range(enemy_count):
enemyX[i] += enemyX_change[i]
if enemyX[i] < 0:
enemyX_change[i] = ENEMY_SPEED[i] # <---
enemyY[i] += enemyY_change[i]
elif enemyX[i] >= 736:
enemyX_change[i] = -ENEMY_SPEED[i] # <---
enemyY[i] += enemyY_change[i]
# [...]
enemyX[i] += enemyX_change[i] # <---