# 3.9.1 Деревья поведения в сравнении с иерархическими машинами состояния

В начале эпохи игрового программирования разработчики, как правило, использовали иерархические машины состояний, подобные SMACH. Основная сложность этих машин заключается в отслеживании всех переходов между состояниями. Добавление нового состояния или поведения к персонажу (или роботу) требует не только кодирования нового состояния, но и добавления переходов между всеми связанными состояниями. Вскоре диаграмма состояний игры начинает немного напоминать запутанные спагетти, что может затруднить её понимание и отладку.

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

![](https://596823033-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8R5mFg_bmybGIyKwmo%2F-M8ea1fHCxdpfujFVCSx%2F-M8ebcty8rFeQPX-bK-9%2F%D0%B3%D1%80%D0%B0%D1%84_1.png?alt=media\&token=813a37be-36c8-4914-a3c6-c187cfebde8e)

Деревья поведения разрушают сложные задачи, разветвляя их на набор условий и подзадач. Дерево всегда выполняется сверху вниз и слева направо. Для данного уровня дерева узлы слева имеют более высокий приоритет, чем узлы справа. В дереве, показанном выше, это означает, что ветвь дерева «СТОЯТЬ СПОКОЙНО» всегда будет запускаться перед ветвью «ПАТРУЛИРОВАТЬ». Аналогично, задача «ПРОВЕРЯТЬ БАТАРЕЮ» всегда будет выполняться перед поведением «ПОДЗАРЯДКА».&#x20;

Поведения, или условия, находящиеся на дереве выше, такие как «стоять спокойно», более абстрактны, в то время как те, что находятся на более низких уровнях («перейдите к док-станции»), более конкретны. Фактически, только конечные узлы в каждой ветви дерева приводят к реальному поведению. Терминальные узлы, также известные как «листовые узлы», окрашены в красный цвет на диаграмме выше. Мы еще можем называть их «узлами действия». Синие узлы именуются «внутренними узлами» и представляют собой последовательности или другие составные модели поведения.&#x20;

Самое важное различие между деревьями поведения и иерархическими машинами состояний заключается в том, что между поведениями на одном и том же уровне дерева никогда не существует прямых связей: любая связь между такими «родственными» поведениями может быть только косвенной в силу общих связей с поведениями более высокого уровня. Например, в SMACH версии робота для уборки дома, которую мы запрограммировали ранее, задачи «чистая ванна» и «мытье пола» в машине состояния ванной комнаты соединяются непосредственно друг с другом через переходы, такие как «когда ванна чистая, начните мыть пол». Такого рода боковые связи никогда не могут возникнуть в дереве поведения. Это означает, что отдельные модели поведения можно рассматривать как независимые модули и перемещать по дереву, не беспокоясь о разрыве боковых связей с другими моделями поведения.
