Пожалуйста помоги!!
Я пытаюсь создать Space Invaders с помощью Python, следуя этому руководству: 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], (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()
Большое спасибо всем, кто пытается помочь.