ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C/C++] 콘솔게임 프로그래밍 (6) - 맵 제작 및 출력
    C, C++ 2017. 12. 20. 17:48

    안녕하세요


    이번 강좌에서는 맵을 직접 제작하고 출력하는 기능을 구현해보도록 하겠습니다.






    [목차]


    1. 2차원 배열에 맵 만들기


    2. 맵 출력기능 구현하기







    [1 2차원 배열에 맵 만들기]



    game.c 소스파일의 상단에 2차원 배열을 생성합니다.


    배열의 크기는 자신의 콘솔창 크기보다 작게 만들어야합니다


    왜냐하면 콘솔창보다 맵이 더 클경우 출력할 때 글자가 밀려서 출력됩니다. 이렇게되면 맵이 이상하게 보이게 됩니다.



    콘솔창 크기는 전에 구현해두었던 init 함수에서 확인하실 수 있습니다.


    cols: 가로

    lines: 세로


    저와 여러분들은 크기가 다를 수 있습니다.


    크기에 맞춰서 56x20 짜리 배열을 생성해도 되지만 저는 여백을 조금 남기고 하단에 

    정보확인 영역을 추가할것이기 때문에 조금 더 작은 맵을 만들예정입니다.





    저는 위처럼 하단에는 정보, 중앙에는 맵을 출력하는 방식으로

    게임을 구성할것입니다.


    제가 예상하는 맵 크기는


    가로: 56

    세로: 14


    입니다.

    (제 기준, 여러분들은 창 크기가 모두 다를 수 있기때문에 적절하게 선택하시면 됩니다)


    저는 하단에만 정보확인 영역을 추가할것이기때문에 가로길이는 크기에 딱 맞추고

    세로길이만 조금 줄였습니다.




    game.h 상단에 원하는 크기의 2차원 배열을 생성합니다.


    char 배열이름[세로][가로];



    배열을 생성하였으면 아래처럼 초기데이터를 집어넣습니다.




    저는 배열이름을 map이라고 정했고 크기는

    14행 56열로 정했습니다.


    위 사진처럼 배열크기에 맞춰서 0으로 초기화해주세요

    한줄은 { }로 감싸주고 , (쉼표)를 꼭 쓴다음에 다음줄을 반복하시면 됩니다.


    {},

    {},

    {},

    ..

    이런식으로 반복하면서 0으로 채워주시면 됩니다.


    그리고 {  } 안에 0을 채울 때 그냥 넣으면 안되고

    "  " 쌍따옴표로 감싸주어야합니다.


    예) "0000000000"


    (앞으로 맵만드는시간이 더 오래걸릴수도 있습니다...)


    위처럼 0으로 초기설정을 마쳤으면

    노가다의 첫 발판을맵 제작의 발판을 마련한것입니다.





    지난 강좌에서도 말씀드렸지만 벽은 어떤 문자로할지, 플레이어 위치는 어떤 문자로할지 정하셔야합니다.



    저는 빈 공간을  

    벽은

    플레이어 시작위치는

    목적지는 로 설정하였습니다.

    (이해가 안가시는분은 이전강좌를 확인해주세요)




    위에서 0으로 초기화한 배열에 원하는 위치에다가 정하신 문자를 추가해봅시다.


    플레이어 시작위치와 목적지는 꼭 한개씩만 있어야합니다.



    저는 위 사진처럼 맵을 임시로 제작해보았습니다.


    s와 q는 꼭 1개씩만 추가해주세요.


    맵은 대충 만들었으니 출력해보는 과정으로 넘어가봅시다.

    (이런방식으로 여러분들이 맵을 직접 제작하시면 됩니다.)







    [2 맵 출력기능 구현하기]



    위 챕터에서 맵을 만들어보았으니 이번엔 직접 출력해봅시다.




    이전 강좌에서


    맵 선택기능을 구현했었습니다.


    맵이 하나만 있어도 되지만 여러개 만드실분은 이 과정이 꼭 필요합니다.



    만약에


    쉬움

    어려움


    두 단계가 있다고하면


    쉬움을 선택하였을땐 쉬운맵,

    어려움을 선택하였으면 어려운맵을

    플레이어에게 제공해야합니다.


    이 과정부터 시작하여 실제로 출력하는 부분을 구현해보도록 하겠습니다.



    game.h 에 함수를 선언합니다.


    저는 drawMap 이라는 이름으로 함수를 선언했습니다.

    (함수를 선언할 때에는 기능과 관련있는 단어로 이름을 선정하는게 좋습니다)



    헤더파일에 함수를 선언하였으면 game.c 에서 함수를 구현합니다.


    위 코드를 작성합니다.


    함수 첫 번째 줄에는 system("cls") 를 작성해줍니다.

    화면을 말끔하게 한번 지우고 맵을 그려야하기 때문입니다.


    2중 for문의 범위는 여러분들의 맵 크기에 따라 변경해주시면 됩니다.


    h<14, w<56 이부분은 여러분들의 맵 크기에 따라 변경해주세요(중요)


    h = 세로

    w = 가로


    맨 아래에 Sleep(3000) 을 작성한 이유는 맵을 그리고 3초동안 확인하기 위해 추가하였습니다.

    현재 모든 기능을 구현하지 못했으므로 Sleep 함수로 대기하지 않으면 바로 메인화면으로 넘어가버립니다.



    함수 구현이 끝났으면 메인함수로 와서 테스트해봅시다.




    지난시간에 추가했던 내용은 지우고 drawMap 함수를 호출합니다.


    맵 선택에서 쉬움을 선택했을 때 맵을 그리게 됩니다.



    한번 실행해보도록 하겠습니다.



    (실행결과)

    만들어둔 맵이 그대로 잘 출력됩니다.



    이제 0이면 아무것도 없이 출력, 1이면 벽을 출력 p가 있는 자리에는 플레이어 출력

    q에는 목적지를 출력하도록 코드를 추가 및 수정해야합니다.



    벽은 어떤 문자로 할지, 플레이어는 어떤 문자로할지등을 정하도록 합시다. 



    저는 아래와 같이 할 생각입니다


    플레이어: @

    벽: #

    목적지: O


    이렇게 문자를 정했다면 아래로 진행합시다.

    (문자를 정할 땐 한글, ★ 과같이 2칸을 차지하는 문자는 선정하지 마세요)




    선정하였으면 drawMap 함수를 수정합시다.



    28행이 중요합니다.


    char temp = map[h][w];


    현재 2중 for문으로 2차원 배열의 칸을 하나씩 접근하고있습니다.

    배열 칸에는 0이든 1이든 s든 문자가 저장되어있는데요


    문자 하나를 임시로 저장하는 코드입니다.


    문자 하나를 저장한 후 29~37행에서 조건검사를 진행하는것이지요


    temp 변수에 문자가 저장되어있으므로 temp와 비교하면 됩니다.



    if(temp == '0'){ /* 0일때 수행할 문장 */ }

    else if(temp == 's') { /* s일때 수행할 문장 */ }

    ...


    이런식으로 해당하는 문자를 걸러낼 수 있습니다.


    저같은경우에 0은 비어있는곳이므로


    printf(" "); // 공백 출력


    공백을 출력하였고


    플레이어는 printf("@");

    골뱅이로 변환하였습니다.



    위와같이 배열을 읽고 해당하는 문자로 변환하는 작업을 마치면 원하는 문자로

    맵이 출력되는 모습을 보실 수 있습니다.



    (실행결과)


    위 사진처럼 자신이 설정한 문자로 맵이 출력된 모습을 보실 수 있습니다.


    위에서 생성한 맵 저장 배열을 원하는 맵형태로 데이터를 수정하면 그에 맞게 맵을 출력하실 수 있습니다.





    이번 강좌는 여기까지입니다.



    다음 강좌에서는 콘솔창의 색을 변경하는 방법에 대해 알아보도록 하겠습니다.



    감사합니다.








    댓글 4

    • Ever 2020.02.21 22:42

      저는 맵을 ■의 벽으로 만들고 있습니다. 그런데 ■는 비주얼 스튜디오에서 2칸으로 인식하는 것 같더군요. 무슨 말이냐 하면 칸수만을 봤을 때, '11 = 47 = 00 = ■'라는 것입니다. 즉, ■ 1개가 2칸으로 인식된다는 것입니다. 이럴 때는 어떻게 해야 하나요? ㅠㅠㅠ

      • BlogIcon 이근둥 2020.08.03 13:32 신고

        늦은 답변 죄송합니다..ㅜ

        해당 특수문자는 2칸을 차지하기 때문에 좌표 이동시에도 x + 2와 같이 추가적인 연산이 필요합니다.

        공백으로 지울 경우에도 공백 2칸이 필요합니다.

    • hnk 2020.08.01 21:08

      저도 네모로 하고 있고 똑같은 방식으로 거의 콘솔창크기랑 배열 크기만 원하는 거로 바꿔서 해보는데 자꾸만 깨지네요... ㅠㅠ 원인이 뭘까요...

Designed by Tistory.