2차 프로젝트 일지 - 5일차
5일차: 고도화, 난이도 조정
문제: 폭발 위험 지역으로의 의미없는 왕복운동
원인: 위험지역 평가 후(IsDangerNearbyCondition) 위험지역을 벗어나는 액션 노드(FleeFromDangerAction)의 FindEscapeDir 평가 과정에서:
- 위험지역이라도 경유 후 생존 가능하면 q.push(next)를 허용
- 상위 트리는 “위험이면 도망”을 매 틱 다시 평가
→
안전 지역 이동 요청 -> 재평가 -> 위험 경유 이동 -> 다시 안전 지역으로 도망루프가 생김
해결:
- FleeFromDangerAction은 함수 이름처럼 안전 지역 이동만 담당하도록 축소
- 위험 지역 경유 및 활용은 별도 전술 노드로 분리(ExploitDanger)
- 조건: 박스 기대 이득, 탈출 가능성, 폭발 타이밍 여유 등을 종합적으로 계산하도록
BTSelector(root)│├─[1] BTSequence(dangerSeq)| ├── IsDangerNearbyCondition| └── BTSelector(dangerSel)| ├── ExploitDangerAction| | └── IsExplosionDangerAt() | | && IsWorthPlacingBubbleAt() | | ? RequestGenerateBubble() | | : 안전지역으로 탈출| └── FleeFromDangerAction| └── BFS로 인접한 안전지역 중 탐색 후 이동|├─[2] IsMovingCondition│└─[3] BTSelector(innerSel) ├─ AStarMoveAction - 부술 수 있는 최단거리 계산 후 이동 └─ BTSequence(innerBoxSeq) ├── HasBubbleAmmoCondition └── PlaceBubbleNearBoxAction ├── 설치 위치가 아니면 한 칸 이동 └── 물풍선 설치 위치면 설치하기Offensive/Defensive/OutsideArea 구분
- movementTree
BTSelector(root)│├─[1] BTSequence(dangerSeq)│ ├── IsDangerNearbyCondition│ └── BTSelector(dangerSel)│ ├── ExploitDangerAction│ │ └── (위험지역 활용 가치 판단)│ │ - 현재 위험지역 + 설치 가치 있음 -> RequestGenerateBubble│ │ - 아니면 가치 높은 위험 타일로 1칸 이동 시도│ └── FleeFromDangerAction│ └── BFS로 안전지역 탈출(필요 시 제한적 위험 경유)│├─[2] IsMovingCondition│└─[3] BTSelector(innerSel) ├─ BTSequence(offensiveApproachSeq) │ ├── IsPlayerBubbleTrappedCondition(true) │ ├── IsPlayerInAreaCondition(min = OFFENSIVE+1) │ └── AStarMoveAction │ └── trapped된 플레이어에게 offensiveArea까지 접근 │ ├─ BTSequence(tracingApproachSeq) │ ├── IsPlayerBubbleTrappedCondition(false) │ ├── IsPlayerInAreaCondition(min = TRACING_MIN) // defensive 바깥 │ └── AStarMoveAction │ └── tracingArea에서만 추적 │ └─ BTSequence(innerBoxSeq) ├── HasBubbleAmmoCondition └── PlaceBubbleNearBoxAction ├── 설치 위치 아니면 1칸 이동 └── 설치 위치면 물풍선 설치- actionTree
BTSelector(root)│└─ BTSequence(defensiveCombatSeq) ├── IsPlayerBubbleTrappedCondition(false) ├── IsPlayerInAreaCondition(min = OFFENSIVE+1, max = DEFENSIVE) ├── HasBubbleAmmoCondition └── PlaceBubbleAction └── defensiveArea에서만 설치