유한 상태 기계 클래스 (FSM) 이주영, 전현수.

Slides:



Advertisements
Similar presentations
6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
Advertisements

OpenCV 안드로이드 연동 환경설정 OpenCV-Android 를 다운 받습니다.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제14장 동적 메모리.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
제 9 장 구조체와 공용체.
-Part2- 제3장 포인터란 무엇인가.
자료 구조: Chapter 3 (2)구조체, 포인터
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
Lesson 9. 예외처리.
5장. 참조 타입.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제 3장. C보다 나은 C++ II.
07. 디바이스 드라이버의 초기화와 종료 김진홍
C 프로그래밍.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
6장. printf와 scanf 함수에 대한 고찰
프로그래밍 랩 – 7주 리스트.
TCP/IP Socket Programming…
14장. 포인터와 함수에 대한 이해.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
11장. 1차원 배열.
C#.
13. 연산자 오버로딩.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
JA A V W. 06.
CHAP 21. 전화, SMS, 주소록.
객체기반 SW설계 팀활동지 4.
Canary value 스택 가드(Stack Guard).
데이터 동적 할당 Collection class.
Chapter 13. 템플릿(Template) 1
구조체 (Structure).
7주차: Functions and Arrays
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
3. 모듈 (5장. 모듈).
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
Chapter 11 구조체.
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
버스와 메모리 전송 버스 시스템 레지스터와 레지스터들 사이의 정보 전송을 위한 경로
13. 포인터와 배열! 함께 이해하기.
Pointers summary.
7 생성자 함수.
6 객체.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

유한 상태 기계 클래스 (FSM) 이주영, 전현수

목차 유한상태기계란? 게임의 AI에 적용 클래스 정의 <map> 설명

유한상태기계란? Finite state machine, FSM 유한한 개수의 상태들로 구성된 하나의 간단한 기계 하나의 ‘입력’을 받고 그에 의거해서 현재 상태로부터 다른 어떤 상태로 ‘전이’하는 식으로 작동

게임의 AI에 적용 흥분 광분 불쾌 분노 보통 플레이어의 공격 플레이어 떠남 또는 몬스터 치료됨 몬스터 치료됨 플레이어 등장 몬스터 다침

클래스 정의 구성 FSMstate 하나의 상태를 의미하는 클래스 FSMclass 임의의 개수의 FSMstate들로 구성된 하나의 상태 기계를 의미하는 클래스 이 두 클래스가 연동함으로써 하나의 범용적인 유한 상태 기계를 위한 기능성이 만들어진다. 범용적 : 유한 상태 기계를 구성하는 객체들이 일반화되어 있으며 FSM이 다양한 종류의 상태들과 상태 전이들을 지원할 수 있을뿐 아니라 임의의 개수의 상태 전이들과 상태들을 담을 수 있다는 뜻.

FSMstate 클래스의 정의 class FSMstate {     unsigned m_usNumberOfTransitions;         int *mpiInputs;     int *mpiOutputState;     int miStateID; public:     FSMstate(int iStateID, unsigned usTransitions);     ~FSMstate();         int GetID() { return miStateID; }     void AddTransition(int iInput, int iOutputID);     void DeleteTransition(int iOutputID);     int GetOutput(int iInput); };

FSMstate (계속) FSMstate::m_usNumberOfTransitions 이 상태가 지원할 수 있는 상태 전이들의 개수로 입력과 출력 배열의 크기가 이 변수에 의해 결정된다. FSMstate::m_piInputs 상태 전이에 쓰이는 입력값들을 담은 배열이다. FSMstate::piOutputState 상태 전이의 결과로 결정되는 출력 상태들을 가리키는 식별자들의 배열이다. FSMstate::m_iStateID FSMstate 클래스의 이 인스턴스(즉 이 상태)를 식별하는데 쓰이는 고유한 식별자이다.

FSMstate (계속) FSMstate::GetID() FSMstate 클래스의 이 인스턴스를 가리키는 식별자를 돌려준다. FSMstate::AddTransition() FSMstate의 이 인스턴스에 새로운 입력값들과 출력 상태 배열들을 추가하기 위한 수단이다. FSMstate::DeleteTransition() 기존의 입력값들과 그에 해당하는 출력 상태 식별자를 제거하기 위한 수단이다. FSMstate::GetOutput() 입력값을 받아서 상태전이를 수행하고 출력 상태의 식별자를 돌려주는 함수이다.

FSMclass 클래스 정의 class FSMclass { State_Map m_map; // 이 FSM의 모든 상태들을 담은 맵 int m_iCurrentState; // 현재 상태의 m_iStateID public: FSMclass( int iStateID ); // FSM의 초기 상태를 설정 ~FSMclass(); // 할당된 메모리를 해제 // 현재 상태 ID를 돌려준다. int GetCurrentState() { return m_iCurrentState; } // 현재 상태를 설정한다. void SetCurrentState( int iStateID ) { m_iCurrentState = iStateID; } // FSMstate 객체 초인터를 돌려준다. FSMstate *GetState( int iStateID ); // FSMstate 객체 포인터를 맵에 추가한다. void AddState ( FSMstate *pState ); // 맵으로부터 FSMstate 객체 포인터를 제거한다. void DeleteState( int iStateID ); // 입력과 현재 상태에 기반해서 상태 전이를 수행한다. int StateTransition( int iInput ); };

FSMclass (계속) FSMclass::m_map FSMstate 객체들의 컬렉션, STL <map>으로 구현된다. FSMclass::m_iCurrentState FSM의 현재 상태에 해당하는 FSMstate 객체의 상태 식별자이다. FSMclass::GetState() FSMstate에 담겨 있는 임의의 FSMstate 객체에 대한 포인터를 얻을 때 사용하는 함수이다. FSMclass::GetCurrentState() 현재 상태를 가리키는 고유한 식별자를 돌려준다. FSMclass::SetCurrentState() 다른 FSMstate 객체의 식별자를 현재 상태 식별자로 설정한다.

FSMclass (계속) FSMclass::AddState() FSM의 <map> 컨테이너에 새 FSM 객체 포인터들을 추가할 때 사용하는 함수이다. 이 함수를 통해서 새로운 상태들을 추가하게 된다. FSMclass::DeleteState() FSM의 <map>으로부터 FSM 객체 포인터를 제거하기 위한 수단이다. 기존의 상태들을 제거할 때 이 함수를 사용한다. FSMclass::StateTransition() 주어진 입력값으로 상태 전이를 일으키고 그 결과로 출력 상태 식별자를 얻을 때 사용하는 함수이다.

<map> Key / value 를 하나의 쌍으로 취급하는 원소를 관리하는 컨테이너 (단, key 중복은 허용)

Map (계속) 헤더파일 포함 #include<map> 정의 – 클래스템플릿으로 namespace std 안에 정의 namespace std { template< class Key, class T, class Compare = less<key>, class Allocator = allocator <pair<const Key, T>>> class map; }

FSM의 예 - 적 상태1 적의 영역에 들어오면 플레이어 따라감 가만히 제자리로 따라다님 적의 영역 안에 들어옴 제자리에 도착 플레이어가 적의 영역 안에서 벗어남

FSM의 예 - 적 상태2 적의 영역에 들어오면 도망다님 가만히 제자리로 도망다님 적의 영역 안에 들어옴 제자리에 도착 플레이어가 적의 영역 안에서 벗어남

플레이어가 적의 영역 안에서 들어왔을 경우 플레이어가 화가 났음 FSM의 예 - 적 상태3 적의 영역에 들어오면 도망다님 플레이어가 적의 영역 안에서 벗어남 보통 화남 플레이어가 적의 영역 안에서 들어왔을 경우 플레이어가 화가 났음

FSM의 예 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Enemy 24 25 26 27 28 29 0 ~ 35 ID 보통 30 31 32 33 34 35 흥분

FSM의 예 Message 구조체 struct MESSAGEOBJECT { char strMessageName[256]; // 메세지 이름 char strSender[256]; // 송신자 char strReceiver[256]; // 수신자 float fDeliveryTime; // 메시지 보내는 시간 D3DXVECTOR3 vPos; // 플레이어 위치 D3DXVECTOR3 vDir; // 플레이어의 방향벡터 bool bAngry; // 플레이어의 상태 };

FSM의 예 CCube (Player) CFrameView CMessage Router CFSMclass (Enemy) CFSMstate Player가 위치한 영역에 있는 Enemy에게 “도망다녀라”는 메시지 전송 위치데이터받아옴 위치데이터가 담긴 메시지 전송 “도망다녀라”로 상태 전이 Player가 위치한 영역에 있는 Enemy에게 “따라다니라”는 메시지 전송 “따라다니라”로 상태 전이 현재 위치한 영역 바로 전에 있던 영역에 있는 Enemy에게 “제자리에 가라”는 메시지 전송 “제자리에 가라”로 상태 전이 Enemy가 제자리로 이동 중 제자리에 갔으면 “가만히 있어라”로 상태 전이

FSM의 예 CCube CFSMstate + m_pVB; + m_pIB; + m_pd3dDevice; + m_matWorld; + m_vOriginTrans; + m_vTrans; + m_vTargetTrans; + m_fVelocity; + m_usNumberOfTransitions; + m_pnInouts; + m_pnOutoutState; + m_nStateID; + CCube(); + ~Ccube(); + Create(); + SetLocation(); + FrameMove(); + Render(); + Release(); + CFSMstate(); + ~CFSMstate(); + GetID(); + AddTransition(); + GetOutput();

FSM의 예 CFSMclass CMessageRouter + m_pd3dDevice; + m_StateMap; + m_nCurrentState; + m_Enemy; + m_fVelocity; + m_pd3dDevice + m_nEnemyNum; + m_nBeforeLotID; + m_nCurrentLotID; + CFSMclass(); + ~CFMSclass(); + GetCurrentState(); + SetCurrentState(); + GetState(); + AddState(); + DeleteState(); + StateTransition(); + ReceiveMessage(); + CMessageRouter(); + ~CMessageRouter(); + Create(); + FrameMove(); + GetPlayerLocationID(); + Render(); + Release();

THE END