Призрак Pygame Pacman, случайное изменение направления

Я создаю игру pacman, пока все работает, кроме призраков, когда призрак сталкивается со стеной, класс называется ниже. Однако, как вы можете видеть, self.a возвращает строку str, но мне нужно, чтобы она применялась к моим спрайтам-призракам, Ghost1, Ghost2 и т. д. Поэтому он вызывает Ghost1.a, и призрак движется соответственно.

Любая помощь будет оценена по достоинству, спасибо.

class Ghost_move(object):
    def __init__(self,g_speed):
        super(Ghost_move, self).__init__()
        self.left=".rect.x-=g_speed"
        self.right=".rect.x+=g_speed"
        self.up=".rect.y-=g_speed"
        self.down=".rect.y+=g_speed"
        self.direction=self.left,self.right,self.up,self.down
        self.a=random.choice(self.direction)

person Jack    schedule 01.04.2017    source источник
comment
Зачем вам вообще понадобился super() ?   -  person abccd    schedule 01.04.2017
comment
я не знаю, возвышенный текст добавляет его автоматически при создании нового класса, я просто забыл его удалить   -  person Jack    schedule 01.04.2017
comment
Это ужасная идея сохранять литералы в строке, просто используйте несколько операторов if или что-то в этом роде.   -  person abccd    schedule 01.04.2017


Ответы (1)


Как уже указывал abccd, плохая идея помещать исходный код, который вы хотите выполнить, в строки. Ближайшее к вам решение — определение функций для left, right, up, down. Затем вы можете сохранить эти функции в направлениях и выполнить случайно выбранный:

class Ghost_move(object):
    def __init__(self,g_speed):
        super(Ghost_move, self).__init__()
        self.g_speed = g_speed
        self.directions = self.left, self.right, self.up, self.down
        self.a = random.choice(self.directions)
    def left(self):
        self.rect.x -= self.g_speed
    def right(self):
        self.rect.x += self.g_speed
    def up(self):
        self.rect.y -= self.g_speed
    def down(self):
        self.rect.y += self.g_speed

Теперь self.a — это функция, которую вы можете вызвать. Например, ghost1.a() будет перемещать ghost1 случайным образом в одном из четырех направлений. Но будьте осторожны, потому что a устанавливается только один раз, и поэтому ghost1.a() всегда перемещает этот призрак в одном и том же направлении, а не выбирает случайное направление каждый раз, когда вы его вызываете.


Другой подход - сделать это с векторами:

class Ghost_move(object):
    def __init__(self,g_speed):
        super(Ghost_move, self).__init__()
        self.left = (-g_speed, 0)
        self.right = (g_speed, 0)
        self.up = (0, -g_speed)
        self.down = (0, g_speed)
        self.directions = self.left, self.right, self.up, self.down
        self.random_dir = random.choice(self.directions)
    def a():
        self.rect.x += self.random_dir[0]
        self.rect.y += self.random_dir[1]

Использование такое же, как и раньше, вы просто вызываете a() призрака.

person BurningKarl    schedule 01.04.2017