-
[cub3d] map parse 맵 파싱하기42seoul 2021. 3. 21. 02:06
방법1. 벽을 다른 문자로 치환하기
이건 내가 쓴 방법인데
왼쪽 위의 첫번째 벽을 Start point로 잡아서 출발한다.
사방에 1(벽)이 있는지 확인하고, 벽이 있으면 다른 문자(w)로 치환하며 앞으로 나아간다.
한번 간 길(w로 바뀐 길)은 다시 가지 않는다.
재귀함수로 짰기 때문에 길이 여러갈래 있으면 갈래 마다 함수를 호출하고
사방 모두 벽이 없으면 return 하여 탈출한다.
벽으로 잘 둘러싸인 맵이라면 이 포인터는 시작 지점으로 돌아오게 되고
모든 외곽의 벽은 'w'가 되어있을 것이다.
치환된 지도의 모습
치환된 지도를 가지고 제대로 된 맵인지
체크하는 방법은 여러가지가 있다.
1. 포인터가 시작지점바로 앞으로 되돌아 왔는지 체크
2. 치환된 지도에 1(벽)이 있는지 살펴보고, 1이 있다면 내벽인지 외벽인지 체크
나는 이 중에 두번째 방법을 썼다. 그러면 내부의 벽은 신경쓰지 않아도 된다.
외벽인지 체크하는 방법은 ' '(empty) 해당 벽의 사방에 빈공간이 있는지 확인하는 것이다.
그리고 map[i][j]가 target이라고 하면 i가 0이거나 j가 0이거나
i가 높이와 같거나(마지막 row, j가 너비(마지막 column)와 같아도 외벽으로 볼 수 있다.
재귀함수를 더 잘 썼으면 쉽게 구현할 수 있었을 것 같다.
어떤 분이 평가하면서 내 방법이 참신하다고 했는데
대부분의 참신한 방법은 효율적이지는 않은 것 같다.(남들이 잘 안쓰는 이유가 있다.)
평가해주신 분이 구현한 알고리즘은 아래와 같다.
방법2. 벽을 제외한 나머지 문자가 빈 문자와 닿아있는지 확인하기
1 -> 벽
0 -> 빈공간
SWEN -> 유저시작위치
2 -> 스프라이트
맵이 제대로 그려져 있다면, ' ' 빈문자(space)와 닿을 수 있는 문자는 1밖에 없다.
그 점을 이용한 알고리즘.
이 방법을 듣고 나서 parse를 갈아없을까도 생각했지만
이 방법으로는 아래 예시중 첫번째를 Valid로 판정하게 된다.
벽이 완전히 이어져 있지 않더라도, 화면에 벽을 그리는 데에는 문제가 없기 때문에
이것은 개인이 어떻게 생각하느냐에 따라 다를 것 같다.
하지만 나는 완전히 벽으로 둘러싸인 map만 parse하고 싶었기 때문에 기존의 방법을 유지했다.
구현을 앞두신 분들은 참신하고 효율적인 방법을 찾아보시길 바란다.✨
과제관련 게시글 모음
2. Makefile -L option, OpenGL, AppKit
4. map parsing (이 글입니다.)
'42seoul' 카테고리의 다른 글
[libasm] 어셈블리 (about 1 week) - 2일차(ft_write, ft_read) (0) 2021.05.06 [libasm] 어셈블리 (about 1 week) (0) 2021.03.26 [minishell] Shell이란? 그리고 Shell이 하는 일 (0) 2021.03.01 [cub3d] 과제 시작하기 (0) 2021.02.19 [42서울] 2월 16일(화) 레포트 (0) 2021.02.16