Создание дерева поведения AI в C# - как?
Я пытаюсь создать "дерево поведения" с помощью C#.
для тех, кто не знает, дерево поведения-это в основном структура, вокруг которой вы можете построить ИИ. Есть секвенсоры, селекторы, декораторы, композитные действия и другие вещи.
Я нашел одну библиотеку, которая имплиментировала "дерево поведения" в C#, расположенное здесь (http://code.google.com/p/treesharp/) но я не могу понять, как на самом деле использовать его, так как нет пример кода, из которого я могу рисовать. Может ли кто-нибудь здесь, возможно, сделать простой пример кода, который показывает, как на самом деле использовать эту структуру.. или, возможно, вы знаете другой способ имплиментировать дерево поведения в C#?
спасибо!
2 ответов
Я просто посмотрел на эту реализацию, и мне интересно, почему так много кода нужно для чего-то относительно простого.
от того, что вы говорите, вы хотите простой способ создания поведения. Поведение здесь, я полагаю, является отображением от состояния до нуля или более действий агента. Вы можете моделировать это очень легко, используя C# lambdas. Например:
Action Selector(Func<bool> cond, Action ifTrue, Action ifFalse) {
return () => { if cond() then ifTrue() else ifFalse() };
}
Action Sequencer(Action a, Action b) {
return () => { a(); b(); }
}
листья вашего дерева-это простые действия, которые делают что-то соответствующее состоянию. Вы "запустите" дерево, просто выполнив его.
если вы хотите получить фантазии, вы можете параметризовать эту схему, чтобы сделать состояние явным.
надеюсь, что это помогает.
---- добавление ----
Джейсон попросил пример того, как вы могли бы использовать этот подход, поэтому вот простой пример патрулирования "AI" (я предполагаю, что WorldState соответствует описанию среды во время оценки дерева поведения):
Func<bool> ifPlayerIsInSight = () => ...true iff WorldState shows guard can see player...;
Action shootAtPlayer = () => { ...aim guard's weapon at player and fire... };
Func<bool> ifUnderFire = () => ...true iff WorldState shows guard hears player gunfire...;
Action takeCover = () => { ...guard runs for nearest shelter... };
Action walkBackAndForthGuardingDoorway = () => { ...default guard patrol behaviour... };
Action patrollingGuardBehaviour =
Selector(ifPlayerIsInSight, shootAtPlayer,
Selector(ifUnderFire, takeCover,
walkBackAndForthGuardingDoorway));
сделать охранник сделай что-нибудь, просто позвони patrollingGuardBehaviour()
. Обратите внимание, что различные вспомогательные действия и тесты могут быть реализованы как методы с правом подписи, а не встроенный, как лямбда-выражения. Вы можете добавить другие комбинаторы в Selector
и Sequencer
, например, для параллельной деятельности.
похоже, что один из разработчиков за TreeSharp,apocdev, имеет код, который использует TreeSharp для какого-то заклинания World of Warcraft player.
вот фрагмент:
public Composite CreateSpellCheckAndCast(string name)
{
return new Decorator(
ret => Spells.CanCast(name),
new Action(ret => Spells.Cast(name)));
}
Я не уверен, но вот применение довольно простое:Decorator
класс выглядит так, как будто он проверяет предикат (Spells.CanCast
) перед попыткой выполнить какое-либо действие (Spells.Cast
).
так Composite
, возможно,Action
это может сделать несколько вещи, например, проверить предикат заранее или выполнить несколько действий в определенной последовательности.
apocdev это!--8--> упоминает этот обзор деревьев поведения, который ссылается на более общие описания последовательности, селекторы и декораторы.