У меня есть большой список (30-50) игровых объектов, которые меняются между 5-7 состояниями в последовательном порядке, что радикально меняет их поведение.
Мой первоначальный наивный подход состоял в том, чтобы дать каждому игровому объекту переменную State, а затем каждая команда действия проходила бы через блок if-else, чтобы найти правильное действие, соответствующее состоянию.
Вариант 1 (наивный подход)
class Bot:
def action(self):
if self.state == 1:
action1()
if condition1_to_2():
self.state = 2
elif self.state == 2:
action2()
#...
list_of_bots = [Bot(), Bot(), ...]
for bot in list_of_bots:
bot.action()
Но я подумал, что с 50 игровыми объектами разве этот обход if-else не займет много времени?
Не могу ли я повысить производительность, перейдя прямо к правильному коду состояния?
Единственный способ реализовать это - использовать наследование (интерфейс или подклассы) и делать каждое игровое состояние каждого игрового объекта своим собственным подклассом, уничтожая и создавая новый объект каждый раз, когда он меняет состояние.
Вариант 2 (Наследование)
class Bot:
def action(): raise NotImplementedError
class Bot1(Bot):
def action():
action1()
class Bot2(Bot):
def action():
action2()
#...
list_of_bots = [Bot1(), Bot2(), ...]
for bot in list_of_bots:
bot.action()
Таким образом, каждый игровой объект не должен проверять, в каком состоянии он находился на каждом такте игры, что позволяет сэкономить около 300 операций на такт.
Моя единственная проблема в том, что это похоже на излишнее количество новых классов. Есть ли более компактное, но не менее эффективное решение этой проблемы?
Я подумал, что словарь или список состояний (если они дают время доступа O (1)), но как связать список с блоком кода?
Вариант 3 (Невозможно?)
class Bot:
def __init__(self):
self.action_list = [action1(), action2(), ...]
self.state = 1
def action():
self.action_list[self.state]
Решение должно быть сделано в raw python3 (без установки pip).