SlideShare a Scribd company logo
1 of 24
CH7. Raven : 개관게임인공지능 프로그램하기 아꿈사(AnDStudy.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 될때까지 사라진다. }
길찾기
목표 선택
AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8

More Related Content

Viewers also liked

카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
즉흥연기와프로그래밍
즉흥연기와프로그래밍즉흥연기와프로그래밍
즉흥연기와프로그래밍Ryan Park
 
나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅Ryan Park
 
나도(기술서)번역한번해볼까
나도(기술서)번역한번해볼까나도(기술서)번역한번해볼까
나도(기술서)번역한번해볼까Ryan 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
 

Viewers also liked (18)

Unicode
UnicodeUnicode
Unicode
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
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 - 낡은 코드에 단위테스트 넣기
 

More from 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
 

More from 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...
 

AIbyExample - Ch7 raven. version 0.8

  • 1. CH7. Raven : 개관게임인공지능 프로그램하기 아꿈사(AnDStudy.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.