TypeError: неподдерживаемые типы операндов для +=: 'int' и 'list' с Pygame

Пожалуйста помоги!!

Я пытаюсь создать 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()

Большое спасибо всем, кто пытается помочь.


person Databas3    schedule 22.12.2020    source источник


Ответы (1)


Проблема вызвана строкой

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]               # <---
person Community    schedule 22.12.2020
comment
тысм!!! это исправлено!! - person Databas3; 22.12.2020