SlideShare una empresa de Scribd logo
1 de 19
게임 인공지능
                                                          GameAI




                    상태구동형 에이전트의 디자인
                    By Changhoon Park
                    http://www.wawworld.me
                                             Last Update : 2012. 03. 03

12년	 3월	 31일	 토요일
유한상태기계(FSM)란?




               2




                                    By Changhoon Park
                                          http://wawworld.me

12년	 3월	 31일	 토요일
FSM의 정의 (p46)

             유한상태기계는 주어지는 모든 시간에서 처해 있을 수 있는
             유한 개의 상태를 가지고 주어지는 입력에 따라 어떤 상태에
             서 다른 상태로 전환시키거나 출력 이나 액션이 일어나게 하
             는 장치 또는 그런 장치를 나타낸 모델이다.




               3




                                                By Changhoon Park
                                                      http://wawworld.me

12년	 3월	 31일	 토요일
FSM의 정의 (p46)

              • 유한 수의 상태를 가진다
              • 외부로 부터 입력을 받아들인다
              • 자신의 상태를 전환할 수 있다.
              • 상태에서 출력이나 액션이 일어나게 한다.




               4




                                         By Changhoon Park
                                               http://wawworld.me

12년	 3월	 31일	 토요일
FSM의 아이디어 (p46)

             객체의 행동을 쉽게 처리할수 있는 ‘덩어리’ 또는 상태들로
             분해하는 것




               5




                                                By Changhoon Park
                                                      http://wawworld.me

12년	 3월	 31일	 토요일
FSM의 아이디어 (p46)


             예) 전등
                • 상태의 수
                • 외부 입력
                • 상태 전환
                • 출력/액션




               6




                               By Changhoon Park
                                     http://wawworld.me

12년	 3월	 31일	 토요일
게임에서 FSM의 이용 예 (p47)

              Pac-Man에서 ghost의 행동




              - 도피하기 상태 / 추격하기 상태
              - 추격하기에서 도피하기로 전환하기 위한 조건
              - 도피하기에서 추격하기로 전환하기 위한 조건




               7




                                          By Changhoon Park
                                                http://wawworld.me

12년	 3월	 31일	 토요일
FSM은 AI 프로그래머가 에이전트(NPC)에게
                    환상적인 지능을 제공하기 위해 선택한 도구




               8




                                             By Changhoon Park
                                                   http://wawworld.me

12년	 3월	 31일	 토요일
FSM이 좋은 이유 (p45)


             빠르고 코딩하기 쉬움
             - 유한 상태를 구현하는 방법은 여러가지가 있음




               9




                                          By Changhoon Park
                                                http://wawworld.me

12년	 3월	 31일	 토요일
FSM이 좋은 이유 (p45)


             오류 수정이 쉬움
             - 각 상태에 추적자 코드를 추가하여 오류수정이 가능




              10




                                             By Changhoon Park
                                                   http://wawworld.me

12년	 3월	 31일	 토요일
FSM이 좋은 이유 (p45)


             계산 부담이 없음
             - 코드화된 규칙으로 if-this-then-that과 같은 사고 절차




              11




                                                       By Changhoon Park
                                                             http://wawworld.me

12년	 3월	 31일	 토요일
FSM이 좋은 이유 (p45)


             직관적임
             - 의사소통이나 아이디어 교환을 개선하기 위한 방법으로 제공




              12




                                                 By Changhoon Park
                                                       http://wawworld.me

12년	 3월	 31일	 토요일
FSM이 좋은 이유 (p45)


             유연함
             - 새로운 상태와 규칙을 쉽게 추가하여 에이전트 행동의 법위를 간단하게 확장




              13




                                                   By Changhoon Park
                                                         http://wawworld.me

12년	 3월	 31일	 토요일
FSM을 구현하는 방법




              14




                                   By Changhoon Park
                                         http://wawworld.me

12년	 3월	 31일	 토요일
enum StateType {
                                            RunAway, Patrol, Attack
                                       };
             IF-THEN / SWITCH (p48)    void Agent::UpdateState(StateType CurrentState)
                                       {
                                            switch (CurrentState) {
             더 많은 상태와 조건이 추가되는 경우?                case state_RunAway:
                                                     EvadeEnemy();
                                                     if (Safe()) {
             초기 상태 진입할 때 / 상태에서 빠져 나                   ChangeState( state_Patrol);
             올 때 / 보통 상태일 때                          }
                                                  break;
                                                  case state_Patrol:
                                                     FollowPatrolPath();
                                                     if (Threatened()) {
                                                           if (StrongerThanEnemy()) {
                                                              ChangeState( state_Attack);
                                                           } else {
                                                              ChangeState( state_RunAway);
                                                            }
                                                       }
                                                  break;
                                                   case state_Attack:
                                                     if (WeakerThanEnemy()) {
                                                       ChangeState( state_RunAway);
                                                     } else {
              15
                                                       BashEnemyOverHead();
                                                     }
                                                  break;
                                             }//end switch
                                       }

                                                                           By Changhoon Park
                                                                                   http://wawworld.me

12년	 3월	 31일	 토요일
상태 전환표




               •표를 정기적으로 질의하며 수신한 자극을 근거로 상태 전환 (작은 칩)
               •각 상태는 에이전트 외부에 존재하는 별개의 객체로 모델링 (카트리지)
               •새로운 상태 추가 (카트리지 추가, 상태규칙 칩 재프로그램)



              16




                                                     By Changhoon Park
                                                           http://wawworld.me

12년	 3월	 31일	 토요일
내장된 규칙들

             상태들 자신의 내부에 상태 전환을 위한 규칙을 내장

             카트리지
             - 카트리지 내부에 상태전환 칩의 규칙을 포함
             - 외부 논리(상태전환 칩)에 의존하지 않음
             - 새로운 카트리지를 추가할 때 머리에 손댈 필요 없음
             - 각 카트리지는 다른 카트리지가 존재하고 있음을 알고 있음




              17




                                                 By Changhoon Park
                                                       http://wawworld.me

12년	 3월	 31일	 토요일
내장된 규칙들

             상태들 자신의 내부에 상태 전환을 위한 규칙을 내장

             객체로 캡슐화된 상태
             - 상태전환을 위한 논리 포함
             - 모든 상태의 공통 인터페이스를 가짐

               class State                               class Troll
               {                                         {
               public:                                        /* ATTRIBUTES OMITTED */
                 virtual void Execute(Troll* troll)=0;       State* m_pCurrentState;
               };                                        public:
                                                              /* INTERFACE TO ATTRIBUTES OMITTED */
                                                              void Update() {
                                                                  m_pCurrentState->Execute(this;)
                                                              }
                                                              void ChangeState(const State* pNewState) {
                                                                  delete m_pCurrentState;
              18                                                  m_pCurrentState = pNewState;
                                                              }
                                                         };



                                                                                                      By Changhoon Park
                                                                                                            http://wawworld.me

12년	 3월	 31일	 토요일
내장된 규칙들

             상태들 자신의 내부에 상태 전환을 위한 규칙을 내장

    //------------------------------State RunAway          //-----------------------------State_Sleep
    class State_Runway : public State                      class State_Slepp : public State
    {                                                      {
          void Execute(Troll* troll) {                           void Execute(Troll* troll) {
               if(troll->isSafe()) {                                  if(troll->isThreatened()) {
                  troll->ChangeState(new State_Sleep());                 troll->ChangeState(new State_RunAway())
               } else {                                               } else {
                  troll->MoveAwayFromEnemy();                            troll->Snore();
               }                                                      }
          }                                                      }
    };                                                     };




              19




                                                                                                By Changhoon Park
                                                                                                      http://wawworld.me

12년	 3월	 31일	 토요일

Más contenido relacionado

Destacado

120629 fsm in unity3d skyseer
120629 fsm in unity3d skyseer120629 fsm in unity3d skyseer
120629 fsm in unity3d skyseer
Chan-hyun Park
 
인공지능(Ai)
인공지능(Ai)인공지능(Ai)
인공지능(Ai)
민호 송
 
[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발
[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발
[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발
MinGeun Park
 
Game AI Overview
Game AI OverviewGame AI Overview
Game AI Overview
기룡 남
 
쩌는 게임 기획서, 이렇게 쓴다(How to write great design documents) from GDC 2008 (Korean)
쩌는 게임 기획서, 이렇게 쓴다(How to write great design documents) from GDC 2008 (Korean)쩌는 게임 기획서, 이렇게 쓴다(How to write great design documents) from GDC 2008 (Korean)
쩌는 게임 기획서, 이렇게 쓴다(How to write great design documents) from GDC 2008 (Korean)
Kay Kim
 

Destacado (17)

게임 기획자 대체 뭐하는 놈들일까
게임 기획자 대체 뭐하는 놈들일까 게임 기획자 대체 뭐하는 놈들일까
게임 기획자 대체 뭐하는 놈들일까
 
120629 fsm in unity3d skyseer
120629 fsm in unity3d skyseer120629 fsm in unity3d skyseer
120629 fsm in unity3d skyseer
 
광운대[바람] 4.vhdl fsm
광운대[바람] 4.vhdl fsm광운대[바람] 4.vhdl fsm
광운대[바람] 4.vhdl fsm
 
Fsm
FsmFsm
Fsm
 
Kgc2012강연 이석준
Kgc2012강연  이석준Kgc2012강연  이석준
Kgc2012강연 이석준
 
Game Design patterns, Visitor, State, FSM pattern
Game Design patterns, Visitor, State, FSM patternGame Design patterns, Visitor, State, FSM pattern
Game Design patterns, Visitor, State, FSM pattern
 
디자인 패턴
디자인 패턴디자인 패턴
디자인 패턴
 
인공지능(Ai)
인공지능(Ai)인공지능(Ai)
인공지능(Ai)
 
[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발
[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발
[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발
 
5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)
 
Game AI Overview
Game AI OverviewGame AI Overview
Game AI Overview
 
Ai voice shock 2017 리뷰
Ai voice shock 2017 리뷰Ai voice shock 2017 리뷰
Ai voice shock 2017 리뷰
 
쩌는 게임 기획서, 이렇게 쓴다(How to write great design documents) from GDC 2008 (Korean)
쩌는 게임 기획서, 이렇게 쓴다(How to write great design documents) from GDC 2008 (Korean)쩌는 게임 기획서, 이렇게 쓴다(How to write great design documents) from GDC 2008 (Korean)
쩌는 게임 기획서, 이렇게 쓴다(How to write great design documents) from GDC 2008 (Korean)
 
Ai 그까이거
Ai 그까이거Ai 그까이거
Ai 그까이거
 
게임 기획 튜토리얼 (2015 개정판)
게임 기획 튜토리얼 (2015 개정판)게임 기획 튜토리얼 (2015 개정판)
게임 기획 튜토리얼 (2015 개정판)
 
프로그래머에게 사랑받는 게임 기획서 작성법
프로그래머에게 사랑받는 게임 기획서 작성법프로그래머에게 사랑받는 게임 기획서 작성법
프로그래머에게 사랑받는 게임 기획서 작성법
 
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
 

Más de Hoseo University (9)

Esl podcast 743 – writing a story
Esl podcast 743 – writing a storyEsl podcast 743 – writing a story
Esl podcast 743 – writing a story
 
목적이 부여된 에이전트 행동
목적이 부여된 에이전트 행동목적이 부여된 에이전트 행동
목적이 부여된 에이전트 행동
 
FoundationKit
FoundationKitFoundationKit
FoundationKit
 
Raven
RavenRaven
Raven
 
프로젝트 구성
프로젝트 구성프로젝트 구성
프로젝트 구성
 
구성(Composition)
구성(Composition)구성(Composition)
구성(Composition)
 
Objective-C에서의 OOP
Objective-C에서의 OOPObjective-C에서의 OOP
Objective-C에서의 OOP
 
Dt2210.01.syllabus
Dt2210.01.syllabusDt2210.01.syllabus
Dt2210.01.syllabus
 
Dt3160.01
Dt3160.01Dt3160.01
Dt3160.01
 

Game ai.fsm.01

  • 1. 게임 인공지능 GameAI 상태구동형 에이전트의 디자인 By Changhoon Park http://www.wawworld.me Last Update : 2012. 03. 03 12년 3월 31일 토요일
  • 2. 유한상태기계(FSM)란? 2 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 3. FSM의 정의 (p46) 유한상태기계는 주어지는 모든 시간에서 처해 있을 수 있는 유한 개의 상태를 가지고 주어지는 입력에 따라 어떤 상태에 서 다른 상태로 전환시키거나 출력 이나 액션이 일어나게 하 는 장치 또는 그런 장치를 나타낸 모델이다. 3 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 4. FSM의 정의 (p46) • 유한 수의 상태를 가진다 • 외부로 부터 입력을 받아들인다 • 자신의 상태를 전환할 수 있다. • 상태에서 출력이나 액션이 일어나게 한다. 4 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 5. FSM의 아이디어 (p46) 객체의 행동을 쉽게 처리할수 있는 ‘덩어리’ 또는 상태들로 분해하는 것 5 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 6. FSM의 아이디어 (p46) 예) 전등 • 상태의 수 • 외부 입력 • 상태 전환 • 출력/액션 6 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 7. 게임에서 FSM의 이용 예 (p47) Pac-Man에서 ghost의 행동 - 도피하기 상태 / 추격하기 상태 - 추격하기에서 도피하기로 전환하기 위한 조건 - 도피하기에서 추격하기로 전환하기 위한 조건 7 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 8. FSM은 AI 프로그래머가 에이전트(NPC)에게 환상적인 지능을 제공하기 위해 선택한 도구 8 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 9. FSM이 좋은 이유 (p45) 빠르고 코딩하기 쉬움 - 유한 상태를 구현하는 방법은 여러가지가 있음 9 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 10. FSM이 좋은 이유 (p45) 오류 수정이 쉬움 - 각 상태에 추적자 코드를 추가하여 오류수정이 가능 10 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 11. FSM이 좋은 이유 (p45) 계산 부담이 없음 - 코드화된 규칙으로 if-this-then-that과 같은 사고 절차 11 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 12. FSM이 좋은 이유 (p45) 직관적임 - 의사소통이나 아이디어 교환을 개선하기 위한 방법으로 제공 12 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 13. FSM이 좋은 이유 (p45) 유연함 - 새로운 상태와 규칙을 쉽게 추가하여 에이전트 행동의 법위를 간단하게 확장 13 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 14. FSM을 구현하는 방법 14 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 15. enum StateType { RunAway, Patrol, Attack }; IF-THEN / SWITCH (p48) void Agent::UpdateState(StateType CurrentState) { switch (CurrentState) { 더 많은 상태와 조건이 추가되는 경우? case state_RunAway: EvadeEnemy(); if (Safe()) { 초기 상태 진입할 때 / 상태에서 빠져 나 ChangeState( state_Patrol); 올 때 / 보통 상태일 때 } break; case state_Patrol: FollowPatrolPath(); if (Threatened()) { if (StrongerThanEnemy()) { ChangeState( state_Attack); } else { ChangeState( state_RunAway); } } break; case state_Attack: if (WeakerThanEnemy()) { ChangeState( state_RunAway); } else { 15 BashEnemyOverHead(); } break; }//end switch } By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 16. 상태 전환표 •표를 정기적으로 질의하며 수신한 자극을 근거로 상태 전환 (작은 칩) •각 상태는 에이전트 외부에 존재하는 별개의 객체로 모델링 (카트리지) •새로운 상태 추가 (카트리지 추가, 상태규칙 칩 재프로그램) 16 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 17. 내장된 규칙들 상태들 자신의 내부에 상태 전환을 위한 규칙을 내장 카트리지 - 카트리지 내부에 상태전환 칩의 규칙을 포함 - 외부 논리(상태전환 칩)에 의존하지 않음 - 새로운 카트리지를 추가할 때 머리에 손댈 필요 없음 - 각 카트리지는 다른 카트리지가 존재하고 있음을 알고 있음 17 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 18. 내장된 규칙들 상태들 자신의 내부에 상태 전환을 위한 규칙을 내장 객체로 캡슐화된 상태 - 상태전환을 위한 논리 포함 - 모든 상태의 공통 인터페이스를 가짐 class State class Troll { { public: /* ATTRIBUTES OMITTED */ virtual void Execute(Troll* troll)=0; State* m_pCurrentState; }; public: /* INTERFACE TO ATTRIBUTES OMITTED */ void Update() { m_pCurrentState->Execute(this;) } void ChangeState(const State* pNewState) { delete m_pCurrentState; 18 m_pCurrentState = pNewState; } }; By Changhoon Park http://wawworld.me 12년 3월 31일 토요일
  • 19. 내장된 규칙들 상태들 자신의 내부에 상태 전환을 위한 규칙을 내장 //------------------------------State RunAway //-----------------------------State_Sleep class State_Runway : public State class State_Slepp : public State { { void Execute(Troll* troll) { void Execute(Troll* troll) { if(troll->isSafe()) { if(troll->isThreatened()) { troll->ChangeState(new State_Sleep()); troll->ChangeState(new State_RunAway()) } else { } else { troll->MoveAwayFromEnemy(); troll->Snore(); } } } } }; }; 19 By Changhoon Park http://wawworld.me 12년 3월 31일 토요일