UnboundLocalError:在Pygame 2.0中,赋值前引用的局部变量“x_方向”来回移动

2024-06-28 19:45:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Pycharm中运行Python 3.8.2和Pygame 2.0.0.dev6

我阅读了一些关于类似问题的其他线程,但不明白为什么在这个实例中会出现这个错误。这篇文章的目的有两个:1是我想了解这个错误(我对编程非常陌生),2是我想知道是否有更好的方法来完成我试图做的事情

我试图让敌人在x方向来回摇摆,他们的变化要么是由一定时间的流逝触发的,要么(还没有添加)与其他敌人的一定数量的碰撞触发的

该错误似乎是由movement方法中的第二条if语句触发的,如下所示:

class EnemyShip(ShipGeneral):
    MOVEMENT_TIME = 180
    SHIP_TYPE_DIC = {
        'pawn': Images().pawn_ship_img,
        'boss': Images().boss_ship_img
    }

    def __init__(self, x, y, enemy_type=None):
        super().__init__(x, y, enemy_type)
        self.ship_img = self.SHIP_TYPE_DIC[enemy_type]
        self.mask = pygame.mask.from_surface(self.ship_img)
        self.health = 100
        self.movement_time_counter = 0  # Defaut set to zero

    def movement_timer(self):
        if self.movement_time_counter >= self.MOVEMENT_TIME:
            self.movement_time_counter = 0
        elif self.movement_time_counter > 0:
            self.movement_time_counter +=1

    def movement(self):  # TODO fix enemy movement to prevent overlapping and allow for advances
        y_vel = 10
        x_vel = 2
        boundaries = Settings()
        if self.y <= 100:
            self.y += y_vel
        if self.movement_time_counter == 0:  # should be true and run first in the while loop
            x_direction = random.choice(['R', 'L'])
            self.movement_time_counter += 1
        if x_direction == 'R' and self.x + self.ship_img.get_width() + x_vel < boundaries.screen_width:
                self.x += x_vel
        if x_direction == 'L' and self.x > 0:
                self.x -= x_vel

我在这里调用了游戏主while循环中的类和函数:

enemies = []
running = True
while running:
    clock.tick(FPS)
    gf.check_events()  # checks for user quit event
    if len(enemies) == 0:  # updates level and spawns new enemies after each wave
        level += 1
        fleet_size += 5
        for enemy in range(fleet_size):
            enemy = EnemyShip(
                random.randrange(20, 800 - 20),
                random.randrange(-1000, -100, 10),
                enemy_type=random.choice(['pawn', 'pawn', 'pawn', 'pawn', 'boss'])
            )
            enemies.append(enemy)

    for enemy in enemies: # enables each enemy to move
        enemy.movement()
        enemy.move_missile(7, playership)
        enemy.movement_timer()
        if enemy.health <=0:
            enemies.remove(enemy)

如果运行此命令,则会出现以下错误:

   File >"/Users/aaronbastian/Documents/PythonCode/Part_II_Projects/alien_invasion/ships.py", line 114, in movement
   if x_direction == 'R' and self.x + self.ship_img.get_width() + x_vel < boundaries.screen_width:
UnboundLocalError: local variable 'x_direction' referenced before assignment

我不理解这个错误,因为我认为self.movement_time_counter == 0应该计算为True,从而在运行以下if语句之前分配x_direction

如果有人能向我解释我的错误,我将不胜感激!另外,如果这是一篇多余的帖子,我很抱歉,我只是无法理解其他类似的帖子


Tags: andselfimgiftimetype错误counter
1条回答
网友
1楼 · 发布于 2024-06-28 19:45:04

编译期间会引发此错误,因为您尚未在任何位置初始化变量。只需在___init___()中使用一些默认值初始化变量。 例如:

self.x_direction = None

相关问题 更多 >