랜덤 던전 생성기에서 랜덤 동굴 생성기 다음으로 만든 랜덤 방 생성기입니다.
정리해서 짠게 아니라서 미흡한점 양해 부탁드립니다.
랜덤 방 생성기를 제작하는데 참조한 사이트는 다음과 같습니다.
우선 순위 큐를 제작하기 싫어서 ruby에서 우선 순위 큐를 작성한 것을 이용했습니다.
사이트는 다음과 같습니다.
원리는 '랜덤 던전 생성기 이론'에 있는 사이트를 보시면 되는데,
해석하면 다음과 같습니다.
1. 임의의 방을 무작위로 생성 시킨다.
2. 임의의 방에서 무작위로 방을 1개 고른다.
3. 고른 방의 주위의 방(겹쳐진방)이 있으면 그 방을 지우고 2번의 반복한다.
4. 겹쳐진 방이 다 끝나면, 연결 되지 않은 방에 방을 1개 고르고, A*알고리즘(저는 BFS[Beast First Search]를 사용했습니다.)을 사용하여 방을 연결시킨다.
5. 연결이 다되면, 연결된 방에 문과, 기타 이벤트들을 넣는다.(이건 구현 하지 않았습니다.)
여기서, 무작위로 생성시킨 다음, 2-3의 반복을 이해가 안되는 분은, '랜덤 방 선택 동영상'을 보시면 이해가 빠르실겁니다.(동영상에서 연결된 사이트도 랜덤 방 생성기를 구현한 사이트입니다.)
이제, 4을 구현 해야되는데. 여기서 제가 착각한 부분이기도 한 것인데, 경로를 찾기 위해선 2차 배열을 저장하는 배열을 가지고 있어야 됩니다.
예) [[2,3],[2,4],[3,4]]
그렇지 않으면, 어디에 최적화된 경로인지 알 수 없기 때문에, 반드시 배열 안에 배열을 해야되며, 우선 순위 검색은 깊이 우선 검색(DFS)보다 나은 점이, 끝까지 가는게 아니라, 최적의 경로(거리가 짧은 경로)를 우선시 하기 때문에, 빠른 경우가 많습니다.(그렇다고 무조건 빠른건 아닙니다.)
적용 방법은
Ran_Room.filesetMap(5,rand(100)+17, rand(100)+13)
Ran_Room.filesetMap(10, 1000, 1000, 20, 50, 10, 30)
Ran_Room.filesetMap(맵의 갯수, 맵의 넓이, 맵의 높이, 방의 최소 넓이, 방의 최대 넓이, 방의 최소 높이, 방의 최대 높이)
로 구성 되어있고, 각 파일맵에 맞추시고 싶으시면,
먼저 맵을 로드하신 후
map = $data_load("Data/MapXXX.rvdata2"
Ran_Room.createMaps(map, counts, min_x, max_x, min_y, max_y)
Ran_Room.createMaps(맵의 변수, 생성 시킬 방의 갯수(임의의 위치의 방의 갯수 많을 수록 다양한 방이 만들어 질 가능성이 증가합니다.[그 만큼 느려집니다.], 방의 최소 넓이, 방의 최대 넓이, 방의 최소 높이, 방의 최대 높이)
이렇게 개별로 적용 시킬 수 있습니다.
맵을 적용시켰을 경우.