Найти в Дзене

Конечные автоматы

В программировании часто встречается такая вещь как конечные автоматы. По сути это такой блок в котором хранится какое то состояние и он может на основе входных данных и своего состояния решать что нужно делать дальше и менять свое состояние на новое. Это используется например в играх для создания ИИ. Конечный автомат это автомат у которого может быть конкретное, не бесконечное количество состояний. К примеру возьмем такой ИИ врага в игре. У него есть три состояния: патрулирует территорию высматривая главного героя, увидев его он идет включать тревогу и после этого начинает атаковать. Если гг ушел и атаковать некого, то он снова начинает патрулировать. Вот простая примитивная реализация такого автомата. Представим себе другую ситуацию: враг патрулирует территорию, но иногда у него появляется работа, разгружать ящики. Если ящики разгружены то он продолжает патрулировать, если во время разгрузки напал гг, то надо атаковать его. И проблема здесь в том что если атака закончилась, то не
Оглавление

В программировании часто встречается такая вещь как конечные автоматы. По сути это такой блок в котором хранится какое то состояние и он может на основе входных данных и своего состояния решать что нужно делать дальше и менять свое состояние на новое. Это используется например в играх для создания ИИ.

Обычный конечный автомат

-2

Конечный автомат это автомат у которого может быть конкретное, не бесконечное количество состояний. К примеру возьмем такой ИИ врага в игре. У него есть три состояния: патрулирует территорию высматривая главного героя, увидев его он идет включать тревогу и после этого начинает атаковать. Если гг ушел и атаковать некого, то он снова начинает патрулировать.

-3

Вот простая примитивная реализация такого автомата.

-4

Стековый конечный автомат

Представим себе другую ситуацию: враг патрулирует территорию, но иногда у него появляется работа, разгружать ящики.

-5

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

Для этого есть стековый автомат. Отличие в том что состояние это теперь стек, в который мы можем докладывать или убирать конкретные состояния. Если враг патрулирует территорию и в этот момент привезли ящики, то мы кладем в стек состояние "есть ящики" и выполняем действие по разгрузке. Если в этот момент рядом появился гг то мы добавляем в стек состояние "атака" и атакуем. И теперь когда атака завершилась, мы убираем атаку из стека и возвращаемся к предыдущему делу - разгрузке.

-6

Хобби
3,2 млн интересуются