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 заканчивается, работа завершена: поле засажено подсолнухами.

Код на GitHub