SlideShare una empresa de Scribd logo
1 de 27
CH7. Raven : 개관게임인공지능 프로그램하기 아꿈사(AnDStudy.com) 박일(http://parkpd.egloos.com/)
개관
탄환 & 공격
TEST_FIXTURE(FixtureBot3, UpdateVision) {     // 등뒤에 있기 m_pBot1->SetPos(Vector2D(0, 0));     m_pBot1->RotateFacingTowardPosition(Vector2D(1, 0));     // fov 가 a 도라고 하면 실제로는 -a/2 ~ a/2 사이에 보여야 한다.     m_pBot1->SetFieldOfView(DegsToRads(180.0));     // m_pBot1~m_pBot2, m_pBot1~m_pBot3 중에서 가까운 녀석이 타겟이 된다.     m_pBot3->SetPos(Vector2D(-3, 0));     m_pBot2->SetPos(Vector2D(-1, 0));       // 뒤에서는 안 보이고 CHECK(!isSecondInFOVOfFirst(         m_pBot1->Pos(), m_pBot1->Facing(), m_pBot2->Pos(), m_pBot1->FieldOfView()));     m_pBot2->SetPos(Vector2D(2, 0));        // 앞에서는 보인다 CHECK(isSecondInFOVOfFirst(         m_pBot1->Pos(), m_pBot1->Facing(), m_pBot2->Pos(), m_pBot1->FieldOfView()));     m_pBot1->m_pSensoryMem->UpdateVision();     // 앞에 있는 bot2 는 보고, bot3 는 못본다. 각도만 신경쓰고, 거리는 신경 안쓴다.     MemoryRecord& info2 = m_pBot1->GetSensoryMem()->m_MemoryMap[m_pBot2];     CHECK(info2.bWithinFOV);     MemoryRecord& info3 = m_pBot1->GetSensoryMem()->m_MemoryMap[m_pBot3];     CHECK(!info3.bWithinFOV);     // 벽에 가려지지만 않으면 모두 sense 를 할 수 있다.     std::list<Raven_Bot*> SensedBots =          m_pBot1->GetSensoryMem()->GetListOfRecentlySensedOpponents();     CHECK_EQUAL(2, SensedBots.size());     // Update -> UpdateMovement 에서 위치 못하도록 못 움직이게 만든다.     m_pBot1->SetMaxSpeed(0.0);     m_pBot1->Update();          // TakeAimAndShoot     Raven_TargetingSystem* pTargetSys1 = m_pBot1->GetTargetSys();     CHECK(0 < pTargetSys1->GetTimeTargetHasBeenVisible());     Raven_Bot* pTarget = m_pBot1->GetTargetBot();     CHECK(pTarget);     CHECK_EQUAL(pTarget->ID(), m_pBot2->ID());     CHECK_EQUAL(1, m_World.GetNumProjectiles());    // 총알 하나 발사 }
TEST_FIXTURE(FixtureBot2, Bot1ShootBoltToBot2){    CHECK_EQUAL(100, m_pBot1->Health());    m_pBot1->SetPos(Vector2D(0, 0));    m_pBot2->SetPos(Vector2D(2, 0));    Bolt* pBolt = m_World.AddBolt(m_pBot1, Vector2D(4, 0));    CHECK(IsSimilarVector2D(Vector2D(0, 0), pBolt->Pos(), 0.01));    CHECK(!pBolt->isDead());    m_World.Update();    CHECK(IsSimilarVector2D(Vector2D(5, 0), pBolt->Pos(), 0.01));    // 이동했다.    CHECK(pBolt->isDead());        // m_pBot2 에 맞았다.    CHECK_EQUAL(99, m_pBot2->Health());        // hp 가 1 줄었다.}
TEST_FIXTURE(FixtureBot3, ShootAt) {     // Bot1 이 Bot2 를 향해 Blaster 발포 m_pBot2->SetPos(Vector2D(2, 0));     Raven_WeaponSystem* pWeaponSys1 = m_pBot1->GetWeaponSys();     pWeaponSys1->ShootAt(m_pBot2->Pos());     CHECK_EQUAL(1, m_pMap->m_TriggerSystem.GetTriggerCount());     m_pMap->UpdateTriggerSystem(m_Bots);     std::list<Raven_Bot*> SensedBots =          m_pBot2->GetSensoryMem()->GetListOfRecentlySensedOpponents();     CHECK_EQUAL(1, SensedBots.size());     Raven_TargetingSystem* pTargetSys2 = m_pBot2->GetTargetSys();     pTargetSys2->Update();     Raven_Bot* pTarget = m_pBot2->GetTargetBot();     CHECK(pTarget == m_pBot1); }
트리거
TEST_FIXTURE(FixtureBot1, Trigger_HealthGiver) {     m_pBot1->SetHealth(49);     stringstream input;     input << BaseGameEntity::GetNextValidID();     input << "0.0 0.0 100.0 50 0";  // x y r health nodeIndex     Trigger_HealthGiver* pHealthGiver =          m_pMap->AddHealth_Giver(input);     m_pMap->UpdateTriggerSystem(m_Bots);     CHECK_EQUAL(99, m_pBot1->Health());     CHECK(!pHealthGiver->isActive());   // respawn 될때까지 사라진다. }
길찾기
목표 선택
Fuzz
Programming Game AI by Example. Ch7. Raven
Programming Game AI by Example. Ch7. Raven

Más contenido relacionado

La actualidad más candente

Android Developer JeongJaeyun
Android Developer JeongJaeyunAndroid Developer JeongJaeyun
Android Developer JeongJaeyunjaeyunjeong1
 
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)Ji-Woong Choi
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해Nam Hyeonuk
 
DevOps와 자동화
DevOps와 자동화DevOps와 자동화
DevOps와 자동화DONGSU KIM
 
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git민태 김
 
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint [D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint NAVER D2
 
톰캣 운영 노하우
톰캣 운영 노하우톰캣 운영 노하우
톰캣 운영 노하우jieunsys
 
Intrusive data structure 소개
Intrusive data structure 소개Intrusive data structure 소개
Intrusive data structure 소개종빈 오
 
UniRx - Reactive Extensions for Unity(EN)
UniRx - Reactive Extensions for Unity(EN)UniRx - Reactive Extensions for Unity(EN)
UniRx - Reactive Extensions for Unity(EN)Yoshifumi Kawai
 
Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기경원 이
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019min woog kim
 
9장 도메인 주도 설계
9장 도메인 주도 설계9장 도메인 주도 설계
9장 도메인 주도 설계Hyosung Jeon
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들Chris Ohk
 
[160402_데브루키_박민근] UniRx 소개
[160402_데브루키_박민근] UniRx 소개[160402_데브루키_박민근] UniRx 소개
[160402_데브루키_박민근] UniRx 소개MinGeun Park
 
#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기Arawn Park
 
iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術Yuji Hato
 
C++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & NanaC++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & NanaLazy Ahasil
 
초보자를 위한 Git & GitHub
초보자를 위한 Git & GitHub초보자를 위한 Git & GitHub
초보자를 위한 Git & GitHubYurim Jin
 

La actualidad más candente (20)

Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
 
Android Developer JeongJaeyun
Android Developer JeongJaeyunAndroid Developer JeongJaeyun
Android Developer JeongJaeyun
 
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
 
DevOps와 자동화
DevOps와 자동화DevOps와 자동화
DevOps와 자동화
 
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
 
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint [D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
 
톰캣 운영 노하우
톰캣 운영 노하우톰캣 운영 노하우
톰캣 운영 노하우
 
Intrusive data structure 소개
Intrusive data structure 소개Intrusive data structure 소개
Intrusive data structure 소개
 
UniRx - Reactive Extensions for Unity(EN)
UniRx - Reactive Extensions for Unity(EN)UniRx - Reactive Extensions for Unity(EN)
UniRx - Reactive Extensions for Unity(EN)
 
Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
9장 도메인 주도 설계
9장 도메인 주도 설계9장 도메인 주도 설계
9장 도메인 주도 설계
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
 
[160402_데브루키_박민근] UniRx 소개
[160402_데브루키_박민근] UniRx 소개[160402_데브루키_박민근] UniRx 소개
[160402_데브루키_박민근] UniRx 소개
 
#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기
 
iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術iOSDC 2018 動画をなめらかに動かす技術
iOSDC 2018 動画をなめらかに動かす技術
 
C++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & NanaC++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & Nana
 
초보자를 위한 Git & GitHub
초보자를 위한 Git & GitHub초보자를 위한 Git & GitHub
초보자를 위한 Git & GitHub
 

Destacado

온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅Ryan Park
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
즉흥연기와프로그래밍
즉흥연기와프로그래밍즉흥연기와프로그래밍
즉흥연기와프로그래밍Ryan Park
 
AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8Ryan Park
 
나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10Ryan Park
 
나도(기술서)번역한번해볼까
나도(기술서)번역한번해볼까나도(기술서)번역한번해볼까
나도(기술서)번역한번해볼까Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010Ryan Park
 
Unicode 이해하기
Unicode 이해하기Unicode 이해하기
Unicode 이해하기Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10Ryan Park
 
위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점Ryan Park
 
문자셋과 인코딩
문자셋과 인코딩문자셋과 인코딩
문자셋과 인코딩Jaehoon Jung
 
Domain Driven Design Ch7
Domain Driven Design Ch7Domain Driven Design Ch7
Domain Driven Design Ch7Ryan Park
 
Oop design principle SOLID
Oop design principle SOLIDOop design principle SOLID
Oop design principle SOLIDRyan Park
 
Oop design principle
Oop design principleOop design principle
Oop design principleRyan Park
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기Ryan Park
 

Destacado (19)

온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
즉흥연기와프로그래밍
즉흥연기와프로그래밍즉흥연기와프로그래밍
즉흥연기와프로그래밍
 
Unicode
UnicodeUnicode
Unicode
 
AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8
 
Unicode
UnicodeUnicode
Unicode
 
Taocp1 2 4
Taocp1 2 4Taocp1 2 4
Taocp1 2 4
 
나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10
 
나도(기술서)번역한번해볼까
나도(기술서)번역한번해볼까나도(기술서)번역한번해볼까
나도(기술서)번역한번해볼까
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
Unicode 이해하기
Unicode 이해하기Unicode 이해하기
Unicode 이해하기
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
 
위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점
 
문자셋과 인코딩
문자셋과 인코딩문자셋과 인코딩
문자셋과 인코딩
 
Domain Driven Design Ch7
Domain Driven Design Ch7Domain Driven Design Ch7
Domain Driven Design Ch7
 
Unicode100
Unicode100Unicode100
Unicode100
 
Oop design principle SOLID
Oop design principle SOLIDOop design principle SOLID
Oop design principle SOLID
 
Oop design principle
Oop design principleOop design principle
Oop design principle
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기
 

Más de Ryan Park

OOP 설계 원칙 S.O.L.I.D.
OOP 설계 원칙 S.O.L.I.D.OOP 설계 원칙 S.O.L.I.D.
OOP 설계 원칙 S.O.L.I.D.Ryan Park
 
프로그램은 왜 실패하는가 1장
프로그램은 왜 실패하는가 1장프로그램은 왜 실패하는가 1장
프로그램은 왜 실패하는가 1장Ryan Park
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
UnitTest, Tdd For Games Kgc2007 ParkPD
UnitTest, Tdd For Games Kgc2007 ParkPDUnitTest, Tdd For Games Kgc2007 ParkPD
UnitTest, Tdd For Games Kgc2007 ParkPDRyan Park
 
Agile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowAgile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowRyan Park
 
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...Ryan Park
 

Más de Ryan Park (7)

OOP 설계 원칙 S.O.L.I.D.
OOP 설계 원칙 S.O.L.I.D.OOP 설계 원칙 S.O.L.I.D.
OOP 설계 원칙 S.O.L.I.D.
 
Unicode
UnicodeUnicode
Unicode
 
프로그램은 왜 실패하는가 1장
프로그램은 왜 실패하는가 1장프로그램은 왜 실패하는가 1장
프로그램은 왜 실패하는가 1장
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
UnitTest, Tdd For Games Kgc2007 ParkPD
UnitTest, Tdd For Games Kgc2007 ParkPDUnitTest, Tdd For Games Kgc2007 ParkPD
UnitTest, Tdd For Games Kgc2007 ParkPD
 
Agile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowAgile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And How
 
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
 

Último

Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 

Último (6)

Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 

Programming Game AI by Example. Ch7. Raven

  • 1. CH7. Raven : 개관게임인공지능 프로그램하기 아꿈사(AnDStudy.com) 박일(http://parkpd.egloos.com/)
  • 3.
  • 4.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10. TEST_FIXTURE(FixtureBot3, UpdateVision) { // 등뒤에 있기 m_pBot1->SetPos(Vector2D(0, 0)); m_pBot1->RotateFacingTowardPosition(Vector2D(1, 0)); // fov 가 a 도라고 하면 실제로는 -a/2 ~ a/2 사이에 보여야 한다. m_pBot1->SetFieldOfView(DegsToRads(180.0)); // m_pBot1~m_pBot2, m_pBot1~m_pBot3 중에서 가까운 녀석이 타겟이 된다. m_pBot3->SetPos(Vector2D(-3, 0)); m_pBot2->SetPos(Vector2D(-1, 0)); // 뒤에서는 안 보이고 CHECK(!isSecondInFOVOfFirst( m_pBot1->Pos(), m_pBot1->Facing(), m_pBot2->Pos(), m_pBot1->FieldOfView())); m_pBot2->SetPos(Vector2D(2, 0)); // 앞에서는 보인다 CHECK(isSecondInFOVOfFirst( m_pBot1->Pos(), m_pBot1->Facing(), m_pBot2->Pos(), m_pBot1->FieldOfView())); m_pBot1->m_pSensoryMem->UpdateVision(); // 앞에 있는 bot2 는 보고, bot3 는 못본다. 각도만 신경쓰고, 거리는 신경 안쓴다. MemoryRecord& info2 = m_pBot1->GetSensoryMem()->m_MemoryMap[m_pBot2]; CHECK(info2.bWithinFOV); MemoryRecord& info3 = m_pBot1->GetSensoryMem()->m_MemoryMap[m_pBot3]; CHECK(!info3.bWithinFOV); // 벽에 가려지지만 않으면 모두 sense 를 할 수 있다. std::list<Raven_Bot*> SensedBots = m_pBot1->GetSensoryMem()->GetListOfRecentlySensedOpponents(); CHECK_EQUAL(2, SensedBots.size()); // Update -> UpdateMovement 에서 위치 못하도록 못 움직이게 만든다. m_pBot1->SetMaxSpeed(0.0); m_pBot1->Update(); // TakeAimAndShoot Raven_TargetingSystem* pTargetSys1 = m_pBot1->GetTargetSys(); CHECK(0 < pTargetSys1->GetTimeTargetHasBeenVisible()); Raven_Bot* pTarget = m_pBot1->GetTargetBot(); CHECK(pTarget); CHECK_EQUAL(pTarget->ID(), m_pBot2->ID()); CHECK_EQUAL(1, m_World.GetNumProjectiles()); // 총알 하나 발사 }
  • 11. TEST_FIXTURE(FixtureBot2, Bot1ShootBoltToBot2){ CHECK_EQUAL(100, m_pBot1->Health()); m_pBot1->SetPos(Vector2D(0, 0)); m_pBot2->SetPos(Vector2D(2, 0)); Bolt* pBolt = m_World.AddBolt(m_pBot1, Vector2D(4, 0)); CHECK(IsSimilarVector2D(Vector2D(0, 0), pBolt->Pos(), 0.01)); CHECK(!pBolt->isDead()); m_World.Update(); CHECK(IsSimilarVector2D(Vector2D(5, 0), pBolt->Pos(), 0.01)); // 이동했다. CHECK(pBolt->isDead()); // m_pBot2 에 맞았다. CHECK_EQUAL(99, m_pBot2->Health()); // hp 가 1 줄었다.}
  • 12. TEST_FIXTURE(FixtureBot3, ShootAt) { // Bot1 이 Bot2 를 향해 Blaster 발포 m_pBot2->SetPos(Vector2D(2, 0)); Raven_WeaponSystem* pWeaponSys1 = m_pBot1->GetWeaponSys(); pWeaponSys1->ShootAt(m_pBot2->Pos()); CHECK_EQUAL(1, m_pMap->m_TriggerSystem.GetTriggerCount()); m_pMap->UpdateTriggerSystem(m_Bots); std::list<Raven_Bot*> SensedBots = m_pBot2->GetSensoryMem()->GetListOfRecentlySensedOpponents(); CHECK_EQUAL(1, SensedBots.size()); Raven_TargetingSystem* pTargetSys2 = m_pBot2->GetTargetSys(); pTargetSys2->Update(); Raven_Bot* pTarget = m_pBot2->GetTargetBot(); CHECK(pTarget == m_pBot1); }
  • 14.
  • 15.
  • 16. TEST_FIXTURE(FixtureBot1, Trigger_HealthGiver) { m_pBot1->SetHealth(49); stringstream input; input << BaseGameEntity::GetNextValidID(); input << "0.0 0.0 100.0 50 0"; // x y r health nodeIndex Trigger_HealthGiver* pHealthGiver = m_pMap->AddHealth_Giver(input); m_pMap->UpdateTriggerSystem(m_Bots); CHECK_EQUAL(99, m_pBot1->Health()); CHECK(!pHealthGiver->isActive()); // respawn 될때까지 사라진다. }
  • 18.
  • 19.
  • 20.
  • 22.
  • 23.
  • 24.
  • 25. Fuzz