본문 바로가기
Lecture

Snake Bite 텍스트 게임 제작하기 - 1

by 작은별하나 2019. 12. 10.
반응형

게임을 제작하는 전체적인 구조는 대부분의 게임에서 비슷한 구조로 작성된다. 대부분의 게임은 사용자의 입력에 따라서 게임을 진행하며, 어떤 입력을 받았는가에 따라서 게임이 일찍 끝나기도, 또는 늦게 끝나기도 한다. 게임의 전체적인 진행을 순서도로 표시하면 대략 다음과 같이 구성될 수 있다.

 

게임 처리 순서도

게임이 시작하게 되면 게임초기화부에서는 게임을 진행하기 위한 여러가지 상태변수들을 초기화하게 된다. 모든 프로그램은 유한상태기계(Finite State Machine)으로 표현할 수 있는데, 게임도 예외일 수 없다. 게임초기화에서는 상태변수들을 초기화하는 것 이외에도 화면출력에 사용할 그래픽 자원들을 파일로부터 얻어오게 된다.

 

사용자 입력부는 키보드, 마우스, 조이스틱 등 게임에서 게임을 조작하기 위한 도구들로부터 데이터를 받는다. 일반적으로 PC 게임의 경우에는 키보드, 마우스로 입력을 받게 된다. 사용하는 플랫폼과 운영체제에 따라 입력부는 달라지게 되므로, 그에 맞추어서 전체적인 틀이 될 수 있는 프레임웍의 설계가 달라진다.

 

사용자 입력을 받고, 그 입력 내용에 따라서 데이터를 처리하게 된다. 게임 프로그램에서는 시간도 중요한 입력 내용이 된다. 또는 네트웍으로부터 온 데이터도 입력부에서 처리해야 한다. 사용자 입력은 동기화되지 않았기 때문에, 내부적으로 사용자 입력을 동기화할 수도 있고, 또는 비동기 상태로 사용자 입력을 처리할 수도 있다. 비동기 상태로 처리하는 경우에는 게임 데이터 처리에 신경을 써주지 않으면, 심각한 문제를 발생시킬 수 있다.

 

화면 출력부는 게임에서 가장 중요한 부분이다. 대부분의 게임 제작자들은 화면 출력부에 가장 많은 노력을 기울인다. 다른 응용 프로그램과 달리, 보여지는 것이 가장 중요하게 여겨지는 것이 게임 프로그램이다. 이 부분에서는 게임 데이터를 이용하여 화면에 출력하게 된다.

 

텍스트 입출력 함수

 

고전적인 컴퓨터에는 점을 다루는 기능보다는 글자를 다루는 기능을 제공하였다. 컴퓨터를 만들어서 사용했던 이유가 복잡한 탄도 계산과 같이 과학적인 계산을 필요로 하고 있었기 때문이었다. 1980년대에 국내 대학에서 사용하던 컴퓨터는 카드를 이용하여 입력을 받고, 그 결과를 프린트로 받아보았으니, 여기서 점, 선, 색을 이용한 그래픽이 가능할리 만무하다.

 

이런 이유로 C 언어에서 제공하는 기본적인 입출력 함수들은 모두 글자를 다루고 있다. 이 함수들을 표준 입출력 함수(Standard input/output functions)라고 하며, C 언어에서는 표준 라이브러리에서 이 함수들을 제공하고 있다. 이 함수들을 사용하기 위해서는 stdio.h 라는 헤더파일을 포함하여 사용하면 된다. 여기에 자주 사용되는 표준 입출력 함수들에 대해서 알아보도록 하자.

 

#include <stdio.h>		표준 입출력 함수를 사용하기 위한 헤더 파일

getchar()			키보드로부터 한글자를 입력받는다.
scanf(fmt, <args...>)		키보드로부터 정해진 형식으로 입력을 받는다.
putchar()			한글자를 화면에 표시한다.
printf(fmt, <args...>)		화면에 정해진 형식으로 출력한다.

 

게임은 다른 응용 프로그램과는 달리 시간도 중요한 입력으로 간주할 수 있다. 그런데 표준 입출력 함수는 컴퓨터의 성능을 높이기 위해서 사용자 입력이 있기 전까지 해당 함수에서 기다린다. 컴퓨터는 기다리는 동안 다른 작업을 하던지, 또는 스스로 전력을 적게 소모하는 상태로 들어간다. 그래서 표준입출력 함수에서 제공하는 입력 함수는 게임 프로그램을 작성하는데 적당하지 않다. 게임에서는 비동기 형태의 입력기를 사용해야 한다. 비동기 형태의 입력은 현재 입력된 내용이 있는지 아닌지를 알 수 있는 방식이다. 이러한 비동기 입력 함수는 콘솔 입출력 함수(Console input/output functions)에서 제공하며, 이를 사용하기 위해서 conio.h 라는 헤더파일을 포함하여야 한다.

 

#include <conio.h>		콘솔 입출력 함수를 사용하기 위한 헤더 파일

kbhit()				키보드로부터 입력이 있는지 검사한다.
getch()				키보드로부터 입력을 가져온다.

 

그 외에 텍스트 화면에 효과적으로 원하는 위치에 글자를 찍기 위해서는 다음과 같은 기능을 필요로 한다. 첫번째는 화면을 지워주는 기능이다. 화면을 지우는 기능은 콘솔 윈도우 창에서 cls란 명령을 사용하면 된다. 이것을 프로그램에서 똑같이 적용하는 것이 표준 라이브러리 함수(Standard library functions)에서 제공하는 system()이란 함수이다.

 

#include <stdlib.h>		표준 입출력 함수를 사용하기 위한 헤더 파일

system("cls");			화면을 지워준다.

 

마찬가지로 화면에 커서 위치를 옮겨주는 기능도 필요하다. 이 함수는 기본적인 C 언어 함수에 존재하지 않는다. 이 기능은 윈도우즈 함수(Windows functions)에 존재하기 때문에 이를 이용하여 프로그램을 작성해야 한다.

 

#include <windows.h>		윈도우즈 함수를 사용하기 위한 헤더 파일

SetConsoleCursorPosition()	콘솔 윈도우에서 커서 위치를 설정한다.

 

이 함수들을 이용하여 보다 편한 이름으로 함수를 정의하면 다음과 같다.

 

void clrscr()
{
    system("cls");
}

void gotoxy(int x, int y)
{
    COORD pos = { x-1, y-1 };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

 

게임 프레임웍

 

건물을 지을 때, 저층 건물과 고층 건물은 모든 면에서 작업 방식이 자뭇 다르다. 고층 건물인 경우 설계도부터 시작해서 골조 공사를 하고 그 다음 건물의 벽을 만든다. 프로그램을 작성할 때에도 이와 비슷하다. 프로그램을 설계하고, 틀을 만드는 과정이 필요하다. 작은 규모의 프로그램인 경우 무시할 수도 있는 절차이지만, 여기서는 그 절차를 따라서 만들어보도록 하자.

 

이 교재의 앞에서 순서도를 이용하여 일반적인 게임 프로그램의 진행 과정에 대하여 설명하였다. 순서도에서 있는 것을 프로그램으로 옮긴다면 어떻게 될 것인가? C 언어에서는 프로그램이 시작하면 가장 먼저 호출이 되는 함수가 바로 main() 함수이다. 또한 main() 함수를 빠져나오면, 프로그램은 종료하게 된다. 순서도에 시작과 종료는 main() 함수의 시작과 종료로 인식해도 무난할 것이다.

 

입력, 데이터 처리, 화면 출력은 무한 반복이 된다. 이러한 반복이 되는 부분은 C 언어에서 제공하는 반복문을 사용할 수 있다. 횟수를 제한한다면 for 루프를 사용하는 것이 일반적이지만, 무한 반복을 사용한다면 while 루프문을 사용한다.

 

이렇게 해서 순서도를 프로그램화한 것이 다음과 같다.

 

void main()
{
    초기화부
    while( 종료검사 )
    {
	입력부
	게임 처리부
	출력부
    }
}
728x90

댓글