무작정 배우는 C언어 머드(MUD)게임 만들기 Part3 게임스랩

이번 시간에는 플레이어가 돌아다닐 지도를 만들어보겠습니다. RPG류의 게임들을 보면 대부분 지도가 있고 그 지도를 보면서 현재 내가 어디를 가야 할지를 유저는 알 수 있습니다. 게임 제작자 측면에서도 지도에 어떤 몬스터, 이벤트, 오브젝트들을 배치를 하여 게임을 구성해 갑니다. 우리가 지금 만들고 있는 MUD게임도 플레이어가 활동할 공간이 필요하겠지요.

 

그러한 공간을 구성하는 곳이 바로 지도입니다. 지구본을 보면 각 나라가 위도와 경도를 통해 어디에 위치해 있는지 알 수 있습니다. 2D게임에서는 xy를 이용한 평면좌표를 사용하고 3D게임에서는 xyz를 이용해 공간좌표를 사용합니다. 우리는 평면좌표를 이용한 지도를 구성해 보려고 합니다.

 

지도의 크기는 여러분이 원하는 만큼 설정하시면 되겠습니다. 넓을수록 많은 내용을 담기에 좋겠지요. 저는 가로,세로 500의 크기를 갖는 평면을 만들겠습니다. x,y 는 0부터 499 의 위치를 표현할 수 있습니다. 다음 그림을 보겠습니다.

바둑판과 똑같이 생각하시면 편하겠습니다저는 시작위치라고 쓰인 부분을 x=200, y=200으로 설정하였습니다여러분도 원하시는 위치를 시작부분으로 하시면 되겠지요제 스토리를 기준으로 하자면 꼬부기가 물위로 올라온 시점이 바로 (200,200)이 되겠습니다.

다시 한번 말씀 드리면 위 지도는 여러분의 화면에 보이지 않는 논리적인 영역입니다다음 코드를 한번 보겠습니다.

 

int g_playerPosX = 200;                                               //플레이어의위치x

int g_playerPosY = 200;                                               //플레이어의위치y

 

우리는 이런식으로 현재 플레이어의 좌표를 기억할 것입니다그리고 여러분들이 앞으로 설정할 명령어들에 의해서 좌표가 +- 되면서 위 그림에 있는 논리적인 영역안에서 이동을 행하는것입니다저는 플레이어가 이동할 수 있는 이동폭을 상하좌우즉 동서남북으로 제한했습니다혹시라도 대각선으로 이동시키고 싶으신 분들은 그렇게 만드셔도 무방합니다그럼 실제 이동을 위한 코드를 살펴보도록 하겠습니다.

 

             if(g_playerPosX < 499)

             {

                           g_playerPosX++;

             }

             else

             {

                           notice("막다른길입니다다른곳으로이동해주세요.\n\n");                                                           

             }

 

지난번에 배운 if else를 이용해 조건을 만들고 해당 조건에 따라 이동과 예외처리를 해주면 되겠습니다코드 중간에 보이는 g_playerPosX++; 는 증감연산자라고 불립니다 ++과 반대로 --  있습니다이것들을. ++이 변수의 앞에 붙는 경우와 뒤에 붙는 경우로 나뉘는데 역시나 그 의미 또한 틀립니다. ++g_playerPosX; 의 경우에는 g_playerPosX의 값을 먼저 증가시킵니다. g_playerPosX++; 는 당연히 후에 증가시킵니다둘다 최종적으로 g_playerPosX = g_playerPosX + 1의 값을 가지게 됩니다만 코드를 실행하는 과정에서 처리되는 값은 차이가 있습니다.

 

다음 예제코드를 보시면 좀 더 이해하시기에 편할겁니다.

 

1.           int num;

             num=10;

             printf("++num의경우num : %d\n",++num);

 

2.           int num;

             num=10;

             printf("num++의경우num : %d\n",num++);

 

1번의 경우 출력되는 num의 값은 11입니다먼저 값을 증가시키고 printf()에 값을 넘겨줬다는 것이죠. 2번의 경우 출력되는 값은 10입니다이것은 printf()에 현재 값을 전달하고 나중에 값을 증가했다는 것입니다어떤식으로 코드를 작성하느냐에 따라 여러분은 알맞은 문법을 사용하시면 될것입니다.

 

그럼 실제 명령어를 받아 이동을 처리하는 다소 긴 코드를 살펴보겠습니다.

 

enum PLAYER_COMMAND_STATE

{

             COMMAND_MOVE_EAST = 0,

             COMMAND_MOVE_WEST,

             COMMAND_MOVE_SOUTH,

중략

             COMMAND_WRONG,

};

 

PLAYER_COMMAND_STATE g_playerCommandState = COMMAND_WRONG;

 

void fantasyLandMap()

{

             notice("기본적인명령어와사용법을알고싶으시면'도움말명령어를이용하세요.\n\n");

             while(1)

             {

                           question("어디로가시겠습니까? <동서남북> :");

 

                           int _east = strcmp(g_inputBuf"");

                           int _west = strcmp(g_inputBuf"");

int _position = strcmp(g_inputBuf"위치");

중략

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

                           if(_east == 0)         g_playerCommandState = COMMAND_MOVE_EAST;

if(_position == 0)      g_playerCommandState = COMMAND_POSITION;

중략

                           switch(g_playerCommandState)

                           {

                           case COMMAND_MOVE_EAST:                     

                                        {                                                   

                                                     if(g_playerPosX < 499)

                                                     {

                                                                  g_playerPosX++;

                                                     }

                                                     else

                                                     {

                                                                  notice("막다른길입니다다른곳으로이동해주세요.\n\n");                                                            

                                                     }

                                        }

                                        break;

중략

                           case COMMAND_POSITION:

                                        {

                                                     char tmp[256] = "";

                                                     sprintf_s(tmp, 256, "현재위치는(%d,%d)입니다.\n\n"g_playerPosX,g_playerPosY );

                                                     notice(tmp);

                                        }

                                        break;

                           }

                           g_playerCommandState = COMMAND_WRONG;

             }

}

 

우선 enum PLAYER_COMMAND_STATE 라고 선언된 부분을 살펴보겠습니다. enum 은 변수를 선언하는 타입중 하나인 열거형이란 변수를 가질 수 있게 만드는 명령어입니다enum PLAYER_COMMAND_STATE 이런식으로 eunm 뒤에 원하는 이름으로 앞으로 사용할 타입이름을 설정하고 기존에 우리가 정수형을 선언하듯 int a; 처럼 PLAYER_COMMAND_STATE g_playerCommandState 라고 선언하면 g_playerCommandState는 PLAYER_COMMAND_STATE 형으로 선언된 변수가 됩니다.

 

이렇게 사용하는 이유는 변수가 가지는 내용을 숫자가 아닌 기억하기 쉽고 직관적으로 알아볼수 있도록 문자로 값을 넣고 싶기 때문입니다물론 그 문자의 실제 값은 정수이지만 우리가 눈으로 볼때는 문자로써 접하게 되므로 코드의 가독성에 좀더 도움이 될수 있습니다바로 위의 예제 코드를 보듯이 말이죠. enum 안에는 실제 매칭시킬 코드를 작성하면 되는데 다음과 같이 COMMAND_MOVE_EAST = 0 라고 정의하면 g_playerCommandState 변수에 0 대신에 COMMAND_MOVE_EAST 라는 문자를 넣는 것으로 동일한 값을 유지할 수 있습니다대신 우리가 볼때는 g_playerCommandState = COMMAND_MOVE_EAST; 처럼 코드를 작성할 테니 현재 저 변수는 동쪽으로 이동하는 명령” 이라고 좀더 직관적으로 알수 있겠죠만약 g_playerCommandState = 0 이라고 했다면 무슨 의미인지 알기가 쉽지 않겠습니다.

 

사용자가 변수를 선언할 때 단순히 계산하는 용도가 아닌 위처럼 어떤 상태등을 표현하고 싶을 때 주로 사용하는 방법이라고 말하고 싶군요저는 보통 그런 용도를 사용합니다하지만 여러분의 상상에 따라 다양하게 사용이 가능합니다

 

코드를 계속 설명하자면 int _east = strcmp(g_inputBuf""); 입력한 내용이 "이면 strcmp 함수가 저번에 설명한것처럼 0을 리턴할 테니 if(_east == 0)         g_playerCommandState = COMMAND_MOVE_EAST처럼 조건을 만족하면 플레이어의 명령상태를 eunm 으로 지정한 동쪽이동으로 변경해 주는것입니다그럼 현재 상태는 동쪽이동 명령상태가 되겠죠그 외 코드도 다 같은 맥락이니 쉽게 이해가 되실겁니다.

 

그 다음 새로 보이는 switch 명령어 입니다보통 다중 선택문이라 불리는 이 명령어는

 

switch(변수)

{

case :

처리할 명령

break;

case :

처리할 명령

break;

원하는 개수만큼

}

 

위와 같은 형식으로 사용을 합니다변수의 값을 넣고 그 변수가 현재 무슨값인지에 따라 case 값에 맞는 곳으로 이동되어 그 부분의 명령만 처리하고 빠져나가는 형식입니다위 코드에서는 현재 사용자가 ” 이라고 입력했다면 case COMMAND_MOVE_EAST가 있는 항목으로 이동해 안에 있는 if 문을 수행할 것입니다. g_playerPosX++; 등을 수행해 현재 좌표가 바뀌게 되겠죠.

 

전체 코드를 보시면 알겠지만 다른 방향의 이동도 모두 위와 같은 패턴으로 이루어져 있습니다좀 더 효율적으로 코드를 작성하는 것은 여러분의 몫이므로 기본적인 사용방법을 참고 하시면 되겠습니다. 결과 화면을 보겠습니다.

 

 

도움말 외의 여러 명령어를 지정했고 현재 (498,200) 의 위치에서 동쪽으로 이동후 (499,200) 의 위치가 되었습니다. 위치 라는 명령어를 통해 현재 나의 좌표를 확인한 것입니다. 여러분도 필요한 명령어와 그에 따른 출력형태를 만드시면 원하는 게임을 만들수 있겠습니다. 맵을 만들고 플레이어를 이동하는 것이 준비 되었으니 다음 시간에는 맵에 여러 이벤트, 몬스터등을 설정하는 방법을 알아보도록 하겠습니다. 이번 포스팅으로 더 재밌는 게임을 만들수 있길 바랍니다.

[출처] https://gameslab.tistory.com/m/81?category=486131

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수

등록된 글이 없습니다.

대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED