티스토리 뷰
오늘의 포스팅 내용은 유한상태기계(finite-state machine,FSM) 이다.
내가 FSM이라는 개념을 알게된 이유는 개발하는 게임의 AI 처리를 위해서였다.
"어떻게하면 한 클래스가 상황에 따라 다른동작을하게 하고 쉽게 관리할수 있을까?"를 고민하다 GPG에서 발견한개념이 FSM이다.
FSM에 대해 간단히 설명하자면 "FSM 이란 용어 그대로 유한한 상태들로 구성된 기계라고 보면 된다. 여기에서 상태란
하나의 조건이라고 생각하면 된다. 상태의 예를 들자면 문이 열림, 닫힘, 잠김 등이된다.
FSM은 어떤 입력에 의해서 하나의 상태에서 다른 상태로 전이되는 식으로 동작한다.
그래서 FSM은 상태를 전이시키기위해 어떤상태로 바꿀지에대한 간단한 전이함수를 가진다."
라고 GPG에서 설명해주고 이것을 내 나름대로 정리해보면 어떠한 클래스의 상태변화를
else if로 도배를 하느냐 아니면 상태마다 클래스를 제작한후 해당상태를 전이해서 동작시키냐의 차이이다.
그리고 이러한 클래스가 여러개일경우 else if로 관리하는것보단 하나의 상태를 하나의클래스로 관리하는게 훨씬 유용하다고 생각한다.
그러면 어떠한 객체의(ex.문)의 상태(ex. 열림, 잠김, 닫힘등...)를 어떻게 바꾸냐는 의문이 생긴다.
그것을 해결하기위해 FSM은 전이함수를 가지고 있어야 한다.
상태이동인 전이함수는 하나의 입력을 기준으로 다음상태를 판단한다.
즉 내가 A상태일때 어떤입력이 들어올경우 다음상태는 B라고 전이시키는 것이다.
다음은 GPG에 나오는 몬스터의 FSM예시이다.
아까의 설명을 예시와 함께 다시 설명하자면 몬스터가 [보통]의 상태에있을때
[플레이어의 공격] 이라는 입력이 들어오면 몬스터 클래스의 FSM의 상태를 [흥분] 상태로 전이시킨다.
또는 [플레이어 등장] 이라는 입력이 들어오면 몬스터 클래스의 FSM의 상태를 [불쾌] 상태로 전이한다는것이다.
다음표는 몬스터의 상태를 전이시킬 규칙이 적힌 표이다.
이러한 상태규칙을 기반으로 몬스터의 상태들을 만들고 실행하면 몬스터는 마치 하나의 감정을 가지고있는
괴물처럼 움직일 것이다.
이론 설명은 여기까지만 하고 예제코드는 조만간에 만들어서 올려놔야겠다.
누군가에게는 작은도움이 되었기를 바라면서 오늘의 포스팅 끝~
'Algorithm' 카테고리의 다른 글
[알고리즘] 깊이우선탐색(Depth-First Search)과 너비우선탐색(Breadth-First Search) (2) (2) | 2016.02.01 |
---|---|
[알고리즘] 깊이우선탐색(Depth-First Search)과 너비우선탐색(Breadth-First Search) (1) (1) | 2016.02.01 |
[알고리즘] 이진탐색트리(Binary Search Tree) (1) | 2016.02.01 |
[알고리즘] 접미사배열(Suffix Array)과 LCP(Longest Common Prefix)를 이용해서 반복 부분문자열 구하기 (0) | 2016.02.01 |
[알고리즘] 라빈-카프(Rabin-Carp) 알고리즘 (1) | 2016.02.01 |
- Total
- Today
- Yesterday
- 루비 메타프로그래밍
- Elasticsearch Cluster
- gap lock
- 엘라스틱서치 기초
- ruby meta programming
- 되추적
- 루비 상수
- 트랜잭션
- innoDB lock
- 루비
- 메타프로그래밍
- MySQL 인덱스
- metaprogramming
- MySQL
- db
- 페어프로그래밍
- lock
- InnoDB
- 인덱스
- 갭 락
- Autoloading
- ruby
- dead lock
- 넥스트 키 락
- MySQL 족보
- Pair-programming
- mysql lock
- autoload_paths
- next key lock
- 페어 프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |