본문 바로가기
Lecture

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

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

스낵바이트 게임 소개

 

이번에 작성해볼 게임은 추억의 게임인 스낵바이트 게임이다. 과거 추억의 게임이지만, 스낵바이트 게임은 게임 프로그래밍을 처음 접하는 초급 프로그래머가 도전해보기에 적당한 소재인 듯 합니다.

 

스낵바이트 게임은 간단한 규칙(Rule)을 가지고 있다. 뱀(Snake)을 조절하여 화면상에 있는 사과를 많이 먹는 게임이다. 단 주의할 것은 뱀이 자신을 물거나 벽에 부딪쳐서는 안된다. 뱀은 계속 전진하며, 사용자는 키보드로 방향만 전환할 수 있다. 뱀은 시간이 지나거나 사과를 먹게되면 계속 길이가 길어지며 속도가 빨라지게 되어 게임의 난이도가 높아진다.

 

아래 그림과 같이 뱀이 돌아다닐 수 있는 사각형의 영역이 있다. 뱀은 @를 머리로 가지게 했고, 몸체는 채워진 사각형으로 그렸다. 사과는 ♡로 표현하였다. 간단하게 화면 위에는 게임의 제목과 하단에는 프로그램 제작자 그리고 현재 게임의 점수를 표현하였다.

 

게임실행화면

프로그램 작성

 

프로그램을 작성할 때, 프레임웍을 작성했으면 두번째로 해야 하는 것이 오브젝트들의 모델링(Modeling)이다. 모델링을 올바르게 했다면, 그만큼 프로그램을 작성하는 것이 쉬워지며, 또한 프로그램의 유연성이 높아진다. 모델링 작업은 프로그램 설계자의 몫이며, 설계자의 역량을 가늠할 수 있는 척도이다. 프로그램에서 모델링의 결과는 일반적으로 구조체 또는 클래스로 나타내어진다. 여기서는 간단하게 실변수로만 모델링을 해보도록 하자.

 

스낵바이트 게임에서는 움직이는 오브젝트로 뱀(snake)이 있다. 일단 뱀은 머리가 존재한다. 머리가 이동을 하고 뒤에 있는 몸체가 따라오게 된다. 뱀의 위치는 사과를 먹었는지 아닌지를 판단할 수 있는 자료이다. 머리는 위치와 현재의 진행방향을 가지고 있어야 한다. 또한 난이도 조절을 위해서 현재의 속도를 가지고 있도록 하자.

 

	int x = 10, y = 10;			//	뱀머리의위치
	int dir = 0;				//	뱀머리의방향
	int speed = 0;				//	뱀의이동속도

 

뱀은 몸체의 길이가 사과를 먹고 시간이 지남에 따라서 변화하는 부분이다. 특히 뱀의 머리가 자기 자신의 몸을 지나치지 않았는지 검사해야하기 때문에, 각각의 몸체에 대한 위치값을 기억하고 있어야 한다.

 

	char snake[100][2];			//	뱀몸체의위치
	int snakelen = 2;			//	뱀몸체의길이

 

사과의 경우에도 비슷한 방법으로 모델링을 하면 된다. 사과의 경우 무작위(Random)로 위치를 잡아서 생성이 되어야 하기 때문에 표준 라이브러리 함수에서 제공하고 있는 무작위 함수를 사용해야 한다. 무작위 함수를 처음에 초기화할 때에는 씨앗(Seed)값을 주어야 하는데 이 씨앗값으로는 현재 시간을 주로 사용한다.

 

#include <stdlib.h>		표준 라이브러리 함수 포함 파일
#include <time.h>		시간 함수 포함 파일

srand(seed)			씨앗값으로 무작위값 초기화한다.
rand()				무작위을 가져온다.
time(0)				현재시간을 초로 환산하여 낸다.

 

다음은 입력부이다. 여기서는 키보드의 입력을 받아서 뱀을 회전해준다. 키보드는 'a' 키와 's' 키를 사용하였다. kbhit() 함수를 이용해서 현재 키보드 입력이 있는지 검사함으로 게임이 키보드 입력이 없어도 진행될 수 있도록 하였다.

 

	if( kbhit() )
	{
	    int c = getch();
	    if( c == 'a' )
		dir = (dir+3)%4;
	    else if( c == 's' )
		dir = (dir+1)%4;
	}

 

이제는 주어진 뱀의 머리 위치와 현재의 방향에 따라서 뱀을 움직이도록 한다. 뱀을 움직이는 원리는 간단하다. 뱀의 길이만큼 머리위치부터 꼬리쪽으로 위치를 한칸씩 이동하면 된다.

 

for( int i = snakelen-1 ; i >= 0 ; i-- )
{
	snake[i+1][0] = snake[i][0];
	snake[i+1][1] = snake[i][1];
}
snake[0][0] += move[dir][0];
snake[0][1] += move[dir][1];

 

뱀이 이동하면서 발생하는 결과에 따라서 처리를 하도록 한다. 뱀의 위치가 벽에 닿았거나 자신의 몸에 닿았으면 프로그램을 종료하도록 한다. 조금 복잡하게 작성해서 게임을 다시 시작하도록 할 수도 있겠지만, 교육용 프로그램인만큼 간단하게 구성하도록 한다. 뱀이 사과를 먹으면 점수를 증가시키고, 뱀의 길이와 속도 등을 조절하도록 한다. 그리고 게임이 너무 빨라지지 않도록 매 그림을 그린 후 일정시간 쉬도록 한다. 일정시간 쉬도록 하는데에는 _sleep() 함수를 이용하도록 한다. 여기서는 쉬는 시간을 조절하여 게임의 속도를 조절하는데 사용하였다.

 

	//	check snake's head position
	if( checksnake(snake, snakelen) )
	    break;
	//	check snake's head and apple
	for( int i = 0 ; i < 10 ; i++ )
	{
	    if( apples[i][0] == snake[0][0] && apples[i][1] == snake[0][1] )
	    {
		apples[i][0] = -1;
		apples[i][1] = -1;
		snakelen++;
		score += 40;
		speed += 10;
	    }
	}
	//	gen apples
	if( rand()%1000 < 30 )
	    genapples(apples, snake, snakelen);
	//	counting
	count++;
	if( (count%100) == 0 )
	{
	    snakelen++;
	    score += 10;
	    speed += 10;
	}
	//	draw
	drawsnake(snake, snakelen);
	drawscore(score);
	_sleep(400-speed);
728x90

댓글