강의/C언어 게임 만들기

C언어로 게임 만들기 2. 시분할 (2) 필자가 만든 프로그램

moon44432 2020. 11. 14. 22:30

C언어로 게임 만들기
2. 시분할
(2) 필자가 만든 프로그램

반갑습니다. 이번 강의에서는 조금 쉬어 가는 뜻으로 필자의 초등학생 시절 프로그램을 분석해 볼 것입니다. 이를 통해 잘못 구현된 게임의 예와 시분할의 중요성에 대해 알아보도록 하겠습니다.


​필자가 약 8년 전에 만들었던 프로그램 

필자가 초등학생이던 시절, C언어를 사용하여 처음으로 슈팅 게임을 만들어 보았습니다. 아무 것도 몰라 기분 내키는 대로 키보드를 두드렸던 기억이 납니다. 그때 짰던 저의 코드를 요약하여 공개합니다.

...

int main(void)
{
    ...

    while (1) // 게임 시작 
    {
    	input = getch(); // 키 입력받기
        ...
        
        gotoxy(x, y);
        printf("O"); // 플레이어 출력      
        ...

        ex = rand() % (MAX_X); // 새로운 적의 좌표 설정
        ey = rand() % (MAX_Y);

        drawEnemy(ex, ey); // 새로운 적 출력
        ...
        
        switch (input)
        {
        case 'w' : // 플레이어 이동
            ...
            break;
        case 's' :
            ...
            break;
        case 'd' :
            ...
            break;
        case 'a' : 
            ...
            break;
        case ' ' : // 총알 발사
            while (1)
            {
                gotoxy(bx, by);
                printf("*");
                Sleep(50);
                ... // 총알이 적에 닿았는지 판단하는 부분(생략)
                gotoxy(bx, by);
                printf(" ");
                by--;
                if (by == 0) break;
            }
            by = py - 1;
            break;
        }
        ... // 적의 체력이 0인지 판단하는 부분 (생략)
    }
    // 게임 끝
    return 0;
}

세부적인 내용보다는 프로그램의 로직에 주목해 주세요. 이 게임이라고 부르기도 어려운 프로그램을 컴파일해서 실행시키면 어떻게 작동할까요?

아마 다음의 루틴을 따를 것입니다.

여기서 문제점을 알 수 있습니다.  위의 다이어그램처럼 기능들이 항상 정해진 순차적으로 실행되기 때문에 한 기능이 끝나기 전에는 다른 기능이 실행되지 않습니다.  즉 사용자가 키를 누르기를 대기하는 동안에는 아무 일도 일어나지 않으며,  총알을 한번 발사하고 나면 총알이 화면 끝까지 날아가 사라질 때까지 다른 것들은 모두 멈춘다는 것입니다.

소스 코드를 읽어봤다면 아시겠지만 위 프로그램은 슈팅 게임입니다. 슈팅 게임이라면 적이 생성되고, 적이 총알을 발사하거나 플레이어가 총알을 발사하거나 하는 행동들이 정해진 순서 없이 키를 누르는 순간, 혹은 무작위적으로 진행되어야 합니다. 하지만 필자는 턴제 게임에나 사용될 방법으로 슈팅 게임을 개발했기 때문에 완전히 부자연스러운 동작을 보이게 됩니다.


만약 이 게임에 시분할을 적용했더라면 여러 처리들이 동시에 이루어질 수 있기 때문에 좀 더 현실적인 슈팅 게임이 되었을 것입니다.


이로써 시분할의 개념에 대한 두 편의 강의가 끝났습니다. 서론이 너무 길었습니다. 다음 강의에서는 게임에 시분할을 실제로 적용해 보도록 하겠습니다.

이상으로 강의를 마칩니다. 감사합니다.