UnboundLocalError: локальная переменная 'x_direction', на которую ссылаются до присваивания, перемещения назад и вперед в Pygame 2.0 - PullRequest
1 голос
/ 19 апреля 2020

Я работаю Python 3.8.2 и Pygame 2.0.0.dev6 в Pycharm.

Я прочитал несколько других тем на подобные проблемы, но не мог понять, почему я получаю эту ошибку в этом случае. Цель этого поста двоякая: 1 - это то, что я хотел бы понять эту ошибку (я очень новичок в программировании), и 2 - это то, что я хотел бы знать, если есть лучший метод для достижения sh, что Я пытаюсь сделать.

Я пытаюсь заставить врагов раскачиваться взад-вперед в направлении х, их изменение срабатывает либо по прошествии определенного количества времени, либо (еще не добавил) определенное количество столкновений с другими врагами.

Ошибка, кажется, вызвана вторым оператором if в методе movement здесь:

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

Я вызываю класс и функции в основной игре, пока l oop здесь:

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 и, таким образом, присваивать x_direction до следующего, если выполняются операторы.

Если бы кто-то мог объяснить мне мою ошибку, я был бы очень признателен! Кроме того, я прошу прощения, если это избыточный пост, я просто не мог понять другие подобные темы.

1 Ответ

1 голос
/ 19 апреля 2020

Эта ошибка возникает во время компиляции, потому что вы нигде не инициализировали переменную. Просто инициализируйте переменную некоторым значением по умолчанию в ____ init ____ (). Пример:

self.x_direction = None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...