글
마지막으로, 전체적으로 테트리스를 실행시키는 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 에 충실하도록 모듈화되어 있는 것을 알 수 있습니다. 한 소스 파일에 모두 넣지 않고, 이토록 모듈화 한 이유는, 추후 유지보수를 용이하게 하고, 최대한 확장성 있게 개발하게 하고자 함입니다.
'1.2) 프로젝트 > 테트리스' 카테고리의 다른 글
테트리스 ver 0.2 (4) - 소스코드 변경 내역 (0) | 2015.06.13 |
---|---|
테트리스 ver 0.2 (3) - 프로그램 설계 (Use Case, Class, Sequence) (0) | 2015.06.12 |
테트리스 ver 0.2 (2) - 요구사항 분석 (0) | 2015.06.12 |
테트리스 ver 0.2 (1) - 실행 결과 & 프로젝트 개요 (0) | 2015.06.12 |
테트리스 ver 0.1 (10) - 개발 완료 / 후기 (0) | 2015.06.12 |
테트리스 ver 0.1 (8) - 소스코드 구현 (TetrisView) (0) | 2015.06.12 |
테트리스 ver 0.1 (7) - 소스코드 구현 (TetrisManager) (0) | 2015.06.12 |
테트리스 ver 0.1 (6) - 소스코드 구현 (Block) (0) | 2015.06.12 |
테트리스 ver 0.1 (5) - 소스코드 구현 (Util) (0) | 2015.06.12 |
테트리스 ver 0.1 (4) - 소스코드 구현 (Constant) (0) | 2015.06.12 |
RECENT COMMENT