Я читаю this excellent article on how to create a state machine for ai purposes. К сожалению, у меня возникли проблемы с пониманием того, как расширить конечный автомат, указанный ниже. Псевдокод для этого примера, как представляется, задать конечный автомат для действия для текущего состояния:AI, State Machine - как расширить конечный автомат для обработки нескольких монстров?
do_stateless_ai(statemachine[action][currentstate]);
Что это значит, если мне нужно реализовать несколько монстра AIs?
Я могу создать одну реализацию конечного автомата и просто загрузить ее с помощью разных таблиц состояний, как показано ниже?
или
ли я код уникальные автоматы для каждого монстра?
или
ли я создать одну массивную таблицу состояний, если у меня есть несколько монстров? Извините, если этот вопрос кажется очень дилетантским, это первый раз, когда я пытаюсь реализовать ИИ.
Вот искусственный интеллект таблица состояний описана в статье:
DRAGON AI (частичного)
State: Obs: Action: input L input M input H NULL
SLEEPING L asleep-ai WAKING:1 HUNGRY:1
WAKING C none ENRAGED:1 HUNGRY:1 CURIOUS:1
ENRAGED C typical-ai, p1 WAKING:1
HUNGRY C typical-ai, p2 ENRAGED:1
CURIOUS A curious-ai ENRAGED:1 HUNGRY:1 BORED:0.1
А вот псевдокод для реализации этой машины:
acted = 0;
while (!acted)
{
observe(statemachine[obs][currentstate]);
shifted = 0;
for (inputs=FIRSTINPUT; inputs < LASTINPUT && !shifted; inputs++)
{
if (input_is_true(input))
{ /* note that what's stored in the statemachine is an expression,
not necessarily just a number. getshiftprob substitute in
values from the monster's extrinsic info and solves the expr.*/
probshift = getshiftprob
(statemachine[input][currentstate].probshift);
if random() < probshift
{
currentstate = statemachine[input][currentstate].state;
shifted = 1;
}
}
}
if statemachine[action][currentstate] != NULL
{
do_stateless_ai(statemachine[action][currentstate]);
acted = 1;
}
}