멈추지 않고 끈질기게

[기타][메모용] 길찾기 관련 본문

기타

[기타][메모용] 길찾기 관련

sam0308 2023. 8. 6. 10:53

 

현재 바라보는 방향에 따른 움직임 제어

// 시계 방향으로 선언
enum Direction
{
    Up, 
    Right,
    Down,
    Left
}
int curDir = (int)Direction.Up;

// Direction 순서대로 해당 방향으로 움직일 시 변화값 정의
int[] frontX = { 0, 1, 0, -1 };
int[] frontY = { -1, 0, 1, 0};
int[] leftX = { -1, 0, 1, 0 };
int[] leftY = { 0, -1, 0, 1 };
int[] rightX = { 1, 0, -1, 0 };
int[] rightY = { 0, 1, 0, -1 };
int[] backX = { 0, -1, 0, 1 };
int[] backY = { 1, 0, -1, 0 };

int curX = 0, curY = 0;
void GoFront()
{
    // 앞으로 이동
    curX += frontX[curDir];
    curY += frontY[curDir];
}
void GoLeft()
{
    // 왼쪽으로 이동
    curX += leftX[curDir];
    curY += leftY[curDir];
}
void GoRight()
{
    // 오른쪽으로 이동
    curX += rightX[curDir];
    curY += rightY[curDir];
}
void GoBack()
{
    // 뒤로 이동
    curX += backX[curDir];
    curY += backY[curDir];
}

- 현재 바라보는 방향에 따라 움직임을 제어하려면 매번 if ~ else 또는 switch 구문 필요

- 현재 방향에 따라 움직일 방향의 X좌표, Y좌표 변화값을 배열로 미리 정의해놓으면 분기 없이 구현 가능

- 열거형에 정의한 순서대로 해당 방향을 바라보는 상태에서 움직일 경우 변화값 저장

   ex) frontX의 경우 순서대로 위쪽, 오른쪽, 아래쪽, 왼쪽을 보는 상태에서 앞으로 갈 때 X값의 변화

 

 

방향 갱신

// 시계 방향으로 선언
enum Direction
{
    Up, 
    Right,
    Down,
    Left
}
int curDir = (int)Direction.Up;

void TurnLeft() { curDir = (curDir -1 + 4) % 4; }
void TurnRight() { curDir = (curDir + 1) % 4; }
void TurnBack() { curDir = (curDir + 2) % 4; }

- '% 4'로 0~3 사이의 값을 보장

- Direction을 시계 방향으로 선언했다면 오른쪽 회전 시 +1, 반시계 방향으로 선언했다면 왼쪽 회전 시 + 1

- Direction의 방향과 반대로 회전 시 -1, 단 음수를 배제하기 위해 +4(Direction의 크기)

- 뒤로 회전하려면 +2