오른손 법칙을 미로에 적용한 코드는 아래와 같다
void Player::Init(Board* board)
{
// 초기 설정
_pos = board->GetEnterPos();
_board = board;
Pos pos = _pos;
_path.clear();
_path.push_back(pos);
Pos dest = board->GetExitPos();
// 우아한 코드를 위한 배열
Pos front[4] =
{
Pos { -1, 0}, // UP
Pos { 0, -1}, // LEFT
Pos { 1, 0}, // DOWN
Pos { 0, 1}, // RIGHT
};
// 목적지 도착까지 계속 반복
while (pos != dest)
{
// 1. 현재 바라보는 방향을 기준으로 오른쪽으로 갈 수 있는지 확인
int32 newDir = (_dir - 1 + DIR_COUNT) % DIR_COUNT;
if (CanGo(pos + front[newDir]))
{
// 오른쪽 방향으로 90도 회전
_dir = newDir;
// 앞으로 한 보 전진
pos += front[_dir];
_path.push_back(pos);
}
// 2. 오른쪽 갈 수 없으면,
// 현재 바라보는 방향을 기준으로 전진할 수 있는지 확인
else if (CanGo(pos + front[_dir]))
{
// 앞으로 한 보 전진
pos += front[_dir];
_path.push_back(pos);
}
// 3. 오른쪽 및 전진 불가능하면,
// 왼쪽으로 회전
// (왼쪽으로 회전만 해도 반복문을 통해 길 탐색 가능)
else
{
// 왼쪽 방향으로 90도 회전
_dir = (_dir + 1) % DIR_COUNT;
/*
switch (_dir)
{
case DIR_UP:
_dir = DIR_LEFT;
break;
case DIR_LEFT:
_dir = DIR_DOWN;
break;
case DIR_DOWN:
_dir = DIR_RIGHT;
break;
case DIR_RIGHT:
_dir = DIR_UP;
break;
}
*/
}
}
}
'자료구조 & 알고리즘 > [루키스] C++ 자료구조 & 알고리즘' 카테고리의 다른 글
[C++ 자/알 Note] 스택 구현 (0) | 2025.01.08 |
---|---|
[C++ 자/알 Note] 연결리스트 구현 (0) | 2025.01.08 |
[C++ 자/알 Note] 동적배열 구현 (0) | 2025.01.07 |
[C++ 자/알 Note] 배열, 동적배열, 연결리스트 (0) | 2025.01.04 |
[C++ 자/알 Note] Big-O 표기법 (0) | 2025.01.04 |