main() 함수
main() 함수에서 먼저 초기화 함수 init()을 호출한 다음 while() 루프에 들어갑니다. 루프는 주로 세 부분으로 구성됩니다.
- 사용자의 입력을 확인합니다. "w" 키 또는 스페이스바를 누르면 새가 두 행 위로 이동합니다. "q" 키를 누르면 게임이 종료됩니다. "z" 키를 누르면 게임이 일시 중지됩니다.
- 새를 이동시키고 다시 그립니다.
- 새가 파이프에 부딪히는지 확인합니다.
코드를 살펴보겠습니다.
int main()
{
char ch;
init();
while(1)
{
ch = getch(); // 키보드 입력 받기
if(ch == ' ' || ch == 'w' || ch == 'W') // 스페이스바 또는 "w" 키를 누르면
{
// 새를 이동시키고 다시 그립니다.
move(bird_y, bird_x);
addch(CHAR_BLANK);
refresh();
bird_y--;
move(bird_y, bird_x);
addch(CHAR_BIRD);
refresh();
// 새가 파이프에 부딪히면 게임 종료
if((char)inch() == CHAR_STONE)
{
set_ticker(0);
sleep(1);
endwin();
exit(0);
}
}
else if(ch == 'z' || ch == 'Z') // 일시 중지
{
set_ticker(0);
do
{
ch = getch();
} while(ch != 'z' && ch != 'Z');
set_ticker(ticker);
}
else if(ch == 'q' || ch == 'Q') // 종료
{
sleep(1);
endwin();
exit(0);
}
}
return 0;
}
main() 함수에서는 먼저 화면을 초기화한 다음 루프에서 키보드 입력을 받습니다. "w" 키 또는 스페이스바를 누르면 새가 두 행 위로 이동합니다. "q" 키를 누르면 게임이 종료됩니다. "z" 키를 누르면 게임이 일시 중지됩니다.
이제 init() 함수를 살펴보겠습니다.
void init()
{
initscr();
cbreak();
noecho();
curs_set(0);
srand(time(0));
signal(SIGALRM, drop);
init_bird();
init_head();
init_wall();
init_draw();
sleep(1);
ticker = 500;
set_ticker(ticker);
}
init() 함수는 먼저 ncurses에서 제공하는 함수를 사용하여 화면을 초기화합니다. 그런 다음 여러 하위 함수를 호출하여 특정 초기화를 수행합니다. 신호 처리 함수 drop()을 설치하고 타이머 간격을 설정합니다.
각 초기화 하위 함수를 살펴보겠습니다.
init_bird() 함수는 새의 위치를 초기화합니다.
void init_bird()
{
bird_x = 5;
bird_y = 15;
move(bird_y, bird_x);
addch(CHAR_BIRD);
refresh();
sleep(1);
}
init_head() 및 init_wall() 함수는 파이프를 저장하기 위해 연결 리스트를 초기화합니다.
void init_head()
{
Node tmp;
tmp = (node *)malloc(sizeof(node));
tmp->next = NULL;
head = tmp;
tail = head;
}
void init_wall()
{
int i;
Node tmp, p;
p = head;
for(i = 0; i < 5; i++)
{
tmp = (node *)malloc(sizeof(node));
tmp->x = (i + 1) * 19;
tmp->y = rand() % 11 + 5;
p->next = tmp;
tmp->next = NULL;
p = tmp;
}
tail = p;
}
init_draw() 함수는 화면을 초기화합니다.
void init_draw()
{
Node p;
int i, j;
// 연결 리스트 순회
for(p = head->next; p->next != NULL; p = p->next)
{
// 파이프 그리기
for(i = p->x; i > p->x-10; i--)
{
for(j = 0; j < p->y; j++)
{
move(j, i);
addch(CHAR_STONE);
}
for(j = p->y+5; j <= 23; j++)
{
move(j, i);
addch(CHAR_STONE);
}
}
refresh();
sleep(1);
}
}
이것으로 플래피 버드 게임이 완성되었습니다.