TFWR. Координация дронов.
В прошлый раз мы обсуждали, как создавать дронов. Сегодня давайте обсудим, как скоординировать их деятельность.
В игре не так много трюков для координации дронов. Возьмем подход с «центральным дроном-координатором» и будем использовать количество дронов как примитив синхронизации.
Я думаю, что одна из самых простых задач — посадить подсолнухи, так что давайте займемся этим. Пул задач — это пул столбцов. Я хочу сохранить работу основного дрона, который мы видим на экране, и попросить его распределить задачи среди других дронов. Давайте обсудим основные моменты этого подхода.
Посмотрим на spawn_drone. Она принимает функцию, которая будет выполняться новым дроном. У меня 32 дрона и 32 столбца, значит нужно удобно создавать параметризованные функции. Сделаем это через «фабричную функцию»: на вход номер столбца, на выход функция дрона с нужным параметром.
def f(column):
def g():
one_drone_plant_job(column)
return g
Простая функция для посадки всех подсолнухов в заданном столбце:
def one_drone_plant_job(column):
n = get_world_size()
for y in range(n):
nav(column, y)
if can_harvest():
harvest()
if get_ground_type() == Grounds.GrassLand:
till()
plant(Entities.Sunflower)
И наконец, код менеджера.
Давайте составим список задач
tasks = []
for t in range(get_world_size()):
tasks.append(t)
Распределяем задачи между дронами:
while True:
tasks = []
for t in range(get_world_size()):
tasks.append(t)
while tasks:
t = tasks.pop()
while num_drones() == 16: # max_drones():
pass
spawn_drone(f(t))
Этот pass-цикл - инструмент «межпроцессной синхронизации», где объект синхронизации - число активных дронов. Когда цикл while tasks заканчивается, работа завершена: поле засажено подсолнухами.