How to fix a TypeError: 'float' object is not iterable

How to fix a TypeError: 'float' object is not iterable

我试图解决我的代码中“blit 的无效位置”的问题,但是一旦我解决了另一个错误就出现了。 类型错误:'float' 对象不可迭代。我尝试将 int() 放在周围(当我指周围时,我的意思是我尝试的代码是:int(self.x) += int(self.changeX)

这是代码,我已经按顺序排列了,意思是这是所有相关内容从代码到其他所有内容的顺序。

(简单示例。实际上还有很多。):

class Enemy():
    def __init__(self, enemyImg, enemyX, enemyY, enemyX_change, enemyY_change):
        self.image = enemyImg
        self.x = enemyX
        self.y = enemyY
        self.changeX = enemyX_change
        self.changeY = enemyY_change

    def move(self):
        self.x += self.changeX
        self.y += self.changeY

    def draw(self):
        screen.blit(self.image, (self.x, self.y))

#Enemy
enemyImg = []
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
enemies = []
number_of_enemies = 5
#Making a list for all 5 enemies image, x value, y value, x value change, y value change. All variables are a seperate list

for i in range(number_of_enemies):
    enemyImg.append(pygame.image.load('C:/Users/user/Desktop/Python/CodingBee/Pygame Application Prototype/zombie.png'))
    enemyX.append(random.randint(0, 736))
    enemyY.append(random.randint(50, 150))
    enemyX_change.append(0.45)
    enemyY_change.append(40)
    enemy = Enemy(enemyImg, enemyX, enemyY, 0.45, 0)
    enemies.append(enemy)

#def states an event. The event will not occur unless you call the event in the main game loop.
back_ground = Background()

#Main Game Loop
clock = pygame.time.Clock()

SCEEN_UPDATE = pygame.USEREVENT
pygame.time.set_timer(SCEEN_UPDATE,150)`
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
               Player.player_jump()

        for enemy in enemies:
            enemy.move()

            if event.key == pygame.K_SPACE:
                if Health_State == "ready":
                    Health_Fire_Sound = mixer.Sound('laser.wav')
                    Health_Fire_Sound.play()
                    Health.fire_Health(HealthX , HealthY)
                    HealthY  = playery + 10

        for enemy in enemies:
            enemy.draw()

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
               playery += playery_change

        
screen.fill(0,0,255)
back_ground.update()
back_ground.render()

#Health Kit Movement
if HealthX >= 800:
    HealthX = 20
    Health_State = "ready"

if Health_State == "fire":
    Health.fire_Health(HealthX , HealthY)
    HealthX -= HealthX_Change


#Enemy Movement and collision check
for i in range(number_of_enemies):

    if enemyX[i] > 20:
        for j in range(number_of_enemies):
            enemyY = 2000
        Other.game_over()
        break

    Enemy.move()
    collision = Other.isCollision(enemyX[i],enemyY[i],HealthX,HealthY)
    if collision:
        BulletY = 480
        Bullet_State = "ready"
        enemyX[i] = random.randint(800,900)
        enemyY[i] = 405
        HealthX = 20
        Health_State = "ready"
        Score_Value += 1

enemyImgenemyX 和 enemyY 是列表。但是,Enemy 构造函数的参数必须是单个图像和敌人的 x 和 y 坐标。
您不需要列表 enemyImgenemyXenemyYenemyX_changeenemyY_change。删除列表:

enemies = []
number_of_enemies = 5

enemyImg = pygame.image.load('C:/Users/user/Desktop/Python/CodingBee/Pygame Application Prototype/zombie.png')
for i in range(number_of_enemies):
    x = random.randint(0, 736)
    y = random.randint(50, 150)
    enemy = Enemy(enemyImg, x, y, 0.45, 0)
    enemies.append(enemy)

请注意,您可以使用 enemies[i].xenemies[i].y 而不是 enemyX[i]enemyY[i]

来获取敌人的坐标

此外,你必须在应用程序循环中而不是在通风循环中移动和绘制敌人。

您的代码应如下所示:

class Enemy():
    def __init__(self, enemyImg, enemyX, enemyY, enemyX_change, enemyY_change):
        self.image = enemyImg
        self.x = enemyX
        self.y = enemyY
        self.changeX = enemyX_change
        self.changeY = enemyY_change
    def move(self):
        self.x += self.changeX
        self.y += self.changeY
    def draw(self):
        screen.blit(self.image, (self.x, self.y))

enemies = []
number_of_enemies = 5
enemyImg = pygame.image.load('C:/Users/user/Desktop/Python/CodingBee/Pygame Application Prototype/zombie.png')
for i in range(number_of_enemies):
    x = random.randint(0, 736)
    y = random.randint(50, 150)
    enemy = Enemy(enemyImg, x, y, 0.45, 0)
    enemies.append(enemy)

#def states an event. The event will not occur unless you call the event in the main game loop.
back_ground = Background()

#Main Game Loop
clock = pygame.time.Clock()

SCEEN_UPDATE = pygame.USEREVENT
pygame.time.set_timer(SCEEN_UPDATE,150)`
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
               Player.player_jump()
            if event.key == pygame.K_SPACE:
                if Health_State == "ready":
                    Health_Fire_Sound = mixer.Sound('laser.wav')
                    Health_Fire_Sound.play()
                    Health.fire_Health(HealthX , HealthY)
                    HealthY  = playery + 10
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
               playery += playery_change

    for enemy in enemies:
        if enemy.x > 20:
            for j in range(number_of_enemies):
                enemyY = 2000
            Other.game_over()
            break

        enemy.move()

        collision = Other.isCollision(enemy.x,enemy.y,HealthX,HealthY)
        if collision:
            BulletY = 480
            Bullet_State = "ready"
            enemy.x = random.randint(800,900)
            enemy.y = 405
            HealthX = 20
            Health_State = "ready"
            Score_Value += 1

    #Health Kit Movement
    if HealthX >= 800:
        HealthX = 20
        Health_State = "ready"

    if Health_State == "fire":
        Health.fire_Health(HealthX , HealthY)
        HealthX -= HealthX_Change
        
    screen.fill(0,0,255)
    back_ground.update()
    back_ground.render()

    for enemy in enemies:
        enemy.draw()