【问题标题】:TypeError: unsupported operand type(s) for +=: 'int' and 'list' with Pygame类型错误:+= 不支持的操作数类型:Pygame 的“int”和“list”
【发布时间】: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()

非常感谢任何试图提供帮助的人。

【问题讨论】:

    标签: python list loops pygame


    【解决方案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]               # <---
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2013-10-04
      • 2021-06-16
      相关资源
      最近更新 更多