마지막으로, 전체적으로 테트리스를 실행시키는 Main.c 를 분석해 보겠습니다.


[Main.c]

#include <stdio.h>
#include <conio.h>
#include "Constant.h"
#include "TetrisView.h"

int main(int argc, char* argv[]){
	TetrisView tetrisView;
	TetrisView_StartGame(&tetrisView);
	int processType;
	int direction;
	while (True){
		processType = AUTO;
		direction = DOWN;
		if (_kbhit()){
			int key = _getch();
			if (_kbhit()){
				key = _getch();
				switch (key){
				case UP_KEY_CODE:
					processType = DIRECTION;
					direction = UP;
					break;
				case LEFT_KEY_CODE:
					processType = DIRECTION;
					direction = LEFT;
					break;
				case RIGHT_KEY_CODE:
					processType = DIRECTION;
					direction = RIGHT;
					break;
				case DOWN_KEY_CODE:
					processType = DIRECTION;
					direction = DOWN;
					break;
				}
			}
			else{
				switch (key){
				case SPACE_BAR_KEY_CODE:
					processType = DIRECT_DOWN;
				}
			}
		}
		TetrisView_ProcessGame(&tetrisView, processType, direction);
	}
	return 0;
}


1 ~ 4 라인

Main.c 파일에 필요한 헤더파일을 include 합니다.


7 라인

tetrisView 변수를 선언합니다.


8 라인

TetrisView_StartGame 함수를 호출하여 게임을 시작시킵니다.


9 라인

processType 변수를 선언합니다. (DIRECTION or DIRECT_DOWN or AUTO 를 저장할 변수)


10 라인

direction 변수를 선언합니다. (LEFT or RIGHT or UP or DOWN 을 저장할 변수)


11 라인

프로그램 진행을 무한 반복합니다.


12 ~ 13 라인

기본적으로, processType 에 AUTO 를, direction 에 DOWN 을 저장합니다. (자동으로 내려옴, 아래 방향으로)


14 라인

_kbhit 함수를 호출하여 사용자의 키 입력이 버퍼에 있는지 체크합니다.

(비동기적으로 사용자 입력이 있는지 확인하기 참고)

http://kkikkodev.tistory.com/46


15 라인

만약 사용자의 키 입력이 발견되면, _getch 함수를 호출하여 사용자의 키 값을 받아옵니다. 

(화면 출력 없이 키보드 입력 값 가져오기 참고)

http://kkikkodev.tistory.com/48


16 ~ 36 라인

상, 하, 좌, 우 방향키 처리 부분입니다. 방향키는, 입력 버퍼에 2 개의 값이 연속으로 들어가게 됩니다. 첫 번째는 0xE0 (= 224), 그리고 방향키에 대한 정수 값 이렇게 2 개가 들어가기 때문에, 두 번 입력버퍼로부터 값을 가져와서 확인해야 합니다. 16 라인에서 _kbhit 함수의 호출 후 반환값이 0 이 아니면, 상, 하, 좌, 우 방향 키 중 하나가 눌렸다는 말이기 때문에, switch ~ case 문에서 분기하여, 각각에 해당하는 processType 과 direction 을 설정합니다.


37 ~ 42 라인

버퍼에 키 값이 하나만 있다면, 스페이스바의 값인지 확인하여 processType 에 DIRECT_DOWN 을 저장합니다.


44 라인

사용자로부터 입력 받은 키의 분류 처리가 끝나면, TetrisView_ProcessGame 함수를 호출하여 테트리스 게임을 진행시킵니다. (매개변수로 tetrisView 와 processType, direction 을 넘깁니다.)




지금까지, Block -> TetrisManager -> TetrisView -> Main 의 순으로 소스 코드 분석을 해왔습니다. 각자 모듈은 데이터 저장 담당, 테트리스 실제 로직 담당, 테트리스 UI 담당 등의 자신의 role 에 충실하도록 모듈화되어 있는 것을 알 수 있습니다. 한 소스 파일에 모두 넣지 않고, 이토록 모듈화 한 이유는, 추후 유지보수를 용이하게 하고, 최대한 확장성 있게 개발하게 하고자 함입니다.

by kkikkodev 2015. 6. 12. 11:24