티스토리 뷰

안녕하세요


이번 강좌에서는


맵을 어떤식으로 구현할것인가? 에 대한 내용과 맵 선택기능을 구현해보도록 하겠습니다.





[목차]



1. 맵 구현방법 생각하기


2. 맵 선택기능 구현하기







[1 맵 구현방법 생각하기]




본 강좌에서는 탈출게임을 주제로 개발하고있습니다.


탈출게임은 맵이 꼭 필요하죠



정해진 공간에서 목표지점까지 도착하는 게임이기 때문이죠



콘솔게임이므로 3D 게임이 아닌 2D(평면) 게임입니다.


평면이기 때문에 맵도 2차원(면)으로 구현하면 됩니다.






위와같이 2차원안에서 상하좌우로 움직이며 목적지에 도착하는것이 목표입니다.


맵을 어떻게 구성할것인가? 에 대한 답변은 "2차원 배열을 사용하자!" 입니다.



배열이란?


쉽게 설명하자면 동일한 자료형을 이어서 저장하는 공간입니다.

변수는 다들 아실겁니다.


숫자를 5개 저장하려면 아래와같이 변수 5개를 선언해서 사용합니다.


int a = 1;

int b = 2;

int c = 3;

int d = 4;

 int d = 5;


만약 저장해야할 숫자가 수백, 수천개이면 변수를 일일히 하나씩 선언해야합니다.

이렇게 하면 코드를 비효율적으로 짜야하고

관리하기 매우 힘들어집니다.


이 문제를 해결하기위해 배열을 사용합니다.

위의 숫자 5개 저장하는 예제를 배열로 옮겨보도록 하겠습니다.


int arr[5] = {1, 2, 3, 4, 5};


간단해졌죠?


arr이라는 이름의 배열 하나로 1~5까지의 데이터에 접근할 수 있습니다.

변수로했다면 각각의 이름(a, b, c...)으로 접근해야하지만 배열은 이름하나로 안에있는 데이터에 접근할 수 있습니다.


위의 arr 배열은 5개의 숫자를 담을 수 있는 배열입니다.


배열 선언방법은 아래와 같습니다.


자료형 이름[길이];


간단하죠? 배열은 자주 사용되니 한번 알아두면 매우 유용합니다.

배열안에 저장하거나 접근하기위해서는 인덱스 번호(방 번호)를 알아야합니다.


일상생활에서는 수를 셀 때 1부터 시작을 하지만

C/C++ 의 배열같은 경우에는 0부터 시작을 합니다.


arr[0] = 5; //arr 배열의 첫번째 칸에 5 저장

arr[4] = 304; // arr 배열의 마지막칸에 304 저장


배열에 대한 설명은 간단히 여기까지 하도록 하겠습니다.

뒷 내용이 어려울수도 있으니 배열을 직접 사용해보고 다양한 예제를 실행하여

개념을 꼭 익히시길바랍니다.



arr[5] 는 5개의 값을 저장할 수 있는 1차원 배열입니다.

arr[5][5] 는 25개의 값을 저장할 수 있는 2차원 배열입니다.


[5] 는 5개만 한줄로 저장할 수 있습니다.

[5][5] 는 5개만 5줄로 저장할 수 있습니다.


선과 면을 떠올리시면 이해하기 쉽습니다.


아래로 진행하도록 하죠








평소에는 데이터 저장을 목적으로 1차원 배열을 많이 사용하실겁니다.


2차원배열도 1차원배열과 같습니다.

인덱스는 당연히 0부터 시작하죠






인덱스는 위와 같습니다


arr[4][4] 로 접근하면 오른쪽 아래의 요소의 값을 참조할 수 있습니다.



2차원 배열의 한칸 한칸에 맵에 사용할 블럭을 놓을 예정입니다.

(플레이어, 벽, 아이템, 목적지 등..)


맵이 2차원이므로 배열에 데이터를 저장해두고 불러와서 사용하면 맵 구현은 끝났다고 보셔도 됩니다.




맵은 아래처럼 구성할 예정입니다.

(맵 크기는 5x5가 아니라 더 크게 제작할것임)



맵에 들어갈 요소들을 미리 정해두고 맵을 구현해야합니다.


저는 위와같이



벽은 '1'


빈 공간은 '0'


시작위치는 's'


목적지 위치는 'q' 


로 사용할 예정입니다.


이부분에 대해서는 여러분들이 원하는 문자를 사용하셔도 됩니다.



맵 구현방법은 어느정도 해결하였으니 맵 선택기능을 먼저 구현해보도록 합시다.






[2 맵 선택기능 구현하기]



이전 강좌에서 진행하였던 메뉴 선택기능 구현하기

기억 하시나요?


이번 맵 선택기능도 완전히 동일한 방법입니다.


두 번째 구현이므로 자세한 설명은 하지 않도록 하겠습니다.





game.h 헤더파일에 함수를 하나 선언합니다.


저는 함수이름을 maplistDraw 라고 정의했습니다.

반환형은 int 형으로 해주세요.


(만약 파일분할을 진행하지 않았으면 소스코드 맨 위(인클루드 아래)에 정의해주세요)




함수를 정의했으면 구현해봅시다.



(82번째줄 while문 조건에 1을 넣어주세요)



저는 맵 선택창에


쉬움

어려움

뒤로


이 세가지를 추가하였습니다.


y 시작 위치는 6으로 설정하였습니다

선택지가 3개이므로 6+3 = 9


y의 범위는 6~9입니다.


첫 번째 선택지(쉬움)이 y = 6 이므로


106번째 줄에서 6-y 를 리턴하는 모습을 보실 수 있습니다.



함수를 구현했으면 main.c를 수정합시다.



메인함수 내에서 방금 만든 maplistDraw 함수를 호출하여 사용합시다.


쉬움을 선택했으면 0이 반환될 것이고

어려움을 선택했으면 1, 뒤로가기를 선택하였으면 2가 반환될 것입니다. 


반환된 값은 임시로 9행의 n 변수가 저장하고


그 아래의 11행, 15행에서 조건문으로 확인합니다.


0이면 쉬움, 1이면 어려움

둘다 아니면 뒤로가기이므로 아무런 코드를 작성하지 않았습니다.







14행과, 18행에 처음보는 Sleep 이라는 함수가 보입니다.

이 함수는 인자로 숫자를 전달하면 해당 시간(ms)만큼 프로그램을 블럭(정지)시킵니다.


단위가 ms이므로 1000은 1초입니다.


500을 전달하면 0.5초동안 잠깐 멈추게됩니다.

한번 다양한 숫자를 전달하여 테스트해보시기 바랍니다.


Sleep함수는 임시로 추가하였습니다.

왜냐하면 쉬움 또는 어려움을 선택하면 현재 아무런 동작이 없기때문에 바로 6행으로 이동하기 때문입니다.


글자출력을 확인하기위해 1초정도 멈추게 추가하였습니다.

1초 후에는 6행으로 이동하여 메뉴를 새로 그리게 됩니다.






(실행결과)






여기까지 마쳤으면 맵 선택기능도 구현되었습니다.


저기 Sleep 함수를 사용한 부분을 맵을 불러오고 맵을 출력하도록 수정하면 본격적으로 게임이 시작되게 됩니다.





다음 강좌에서는 맵을 제작하고 출력하는 기능을 구현하도록 하겠습니다.


감사합니다.











댓글
  • 프로필사진 kihyeon030918@gmail.com 아니 menudraw 에다가 while문을 썼는데 그거랑 같은 걸 maplistdraw에다가 또 써요? 2020.10.16 19:16
  • 프로필사진 BlogIcon 이근둥 동일한 기능이기 때문에 말씀해주신 내용처럼 조금 더 추상화하여 개발하는 것이 맞는 것 같습니다.
    당시엔 왜 분리해두었는지 잘 모르겠으나,,, 초보자 분들을 대상으로 복잡도를 조금이나마 낮추기 위해 따로 개발한 것 같습니다
    2020.10.18 22:57 신고
댓글쓰기 폼