오늘 배운 내용
- 팀 프로젝트 맵 경로 생성 기능 구현
맵 경로 생성 기능
이번 프로젝트에서 저번 개인과제때 만들었던 기능을 사용해보고 싶어서 의견을 냈고
프로젝트에 맞게 다시 만들어 보게 되었다.
그래서 이번에는 한 방향으로만 이동하는게 아니라 맵을 계속해서 돌아다닐수 있도록 만들어 봐야겠다는 생각을 했다.
그래서 사각형 n * n 의 맵을 4 꼭짓점을 시작점으로 잡고 중간 지점 까지 이어주어 모든 맵이 연결되도록 만들었다.
그런데 기능 구현 도중 갈 길이 없어서 오버플로우가 발생해버렸다. 저번에 슬더슬 기반에서는 계속해서 위층으로만 올라가기 때문에
괜찮았었는데 4시작점의 길을 모든방향으로 이동가능하게 하니 막히는 경우가 계속해서 나오게 되었고 고민 끝에 새로운 방법을 생각해 냈다.
- 시작점과 도착점을 비교해서 왼쪽에서 시작하고 경로를 찾을때 방향은 항상 오른쪽으로 찾는다.
모든 방향으로 이동을하니 이미 지나왔던길에 막혀서 이동을하지 못해 도착점에 영원히 도달하지 못하고 오버플로우가 나는 것을
해결하고 길이 너무 돌아가는 것을 방지하기 위해서 이 방법을 채택했다. 하지만 오버플로우 문제를 완벽하게 해결하지 못했다.
- 만약 다음방향을 못 찾을 경우 이미 지나온길로 돌아간다.
결국 길이 막히는게 문제니 막히지 않게 하면 되는 문제였다. 우선적으로 가지 않은 길로 이동하지만
더 이상 가지않은 길이 없다면 이미 이동했던 길로도 이동할 수 있도록 해주었고 문제를 해결할 수 있었다.
private void DFS(Pos startPos, Pos endPos, int minX, int maxX, int minY, int maxY)
{
Map[startPos.Y,startPos.X] = new Location(startPos);
if (startPos.X == endPos.X && startPos.Y == endPos.Y) return;
List<Pos> nextPos = new List<Pos>();
List<Pos> prevPos = new List<Pos>();
foreach(Pos movePos in pathFindDir)
{
Pos pos = startPos + movePos;
if (CheckPos(pos, minX, maxX, minY, maxY))
{
if (CheckVisited(pos))
{
prevPos.Add(pos);
}
else
{
nextPos.Add(pos);
}
}
}
if (nextPos.Count == 0)
{
// 되돌아갈수 밖에 없는 경우
int randIndex = Random.Range(0,prevPos.Count);
DFS(prevPos[randIndex], endPos,minX ,maxX, minY, maxY);
}
else
{
int randIndex = Random.Range(0, nextPos.Count);
DFS(nextPos[randIndex], endPos, minX, maxX, minY, maxY);
}
}