: Execution Flow를 표현하고 제어하기 위한 모델
특히 게임 내 AI를 구현할 때 좋음
여러 가지의 State들이 존재하며, 하나의 State만 활성화될 수 있기 때문에, 다른 Action을 취하기 위해선 다른 State로 Transition해야 함.

인 그래프로 나타낼 수 있음.

예제에서는 자바인가? 자바스크립트인가? 아무튼 다른 언어로 쓰인 것 같던데... 열심히 C++로 바꿈
(클래스 메소드에 대한 포인터 멤버변수를 구현하느라 힘들었음 ㅠ_ㅠ)
class Ant
{
private:
int x;
int y;
FSM brain;
public:
Ant()
{
x = 0;
y = 0;
brain.setState(&FSM::findLeaf);
}
void update()
{
brain.update();
}
};
Ant라는 AI를 만들고, 이 Ant의 brain은 Finite-State Machine으로 구현한다.
class FSM
{
private:
void (FSM::*activeState)();
public:
void setState(void (FSM::*funcPtr)())
{
// Transition
activeState = funcPtr;
}
void runAway()
{
cout << "Run Away" << endl;
}
void findLeaf()
{
cout << "Find Leaf" << endl;
}
void goHome()
{
cout << "Go Home" << endl;
}
void update()
{
(this->*activeState)();
}
};
저 웹페이지 예제에서는 어떤 게임 엔진이랑 연동하여 하는 것 같기도 한데... 난 순수 C++로만 구현해서 cout하는 것 이상으로는 힘들 것 같다고 판단했다
int main()
{
Ant ant;
ant.update();
}
메인 함수에서 이렇게 호출하면 끝~

Ant가 go Home인 상태일 때, 마우스가 가까이 있다면 마우스를 피해 runAway 상태로 transition할 수도 있다. 때문에 새로운 transition을 만듦.
그러나, Ant가 run away 상태일 때, 마우스 커서가 Ant로부터 멀리 위치하게 되면, Ant는 find leaf 상태로 전이되어야 할까? 아니면 go home 상태로 전이되어야 할까?
단순히 현재 active transition을 변수로 저장해서는 안 된다는 것을 보여 준다.
따라서,
FSM을 스택으로 관리한다


이때, Full Transition이 되어야 함
다른 새로운 state를 push할 수도 있음.