Лекция 6

Конечный автомат. Разработка продукционной модели представления знаний.

Конечным инициальным детерминированным автоматом называют объект, определенный следующими шестью понятиями:

•  входной алфавит A = { a1,...,am };

•  внутренний алфавит – множество состояний конечного автомата B = { b1,...,bn };

•  выходной алфавит C = { c1,...,cp };

•  функция переходов f : A x B C или f ( ai bi ) = bj , где ai A; bi, bj B;

•  функция выходов φ: B → C или φ ( bi ) = ci , где bi B, ci C .

Пример .

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

 

# define STATE_ATTACK 0 // атака игрока

# define STATE_RETREAT 1 // отступление

# define STATE_RANDOM 2 // случайное движение

# define STATE_STOP 3 // остановка на время

# define STATE_SEARCH 4 // поиск энергии

# define STATE _ PATTERN 5 // выбор и выполнение шаблона

int creature_state = STATE_STOP; // начальное состояние

int creature _ counter = 0; // отслеживание времени

int creature _ x = 320; // начальная позиция на экране

int creature_y = 200;

int creature_dx = 0; // текущая траектория

int creature_dy = 0;

int player_x = 10;

int player _ y = 20;

// реализация логики персонажа.

// обработка текущего состояния

switch ( creature _ state )

{

case STATE _ ATTACK :

// первый шаг: движение в направлении игрока

if (player_x > creature_x) creature_x++;

if (player_x < creature_x) creature_x--;

if (player_y > creature_y) creature_y++;

if (player_y < creature_y) creature_y--;

((rand ()) % 5) = = 1 FireCommon;

break ;

case STATE_RETREAT:

// движение от игрока

if (player_x > creature_x) creature_x--;

if (player_x < creature_x) creature_x++;

if (player_y > creature_y) creature_y--;

if (player_y < creature_y) creature_y++;

break ;

case STATE _ RANDOM :

// перемещение персонажей в случайном направлении, которое было определено при входе в это состояние

creature_x += creature_dx;

creature_y += creature_dy;

break ;

case STATE_STOP:

break ;

case STATE _ SEARCH :

// выбираем объект для поиска и движемся по направлению к нему

...

case STATE _ PATTERN :

// выбираем выбранный шаблон

...

}