[TetrisView 클래스의 Class Diagram]


테트리스의 화면 처리 및 프로그램의 큰 흐름을 담당하는 클래스인 TetrisView 에 대해 살펴보겠습니다. TetrisView.h 와 TetrisView.c 에서 변경된 부분 위주로 설명드리겠습니다. 먼저, 추가, 삭제, 변경 이력에 대해 언급드리겠습니다.


[TetrisView.h 버전 비교]


13 라인 (추가)


[TetrisView.c 버전 비교]


45 라인 (삭제)

58 ~ 59 라인 (추가)




이제는 위에서 언급한 부분들을 분석해 보겠습니다.


[TetrisView.h]

#ifndef _TETRIS_VIEW_H
#define _TETRIS_VIEW_H

#include "TetrisManager.h"

typedef struct _tetrisView{
	TetrisManager tetrisManager;
}TetrisView;

void TetrisView_StartGame(TetrisView* tetrisView);
void TetrisView_ProcessGame(TetrisView* tetrisView, int processType, int direction);
void TetrisView_EndGame(TetrisView* tetrisView);
DWORD TetrisView_GetDownMilliSecond(TetrisView* tetrisView); //make temporarily for calling from main function

#endif


13 라인 (추가)

TetrisView_GetDownMilliSecond 함수의 선언부입니다.


[TetrisView.c]

#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#include "TetrisView.h"
#include "TetrisManager.h"
#include "Constant.h"

#pragma comment(lib, "winmm.lib")

#define TETRIS_BACKGROUND_MUSIC_FILE_NAME "..\\res\\tetris_background_music.wav"

void TetrisView_StartGame(TetrisView* tetrisView){
	int speedLevel;
	PlaySound(TEXT(TETRIS_BACKGROUND_MUSIC_FILE_NAME), NULL, SND_ASYNC | SND_LOOP);
	printf("***** Tetris *****\nSpeed level (1 ~ 10) : ");
	scanf_s("%d", &speedLevel);
	if (speedLevel > MAX_SPEED_LEVEL || speedLevel < MIN_SPEED_LEVEL){
		speedLevel = MIN_SPEED_LEVEL;
	}
	TetrisManager_Init(&tetrisView->tetrisManager, speedLevel);
	TetrisManager_Print(&tetrisView->tetrisManager);
}

void TetrisView_ProcessGame(TetrisView* tetrisView, int processType, int direction){
	if (processType == DIRECTION){
		TetrisManager_ChangeBoardByDirection(&tetrisView->tetrisManager, direction);
	}
	else if (processType == DIRECT_DOWN){
		TetrisManager_ProcessDirectDown(&tetrisView->tetrisManager);
	}
	else if (processType == AUTO){
		TetrisManager_ChangeBoardByAuto(&tetrisView->tetrisManager);
	}
	if (TetrisManager_IsReachedToBottom(&tetrisView->tetrisManager)){
		//if you are going to move the block which has bottom wall or bottom fixed block, permit the block to move the direction
		if (processType == DIRECTION && direction == LEFT && (TetrisManager_CheckValidPosition(&tetrisView->tetrisManager, LEFT) == EMPTY) || 
			processType == DIRECTION && direction == RIGHT && (TetrisManager_CheckValidPosition(&tetrisView->tetrisManager, RIGHT) == EMPTY)){
			TetrisManager_ChangeBoardByDirection(&tetrisView->tetrisManager, direction);
		}
		if (TetrisManager_ProcessReachedCase(&tetrisView->tetrisManager) == END){
			TetrisView_EndGame(tetrisView);
		}
	}
	TetrisManager_ProcessDeletingLines(&tetrisView->tetrisManager);
	TetrisManager_Print(&tetrisView->tetrisManager);
}

void TetrisView_EndGame(TetrisView* tetrisView){
	PlaySound(NULL, 0, 0);
	system("cls");
	printf("***** End *****\n%d level / %d lines deleted\n",
		tetrisView->tetrisManager.speedLevel,
		tetrisView->tetrisManager.deletedLineCount);
	system("pause");
	exit(-1);
}

DWORD TetrisView_GetDownMilliSecond(TetrisView* tetrisView){
	return TetrisManager_GetDownMilliSecond(&tetrisView->tetrisManager);
}


45 라인 (삭제)

기존 버전에서 processType 이 AUTO 일 경우에 TetrisManager_Sleep 함수를 호출하던 부분을 제거하였습니다.


58 라인 (추가)

TetrisView_GetDownMilliSecond 함수의 정의부입니다. 이 함수에서는, TetrisManager_GetDownMilliSecond 함수를 호출하여 얻은 반환값을 다시 반환합니다.


59 라인 (추가)

TetrisManager_GetDownMilliSecond 함수를 호출하여, 게임에서 현재 블럭을 얼마만큼 지연시킨 후 밑으로 이동시켜야 하는지를 밀리세컨드로 계산하여 반환합니다.


by kkikkodev 2015. 6. 13. 23:32