마지막으로, 전체적으로 테트리스를 실행시키는 Main.c 를 분석해 보겠습니다. 먼저, 추가, 삭제, 변경 내역을 보여드리겠습니다.


[Main.c 버전 비교 (1)]


3 ~ 4 라인 (추가)

13 라인 (추가)

17 ~ 23 라인 (추가)

28 라인 (변경)

32 ~ 33 라인 (변경)

35 라인 (변경)

37 ~ 38 라인 (변경)


[Main.c 버전 비교 (2)]


40 라인 (변경)

42 ~ 43 라인 (변경)

45 라인 (변경)

50 라인 (변경)

52 라인 (추가)

53 라인 (변경)




이제는, 위에서 언급한 부분들을 분석할 차례입니다.


[Main.c]

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

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


3 ~ 4 라인 (추가)

이번 버전의 소스 파일에서 필요한 헤더파일을 include 합니다.


13 라인 (추가)

ver 0.1 에서 블럭을 내리던 방식을 (Sleep 함수 호출) 프레임 쪼개는 방식으로 바꾸기 위해서, 0.001 초마다 틱 카운트를 가져와서 저장할 변수를 선언합니다.


17 라인 (추가)

GetTickCount 함수를 호출하여 시작 지점의 틱 카운트를 얻어옵니다.


18 라인 (추가)

내부 무한 루프를 삽입하는데, 이는 틱카운트를 계속 세서 원하는 시점이 되거나, 사용자 키를 입력받았을 때를 묶어서 처리하기 위한 루프입니다.


19 ~ 23 라인 (추가)

만약, 현재 GetTickCount 함수를 호출하여 얻어온 틱 카운트에서 시작 지점의 틱 카운트를 뺀 값이 TetrisView_GetDownMilliSecond 함수를 호출하여 얻은 게임에서 사용되는 블럭 다운용 밀리세컨드보다 크면 processType 에 AUTO 를 넣고, direction 에 DOWN 을 넣고, break 로 내부 루프를 탈출합니다. (시간이 다 되어 자동으로 블럭을 내려야 하는 경우)


28 라인 (변경)

ver 0.1 에서의 switch 문을 if 문으로 변경했습니다.


32 ~ 33 라인 (변경)

ver 0.1 에서의 switch 문을 else if 문으로 변경했고, 기존에 LEFT 키 처리 부분이었는데, DOWN 키 처리로 변경하였습니다.


35 라인 (변경)

DOWN 키 처리로 변경되었기 때문에, direction 에 DOWN 을 저장합니다.


37 ~ 38 라인 (변경)

ver 0.1 에서의 switch 문을 else if 문으로 변경했고, 기존에 RIGHT 키 처리 부분이었는데, LEFT 키 처리로 변경하였습니다.


40 라인 (변경)

LEFT 키 처리로 변경되었기 때문에, direction 에 LEFT 를 저장합니다.


42 ~ 43 라인 (변경)

ver 0.1 에서의 switch 문을 else if 문으로 변경했고, 기존에 DOWN 키 처리 부분이었는데, RIGHT 키 처리로 변경하였습니다.


45 라인 (변경)

RIGHT 키 처리로 변경되었기 때문에, direction 에 RIGHT 를 저장합니다.


50, 53 라인 (변경)

ver 0.1 에서의 switch 문을 if 문으로 변경했습니다.


52 라인 (추가)

내부 루프를 빠져 나가기 위해 break 를 추가했습니다.


by kkikkodev 2015. 6. 14. 00:05