Какой самый элегантный способ реализовать систему командных команд для ИИ? например, в крепости гномов, когда вы помечаете лесную зону для рубки леса, гномы затем выполняют следующую последовательность действий:
- Иди к дереву
- Рубить дерево
- Доставить дрова на склад
- Перейти к другому дереву
- и так далее..
У меня уже есть команда стека работает нет. 1, который переходит из состояния ожидания к достижению целевого элемента дерева.
Чего я боюсь, так это того, как это может стать грязным, когда я создаю больше заказов, как это:
Построить дом
- Перейти на склад
- привезти древесину на строительную площадку
- вернуться на склад
- Доведите камень до строительной площадки
- одушевленный строительный спрайт
насаждение
- Перейти на склад
- принести семена на ферму
пивоварение
- Перейти на склад
- Доведите растение до сих пор
- одушевленный пивоваренный спрайт
Итак, мой вопрос: как мне реализовать систему упорядочивания команд, такую как dwarf fortress, и одновременно избегать кода спагетти? Есть ли какие-либо структуры данных, которые мне нужно изучить? Нужно ли помещать последовательность команд в отдельный XML-файл?
Ответы:
Сначала вы видите, что ваши команды представлены в виде списка , поэтому ваш первый инстинкт может состоять в том, чтобы воссоздать эту структуру, и каждый гном будет последовательно проходить через этот список. Однако я предлагаю разбить список на этапы , при этом на каждом шаге должны быть предпосылки (и) , а затем вы выполните всю команду в обратном порядке . Позвольте мне продемонстрировать на примере:
Резка дерева
Преимущества этого:
Недостатки:
Логически вы можете представить эти команды в виде блок-схемы, которая запускается сверху каждый раз, и то, что вы делаете, зависит от того, отвечаете ли вы «да» или «нет» на каждом шаге. Реализоваете ли вы это в коде или во внешнем файле, таком как XML, решать только вам.
источник
fun
в этом? ;)Если вы можете сделать последовательности довольно общими, там не так много кода для спагетти.
В случае поставок, например: WorkTask работает с WorkPlan. Рабочий план говорит, какой ресурсный блок должен выбрать, из какого дома, с помощью какой анимации ходьбы, с помощью какой рабочей анимации, времени на работу и всех подобных деталей. В итоге WorkTask может выглядеть так:
Мы успешно используем описанный подход. В нашей игре ~ 15 заданий. Некоторые основные моменты:
источник
Так что это в основном проблема топографической сортировки.
У вас есть график, каждый узел - это задача, которую необходимо выполнить, а некоторые узлы зависят от некоторых других узлов (это представлено ребром в графе от зависимого узла до узла, от которого он зависит). Вы хотите выполнить все задачи, поэтому вам нужно произвести НЕКОТОРОЕ упорядочение узлов, которое топографически нормально (зависимые узлы расположены после узлов, от которых они зависят).
Теперь таких порядков обычно много (поскольку некоторые узлы не имеют зависимостей и могут быть размещены где угодно, а некоторые узлы имеют одинаковые зависимости и не зависят друг от друга, поэтому они могут быть в любом порядке между собой, и любой узел может быть помещенным в любое место после того, как его зависимости сделаны, и прежде чем узлы, зависящие от этого, будут сделаны).
Также возможно, что нет способа сортировать топографический график - это происходит, когда на графике есть циклы (у вас нет дерева, чтобы получить дерево, вам нужно рубить дерево, рубить дерево, вам нужен топор, чтобы вы топорили вас нужен лес). В таком случае алгоритм, вероятно, должен указывать игроку, что эти задачи не могут быть выполнены.
Вы также можете добавить приоритеты к узлам, и задача может заключаться в том, чтобы найти такое упорядочение среди всех упорядочений, которые заполняют зависимости, для которых узлы с более высоким приоритетом выполняются первыми.
Вы также можете добавить восстановительные задачи - проще всего будет просто добавить задачу с тайм-аутом снова в график каждый раз, когда это будет сделано.
Теперь, как решить это - http://en.wikipedia.org/wiki/Topological_sorting
источник