Snake Game 분석과 원리
본 자료는 3페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
해당 자료는 3페이지 까지만 미리보기를 제공합니다.
3페이지 이후부터 다운로드 후 확인할 수 있습니다.

소개글

Snake Game 분석과 원리에 대한 보고서 자료입니다.

본문내용

동시킨다. 죽었으면 TRUE를 리턴한다.
BOOL MoveSnake()
{
int headch;
int len;
int prev;

for (;;) {
gotoxy(60,23);
len=head-tail;
if (len <0) len+=QS;
printf("꼬리 길이 : %d ",len);
ProcessKey();

switch (dir) {
case LEFT:
now.x--;
break;
case RIGHT:
now.x++;
break;
case UP:
now.y--;
break;
case DOWN:
now.y++;
break;
}

// 머리 한칸 진행
head=(head == QS-1 ? 0:head+1);
snake[head]=now;

// 꼬리 한칸 진행. 단 늘어나고 있는 중이면 그 자리에 있는다.
if (inctail == 0) {
tail=(tail == QS-1 ? 0:tail+1);
} else {
inctail--;
}

// 머리를 그리기 전에 머리 위치의 문자를 미리 읽어 놓아야 한다.
headch=getchcon(now.x,now.y);
putchxy(snake[head].x,snake[head].y,'S');
prev=(head == 0 ? QS-1:head-1);
putchxy(snake[prev].x,snake[prev].y,'#');
prev=(tail == 0 ? QS-1:tail-1);
putchxy(snake[prev].x,snake[prev].y,' ');

// 현재 위치가 공백이 아니면 어딘가에 부딪힌 것임
if (headch != ' ') {
break;
}
delay(speed);
}

// 벽이나 자기 꼬리에 부딪쳤으면 죽은 것임
if (headch == 'M' || headch == '#') {
return TRUE;
}
// 먹은 숫자의 multi 배만큼 꼬리를 늘린다. 늘어나고 있는 중이라면 누적된다.
inctail+=(headch-'0')*multi;
return FALSE;
}

// 키 입력을 처리한다.
void ProcessKey()
{
int ch;

if (!kbhit()) {
return;
}
ch=getch();
if (ch == 0xE0 || ch == 0) {
ch=getch();
switch (ch) {
case LEFT:
// 진행 반대 방향으로는 전환할 수 없다.
if (dir != RIGHT) dir=LEFT;
break;
case RIGHT:
if (dir != LEFT) dir=RIGHT;
break;
case UP:
if (dir != DOWN) dir=UP;
break;
case DOWN:
if (dir != UP) dir=DOWN;
break;
}
} else {
switch (tolower(ch)) {
case 27:
setcursortype(NORMALCURSOR);
exit(0);
case ' ':
waitanykey();
break;
}
}
}

// 화면의 x,y위치에 있는 문자를 조사한다.
int getchcon(int x, int y)
{
COORD Cur;
Cur.X=x;
Cur.Y=y;
TCHAR Char;
DWORD dwRead;

ReadConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE),
&Char,1,Cur,&dwRead);
return Char;
}

// 임의의 키 하나가 눌러질 때까지 대기한다.
void waitanykey()
{
int ch;

ch=getch();
if (ch==0xE0 || ch==0) {
getch();
}
}

getchcon 함수는 화면상의 x,y 위치에 있는 문자키를 조사하는데 putch의 반대 함수라고 생각하면 된다. C 표준 함수중에 이런 함수가 없으므로 직접 만들어서 사용했다. 이 함수의 내부에는 운영체제가 제공하는 API 함수 호출이 포함되어 있는데 이 코드에 대해서는 다음에 연구해 보기 바라고 일단은 사용만 하도록 하자.
이 프로그램의 핵심 자료 구조는 뱀의 현재 자취를 기억하는 snake라는 배열이다. 뱀이 아주 길어질 수 있기 때문에 좌표값 하나만 기억해서는 뱀 몸체의 위치를 모두 알 수 없으므로 뱀이 지나는 곳 전체의 좌표를 배열로 기억한다. 좌표를 기억하는 Point 구조체의 배열로 선언되었으며 배열의 끝과 처음을 연결하여 원형 큐 형태로 사용하고 있다. 꼬리 길이가 5인 뱀이 원형 큐에 기억된 모양은 다음과 같다.
head는 뱀의 머리 부분 첨자를 기억하며 tail은 꼬리의 첨자를 기억한다. 사용자의 키 입력에 따라 뱀이 이동하는데 이때 새로운 머리 좌표를 head에 기록하면서 head는 배열의 뒤쪽으로 계속 전진한다. tail은 뱀의 끝 부분에 대한 첨자인데 head와 같은 방향으로 이동하면서 뒤쪽의 꼬리를 지우는 역할을 한다. 뱀이 지나간 좌표를 모두 기억하지 않으면 꼬리를 지울 수 없을 것이다.
큐의 크기는 매크로 상수 QS로 정의되어 있는데 1600정도의 충분히 큰 값을 주었다. 그러나 게임이 계속 진행되면 이 길이는 금방 부족해지므로 큐의 처음과 끝을 논리적으로 연결하여 사용한다. head가 배열의 뒤쪽으로 진행하다가 큐의 끝에 닿으면 다시 처음으로 돌아가 앞쪽의 빈 공간을 재사용한다. 결국 QS는 뱀의 최대 길이를 지정하는 크기라고 할 수 있는데 뱀 길이가 1600이 되면 head와 tail이 한바퀴 돌아서 만나게 될 것이다. 그러나 화면 크기가 그렇게 크지 않기 때문에 이런 일은 발생하지 않는다.
이 예제의 나머지 부분에 대한 시시콜콜한 분석은 생략하기로 한다. 어차피 실전에서 구하게 되는 소스에는 별다른 설명이 없는 경우가 많으므로 이런 소스로부터 프로그램의 구조를 파악하고 수정할 수 있는 소스 해독 능력을 갖춰야 한다. 이 예제를 대상으로 남의 소스를 분석하는 연습을 해 보기 바란다. 자세한 분석을 하지 않는 대신 주요 부분에 대해서는 간략하나마 주석을 달아 두었다.
  • 가격3,000
  • 페이지수11페이지
  • 등록일2012.03.13
  • 저작시기2008.10
  • 파일형식한글(hwp)
  • 자료번호#780143
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니