【发布时间】:2020-12-23 04:34:54
【问题描述】:
请帮忙!!
我正在尝试按照本教程使用 Python 制作 Space Invaders:https://www.youtube.com/watch?v=FfWpgLFMI7w
当这家伙开始添加 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], (x, 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], enemyY[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()
非常感谢任何试图提供帮助的人。
【问题讨论】: