Создание дерева поведения 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--> упоминает этот обзор деревьев поведения, который ссылается на более общие описания последовательности, селекторы и декораторы.