void Player::Bfs()
{
Pos pos = _pos;
Pos dest = _board->GetExitPos();
Pos front[4] =
{
Pos { -1, 0 }, // UP
Pos { 0, -1 }, // LEFT
Pos { 1, 0 }, // DOWN
Pos { 0, 1 } // RIGHT
};
const int32 size = _board->GetSize();
vector<vector<bool>> discovered(size, vector<bool>(size, false));
map<Pos, Pos> parent;
queue<Pos> q;
q.push(pos);
discovered[pos.y][pos.x] = true;
parent[pos] = pos;
while (!q.empty())
{
pos = q.front();
q.pop();
if (pos == dest)
break;
for (int32 dir = 0; dir < 4; dir++)
{
Pos nextPos = pos + front[dir];
if (!CanGo(nextPos)) continue;
if (discovered[nextPos.y][nextPos.x]) continue;
q.push(nextPos);
discovered[nextPos.y][nextPos.x] = true;
parent[nextPos] = pos;
}
}
_path.clear();
pos = dest;
while (true)
{
_path.push_back(pos);
if (pos == parent[pos]) break;
pos = parent[pos];
}
std::reverse(_path.begin(), _path.end());
}
Pos pos = _pos;
Pos dest = _board->GetExitPos();
Pos 타입으로 받아옵니다.Pos는 (x, y) 좌표를 나타내는 구조체로 추정됩니다.Pos front[4] = { { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 } };
vector<vector<bool>> discovered(size, vector<bool>(size, false));
map<Pos, Pos> parent;
queue<Pos> q;
discovered: 방문 여부 체크 (중복 탐색 방지)parent: 경로 추적용. child → parent 구조q: BFS용 큐q.push(pos);
discovered[pos.y][pos.x] = true;
parent[pos] = pos;
while (!q.empty())
{
pos = q.front();
q.pop();
if (pos == dest) break;
for (int32 dir = 0; dir < 4; dir++)
{
Pos nextPos = pos + front[dir];
if (!CanGo(nextPos)) continue;
if (discovered[nextPos.y][nextPos.x]) continue;
q.push(nextPos);
discovered[nextPos.y][nextPos.x] = true;
parent[nextPos] = pos;
}
}
🔒 CanGo(nextPos)는 이동 가능한 타일인지 체크하는 함수입니다. 벽이나 장애물이 있는 경우
false반환.
_path.clear();
pos = dest;
while (true)
{
_path.push_back(pos);
if (pos == parent[pos])
break;
pos = parent[pos];
}
std::reverse(_path.begin(), _path.end());
parent를 따라 목적지부터 시작점까지 거슬러 올라가며 경로를 _path에 저장.reverse()를 통해 정방향으로 정리.// 단점
// - 목적지 방향 고려 없이 그냥 가까운 칸부터 탐색
// - 대각선 이동 불가능
목적지 방향 고려 X
대각선 이동 미지원
front[4] 배열만 쓰면 상하좌우만 이동 가능.front[8] 형태로 변경 필요.