- 전체
- 게임 일반 (make game basics)
- 모바일 기획 및 디자인
- GameMaker Studio
- Unity3D
- Cocos2D
- 3D Engine OGRE
- 3D Engine irrlicht
- copperCube
- corona SDK
- Windows Basic Game
- BaaS (Mobile Backend)
- phnegap & cordova
- ionic & anguler
- parse (backend)
- firebase (backend)
- Game Backend Server / Opt
- web assembly
- Smart Makers
- pyGame & Ren'Py
- 머드(MUD) 게임 만들기
- Xamarin(자마린)
- flutter (플루터 앱 개발)
- construct 2 / 3
- pocketbase
- RPG Maker 시리즈
- godot engine
- playmaker(unity)
- react native
머드(MUD) 게임 만들기 무작정 배우는 C언어 머드(MUD)게임만들기 Part1 게임스랩
2020.10.17 23:49
무작정 배우는 C언어 머드(MUD)게임만들기 Part1 게임스랩
예제 게임 소스 : MUD_TurtleAdventure.zip
안녕하세요. 이번 포스팅부터는 게임을 만드는데 가장 기본적인 무기인 언어, 그 중에서도 C언어를 기반으로 하는 게임 만들기를 공부해 보고자 합니다. 예전 학원에서 강의하거나 개인 과외를 할 때를 생각해보면 대부분 본인이 희망하는 책을 선정해서 진도를 나가거나 학원에서 정해진 커리큘럼대로 진행이 되는 경우가 많았습니다.
그러나 게임 전문 교육기관의 경우엔 그래도 게임을 만들면서 배우는 과정이 대부분이고 같은 프로그래밍 언어를 배운다 하더라도 후자가 더 재미있다고 생각합니다. 그래서 저도 책에서 볼 수 있는 강의보단 게임을 만들면서 문법 및 명령어들을 익히며 해당 내용들이 어떤 식으로 게임 만드는데 쓰이는지 풀어보고자 합니다. 부족한 부분이 많겠지만 재미있게 봐주시면 감사하겠습니다.
처음 만들어 볼 게임은 제목에서도 보신 바와 같이 머드(MUD) 게임을 만들어 볼까 합니다. 머드(MUD) 게임은 Multilpe User Dungeon또는 Multilpe User Dialogue또는 Multilpe User Dimension의 약자로 텍스트 기반의 게임입니다. 용어의 풀이야 어찌됐든 중요한 것은 여러 사람이 같이 즐길 수 있는 게임이었다는 것입니다. 1990년대 초에 유행했던 게임이라 이 세대가 아니신 분들에게는 생소한 게임일 수도 있습니다. 대표적인 게임으로는 단군의 땅, 쥬라기 공원 등이 있습니다. 이 때는 전화로 인터넷을 하던 시기라서 전화비만 수십 만원씩 나오기도 했었다는 유저들도 많이 있었습니다. 그 만큼 재미있었다는 반증이겠죠.
처음 이 게임을 접하신다면 아마도 게임과 채팅을 한다 또는 책을 읽는다 라는 느낌을 받으실 수 있습니다. 화려한 그래픽으로 무장한 지금의 게임과는 다른 모습이지만 나름 매력이 있다고 생각합니다. 물론 지금에는 많은 사람들이 즐기지 않는 게임 형태이기도 합니다. 뭐 추억의 오락실 게임처럼 추억의 온라인의 게임이라고 할 수 있겠습니다.

(무림크래프트3)
우리가 만들어볼 게임이 바로 위의 사진과 같은 게임입니다. 물론 위 게임은 서버와 연결이 되어 있지만 우리는 이제 시작하는 단계이므로 서버를 제외한 혼자 플레이 할 수 있는 게임을 만들어 보겠습니다. 그럼 프로그래밍 언어를 컴파일 하기 위한 컴파일러가 필요한데 저는 Microsoft Visual Studio 2008 trial버전을 사용하겠습니다. 여러분들은 입맛에 맞는 컴파일러를 선택하시면 되겠습니다.(컴파일러 종류 http://sourceforge.net/apps/mediawiki/predef/index.php?title=Compilers) 저는 Microsoft Visual Studio 2008 trial버전을 기준으로 프로젝트 생성부터 시작하겠습니다.
우선을 Microsoft Visual Studio 2008 trial을 실행하시고 1.“파일-새로 만들기-프로젝트” 를 선택하고 2.”Visual C++의 Win32에서 Win32 콘솔 응용 프로그램” 템플릿을 선택하시고 프로젝트를 이름을 정하시면 되겠습니다. 3.”응용프로그램 설정에서 추가 옵션에 빈 프로젝트를 체크”합니다.

4.”소스파일에서 마우스 오른쪽버튼을 클릭하고 추가-새 항목”을 선택합니다. 마지막으로 5.”Visual C++에서 C++파일을 선택하고 파일 이름을 정해”주시면 됩니다. 보통 main 으로 이름을 정해주시면 되겠습니다.
이제 여러분은 C언어를 이용한 프로그래밍을 할 준비가 다 되었습니다. 여러분 화면에서 텍스트 문서처럼 빈 공간이 있을 것입니다. 이 곳에 이제부터 C언어를 이용해 게임을 만들어 보겠습니다. 참고로 여느 책이나 강좌와는 다르게 C언어의 기초를 자세하게 설명하지는 않겠습니다. 저는 기본적인 것들을 이용해서 게임을 만들면서 많은 양을 이해하기 보다 적은 양을 이해하고 이해한걸 바탕으로 여러분들이 확장해 가길 바랍니다. 그래서 기본적인 것 이외에는 제시해드리는 키워드 등을 이용해서 검색해보시면 많은 자료를 찾으실 수 있으리라 생각됩니다.
#include <stdio.h>
void main()
{
}
제목처럼 여러분은 무작정 제가 제시한 코드를 따라하시면 됩니다. 물론 중간에 여러분이 원하는 내용을 넣을 수 있게 유도할 것입니다. 그러니 일단 믿고 따라오시면 되겠습니다. 위 코드에 대해서 설명하자면 #include <stdio.h> 부분은 stdio.h 라는 헤더파일을 내가 사용하겠다라는 의미입니다. #include 는 전처리기라고 불리는 명령어입니다. 컴파일 하기 전에 처리한다는 뜻이죠. 그럼 헤더 파일은 무엇이냐 하면 쉽게 얘기해서 우리가 사용할 명령어의 집합소입니다.
수 많은 헤더파일이 있고 각 헤더파일에는 우리가 사용할 명령어들이 정의되어 있습니다. 그래서 #include 를 통해 헤더파일을 미리 처리해 놔야지 우리가 원하는 명령어를 사용할 수 있는 것이죠. 헤더파일을 감싸고 있는 < > 부분은 컴파일러 지원 헤더파일과 사용자 헤더파일에 따라 < >, “ ” 으로 나뉩니다. 나중에 다시 볼 기회가 있으니 일단 그렇다고만 알고 넘어가겠습니다.
void main()은 프로그램이 실행될 때 가장 먼저 시작되는 함수라고 생각하시면됩니다. 우리는 이 void main()의 { … } 안에 원하는 내용을 프로그래밍할 것입니다. 자 그럼 주인공의 상태를 설정해볼까요?
void main()
{
char playerName[] = "꼬부기"; //플레이어의이름
int playerHP = 100; //플레이어의체력
int playerMP = 50; //플레이어의마력
int playerGold = 1000; //플레이어의소지골드
int playerATK = 10; //플레이어의공격력
int playerDEF = 5; //플레이어의방어력
float playerCriProb = 1.5f; //플레이어의크리티컬확률
}
각자 자기만의 세계관을 만드시고 원하는 이름과 능력치들을 설정하는 것입니다. 저는 꼬부기의 모험이란 주제로 할 것이므로 위와 같이 간단하게 설정했습니다. 여러분은 기획 내용에 맞게 여러 능력치를 추가하셔도 무방합니다. 그럼 위의 코드가 어떤 내용인지 알아보겠습니다. 처음 보이는 char 라는 명령어는 데이터타입을 지정하는 것입니다. 쉽게 말해서 내가 원하는 정보가 문자인지 숫자인지에 따라 컴파일러가 인지할 수 있도록 데이터의 타입을 지정하는 것입니다.
이름이나 지명등은 글이니까 문자 타입이겠죠. 문자 타입은 char 라는 명령어를 사용합니다. 그 뒤에 붙은 playerName[] 이라는 부분이 바로 여러분이 마음대로 설정할 수 있는 변수입니다. 이것으로 여러분은 문자형 변수를 선언한 것입니다. 변수 이름은 여러분이 원하는 것으로 하실수 있는데 약간의 규칙이 있습니다. c언어의 명령어나 숫자로 시작하는 혹은 특수문자 등으로 시작하는 변수명은 선언할 수 없습니다. 자세한 내용은 서적 등을 참고하시면 되겠습니다. 여러분은 그저 영문으로 시작하는 영문+숫자의 조합으로 된 변수명을 선언할 수 있다 정도로만 아셔도 앞으로 프로그래밍하는데 큰 문제는 없습니다.
이름 뒤에 붙은 [ ] 부분은 문자타입중에서 문자열, 즉 한 글자 이상(자세히는 1Byte 이상)의 문자가 들어가는 경우입니다. 만약 여러분이 데스노트에 나오는 인물인 N 이라는 이름처럼 한 글자(1Byte)인 문자를 취급한다면 char playerName = ‘N’; 으로 작성하시면 됩니다. 1Byte 인 경우에는 ‘ ‘ 안에 2Byte 이상인 경우에는 “ “안에 원하는 글자를 넣으시면 됩니다.
물론 char playerName[] = "N"; 이렇게 가능합니다. 왜냐하면 위에서 얘기한 것처럼 1Byte 이상 즉 1Byte 도 포함되기 때문입니다. 1Byte 에 대해서 궁금해하실 분들도 계시는데 간단히 설명하자면 영문,숫자,일반적인 특수문자, 즉 아스키코드로 표현가능한 글자는 1Byte입니다. 그외의 글자들은 다 2Byte이상을 사용해서 표현됩니다.
위의 내용으로만 본다면 한글의 경우 한글자당 2Byte를 사용하게 되는것이죠. 좀 복잡한 이야기이니 이정도까지만 하겠습니다. (키워드 – 아스키코드표, 유니코드표)나머지 부분들 int, float 는 정수와 실수를 사용할 때 선언하는 데이터타입입니다. 사용법은 코드상에 보시는바와 같이 좌측엔 변수 선언, 우측엔 대입할 값을 넣어주시면 됩니다. 이제 우리가 설정한 값들이 원하는 때에 제대로 화면에 표시되는지 확인해봐야겠죠?
printf("이름: %s\n", &playerName);
printf("체력: %d\n", playerHP);
printf() 는 원하는 내용을 화면에 출력해주는 함수입니다. %s, %d 는 어떤 타입의 값을 표현해야 할지 정해주는 서식입니다. 서식의 수와 데이터타입에 맞는 &playerName 와 같은 인수들이 필요합니다. %s 는 문자열, %d는 정수형의 데이터를 필요로 한다는 뜻입니다. 이 외에도 다양한 서식들이 존재합니다. (키워드 - printf %d) 이 말은 위에 소개한 데이터타입 이외에 다양한 데이터타입이 있다는 것입니다. (키워드 - c언어 데이터타입)
다시 설명하자면 %s가 &playerName 변수에 담긴 내용을 출력하겠단 이야기입니다. 마찬가지로 %d는 playerHP 변수에 담긴 내용을 출력하겠단 뜻입니다. %s 뒤에 있는 \n 은 출력 제어 문자라고 합니다. 말 그대로 출력을 할 때 어떤식으로 제어 할지를 설정해 주는것이지요. \n은 줄을 바꾼다는 의미입니다. 출력 제어 문자의 종류도 많이 있지만 \n 외에는 잘 쓰이지 않는 것들이므로 궁금하신분들은 역시 검색해 보시면 되겠습니다. (키워드 - printf \n) 이런 제어문자와 서식은 반드시 “ “ 안에 들어가야 하며 “ “ 안에는 제어문자와 서식외에 위와 보는 바와 같이 (이름) 이라는 원하는 문자나 기호등을 넣을 수 있습니다.
자 그럼 지금까지의 코드를 컴파일하여 결과 화면을 보도록합시다. Microsoft Visual Studio 2008 trial 에서 빌드하는 방법은 단축키 F7을 누르시고 빌드가 성공하면 Ctrl + F5 키를 누르시면 실행화면을 보실 수 있습니다.

보시는 바와 같이 저는 printf()를 이용해서 제목등을 좀더 꾸며봤습니다. 여러분도 원하시는 내용을 printf()을 이용해서 만들어보세요. 만들다 보니 처음에 소개했던 머드게임에서 보는 것처럼 텍스트에 색깔도 넣고 싶어졌습니다. 그래서 다음과 같이 바꿔봤습니다.

색깔을 넣은 것만으로도 벌써 느낌이 확 틀려지네요. 비주얼적인 부분이 게임에서 얼마나 중요한지 세삼 느끼는 바입니다. ^^
그럼 이 색깔을 넣기 위해서 사용한 명령어를 알아보겠습니다. 여러분 응용해서 멋진 게임을 만들어보세요. 우선은 이 명령어는 우리가 처음에 선언한 헤더에는 없는 명령어입니다. 그래서 새로운 헤더를 선언해야합니다. 그 헤더는 다음과 같습니다.
#include <Windows.h>
이 헤더는 void main() 함수 위에 선언해 주시면 됩니다. 헤더란 것들은 함수밖에 선언해야 한다는 것을 여러분들은 인지하셨을 겁니다. 아 물론 이 헤더는 순수 C언어에 포함된 헤더는 아닙니다. 볼랜드C를 사용하시는 분은 텍스트 색깔을 바꾸기 위해 다른 헤더와 명령어를 사용해야 합니다.(키워드 - C언어 텍스트 색깔)
그럼 실제 사용된 명령어를 살펴보겠습니다.
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
다소 긴 명령어입니다만 우리는 명령어의 사용 방법만 알면 됩니다. 굳이 외울 필요는 업습니다. 길다고 주늑들지 마세요. 다른 부분은 그냥 넘어가시고 중요한 것은 바로 이 부분입니다.
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY
명령어 함수에 전달할 인자값인데요. 이 인자값을 어떻게 넣어주느냐에 따라 여러 색깔을 만들어 낼수 있습니다. 그리고 이 인자값은 이미 어떤 헤더에서 정의해 놨습니다. 정해져 있는 인자값만을 이용해서 함수를 사용하면 되는데요. 이 정의되어 있는 값을 여러분은 당연히 모르실겁니다. 저도 무엇이 있는지 모릅니다. 하지만 위에서도 말씀드렸다시피 이미 헤더에 정의되어있기 때문에 우리는 그 정의되어 있는 어떤 헤더로 찾아가면 되겠습니다. 찾아가는 방법은 FOREGROUND_RED 인자값을 드래그해서 선택한후 F12 단축키를 누르거나 마우스 오른쪽 버튼을 눌러 나오는 팝업에서 정의로 이동 을 누르시면 해당 헤더로 이동되어집니다.
#define FOREGROUND_BLUE 0x0001 // text color contains blue.
#define FOREGROUND_GREEN 0x0002 // text color contains green.
#define FOREGROUND_RED 0x0004 // text color contains red.
#define FOREGROUND_INTENSITY 0x0008 // text color is intensified.
#define BACKGROUND_BLUE 0x0010 // background color contains blue.
#define BACKGROUND_GREEN 0x0020 // background color contains green.
#define BACKGROUND_RED 0x0040 // background color contains red.
#define BACKGROUND_INTENSITY 0x0080 // background color is intensified.
#define COMMON_LVB_LEADING_BYTE 0x0100 // Leading Byte of DBCS
#define COMMON_LVB_TRAILING_BYTE 0x0200 // Trailing Byte of DBCS
#define COMMON_LVB_GRID_HORIZONTAL 0x0400 // DBCS: Grid attribute: top horizontal.
#define COMMON_LVB_GRID_LVERTICAL 0x0800 // DBCS: Grid attribute: left vertical.
#define COMMON_LVB_GRID_RVERTICAL 0x1000 // DBCS: Grid attribute: right vertical.
#define COMMON_LVB_REVERSE_VIDEO 0x4000 // DBCS: Reverse fore/back ground attribute.
#define COMMON_LVB_UNDERSCORE 0x8000 // DBCS: Underscore.
#define COMMON_LVB_SBCSDBCS 0x0300 // SBCS or DBCS flag
그곳에는 위와 같은 내용들이 있을겁니다. 색깔과 밝기등을 조절할 수 있도록 인자값이 준비되어 있습니다. 이 인자값들을 여러 개를 사용할 때 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY 와 같이 | 기호(\ 에 있는 기호)로 연결해 주시면 됩니다. 위 코드중 하나를 살펴보면 다음의 경우.
#define FOREGROUND_BLUE 0x0001 // text color contains blue
FOREGROUND_BLUE 라는 문자의 값은 0x0001 로 정의하겠다는 뜻입니다. 그런 의미로 명령어인 #define 을 선언하고 뒤에 이어서 어떤 문자를 어떤 값으로 정의하겠다고 나열하면 FOREGROUND_BLUE 라는 문자는 0x0001 로 인식을 합니다. 뒤의 // text color contains blue 는 // 는 주석을 사용하겠다는 뜻입니다. 일종의 코드의 추가 설명서입니다. 참고로 0x는 16진수임을 표시하는 것입니다.
그럼 저의 코드를 한번 보겠습니다.
printf("┌─────────────────────────────────────┐\n");
printf("│ │\n");
printf("│");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
printf(" 꼬부기의대모험");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);
printf(" - 부제: 토끼의");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
printf(" 간");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);
printf("을찾아서... │\n");
printf("│ │\n");
printf("│ created by Jang hyun-il on 2012.7.4 │\n");
printf("└─────────────────────────────────────┘\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
printf("이름: %s\n", &playerName);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
printf("체력: %d\n", playerHP);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);
printf("크리티컬확률: %f\n\n", playerCriProb);
이 코드를 보시면 어떤식으로 사용해야하는 감이 잡히실 겁니다. 이 명령어에 대한 자세한 설명을 보고 싶다면 키워드 – SetConsoleTextAttribute로 검색해주시면 되겠습니다. 하지만 우리는 앞으로 많은 내용을 코딩할 것이고 매번 저 긴 함수를 쓰기에는 타이핑량도 많아질 것입니다. 그래서 우리는 사용자 정의 함수를 만들어 텍스틑 색깔을 바꿀수 있도록 하겠습니다. 사용자 정의 함수는 말 그대로 사용자가 원하는 용도로 만들어 사용하는 함수입니다. pintf()와 같이 이미 정해져 있는 함수를 이용하는 것이 아닙니다. 내가 직접 명령어를 만든다는 것이지요.
void textColor(int _colorValue);
위와 같이 저는 함수를 선언했습니다. 함수를 선언하는 구조는 함수의 반환값 : void, 함수명 : textColor() 전달 인자(보통 매개변수라고 합니다) : int _colorValue 로 선언할 수 있습니다. 매개 변수의 경우 필요없으면 안넣어도되며 0~N개의 매개변수를 지정할 수 있습니다. 함수를 선언했으면 이제 이 함수가 어떤 명령을 처리할지 정의를 해야합니다. void main() 함수를 보셨듯이 함수 다음에 { } 를 추가하고 정의할 코드 내용은 { } 안에 넣습니다. 제가 선언한 함수는 반환값이 void 이므로 반환값이 없고 매개변수가 정수형인 한 개를 선언했습니다. 그래서 다음과 같이 함수를 정의하였습니다.
void textColor(int _colorValue)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), _colorValue);
}
이때 함수에 선언된 매개변수인 _colorValue 의 값은 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), _colorValue); 에 있는 _colorValue 로 값이 전달되어지는것입니다. 선언과 정의가 끝났으니 실제 이 함수로 바꾼 코드를 보겠습니다.
printf("┌─────────────────────────────────────┐\n");
printf("│ │\n");
printf("│");
textColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
printf(" 꼬부기의대모험");
textColor(FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);
printf(" - 부제: 토끼의");
textColor(FOREGROUND_RED | FOREGROUND_INTENSITY);
printf(" 간");
textColor(FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);
printf("을찾아서... │\n");
printf("│ │\n");
printf("│ created by Jang hyun-il on 2012.7.4 │\n");
printf("└─────────────────────────────────────┘\n");
textColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY);
printf("이름: %s\n", &playerName);
textColor(FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
printf("체력: %d\n", playerHP);
textColor(FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);//빛의삼원색원리에따라흰색이나온다. (색의삼원색과다름)
printf("크리티컬확률: %f\n\n", playerCriProb);
여러분이 보시기엔 어떻습니까? 지금의 코드가 좀더 보기 좋아보이고 함수명도 여러분이 작명하기에 따라 더 직관적으로 바뀔 수도 있습니다. 그럼 다음 포스팅을 기대해주세요.
[출처] https://gameslab.tistory.com/m/74?category=486131
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 6 | [TextMode Game Create] Text based game | 졸리운_곰 | 2024.08.25 | 519 |
| 5 |
무작정 배우는 C언어 머드(MUD)게임 만들기 Part5 게임스랩
| 졸리운_곰 | 2020.10.17 | 724 |
| 4 |
무작정 배우는 C언어 머드(MUD)게임 만들기 Part4 게임스랩
| 졸리운_곰 | 2020.10.17 | 563 |
| 3 |
무작정 배우는 C언어 머드(MUD)게임 만들기 Part3 게임스랩
| 졸리운_곰 | 2020.10.17 | 1025 |
| 2 |
무작정 배우는 C언어 머드(MUD)게임 만들기 Part2 게임스랩
| 졸리운_곰 | 2020.10.17 | 1236 |
| » |
무작정 배우는 C언어 머드(MUD)게임만들기 Part1 게임스랩
| 졸리운_곰 | 2020.10.17 | 5646 |

