ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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하고 싶었기 때문에 기존의 방법을 유지했다.

    구현을 앞두신 분들은 참신하고 효율적인 방법을 찾아보시길 바란다.✨


    과제관련 게시글 모음

    0. 과제파악하기

    1. 수학공부

    2. Makefile -L option, OpenGL, AppKit

    3. 과제시작하기

    4. map parsing (이 글입니다.)



    댓글

Designed by Tistory + Edited by Juepark