微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

类型错误:不支持 += 的操作数类型:'int' 和 'list' 与 Pygame

如何解决类型错误:不支持 += 的操作数类型:'int' 和 'list' 与 Pygame

请帮忙!!

我正在尝试按照本教程使用 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]               # <---

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。