2015-04-11 4 views
2

Я делаю стратегию игры AI. В частности, я использую java-библиотеку BWMirror для создания Starcraft: BroodWar zerg AI.Как реализовать динамический выбор?

Я столкнулся с проблемой управления блоком. Игрок имеет несколько единиц в его распоряжении, скажем, это List<Unit> с таким содержанием:

Offset Name  Position 
0.  Drone [Worker] 
1.  Drone [Worker] 
2.  Zergling [Fighter] 
3.  Hatchery [Building] 
4.  Drone [Worker] 
5.  Larva [Passive] 

Некоторые функции, очевидно, работают только с единичными подмножеств. Я внедрил метод, который выбирает подмножество из основного списка и возвращает его как новый список. Для работников, я получаю:

Offset Name  Position 
0.  Drone [Worker] 
1.  Drone [Worker] 
2.  Drone [Worker] 

Теперь, если один из этих рабочих удаляются из исходного списка (., Например, потому что он умирает), она будет сохраняться в этом подсписке. Есть два возможных решения, и мне тоже не нравится:

  1. Создайте список выбора каждый раз, когда это необходимо.
  2. Назначают некоторые функции обратного вызова событий для удаления элементов во всех списках они присутствуют в

Мои вопросы:. Какой тип хранения данных, которые позволили бы мне сделать суб-выбор, но позвольте мне сохранить данные синхронизируется?

Это означает, что у меня было бы два объекта Iterable, и каждый из них будет содержать все единицы, другие будут содержать рабочих. И удаление работника из всех подразделений также заставит его исчезнуть у рабочих, без какого-либо обратного вызова.

+0

Я только что напомнил, что я всегда думал, как работают DOMCollections в JavaScript. Может быть, есть ответ на мой вопрос. –

+0

Это может сработать для вас? http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/Collections2.html#filter – DTing

+0

Вам нужно иметь возможность быстро получать предметы в списке рабочих по индексу? Если да, то это намного сложнее. –

ответ

2

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

Лене, создавая список, только если вам нужно, это сэкономит много циклов. Один из стихированных морских пехотинцев (например, вы сами) может убить огромное количество зерлингов, вы действительно не хотите отправлять сообщения за каждый зерглинг, который умирает. Было бы намного лучше посмотреть, что вы оставили, когда вам это нужно.

+0

Также реализация опции «2.» оказалась болезненной и не очень гибкой. –

Смежные вопросы