1-1. C/C++ Console 테트리스를 만들어보자!!(Console 기본 함수들 )
본격적인 시작에 앞서서 가장 기본적인 화면 출력에 대해서 알아볼려고 합니다.
C 언어를 다룬 경험이 있다면 printf( )를 사용하여 출력한 경험이 있을 것이고, C++를 다룬 적이 있다면 std::cout<<"Blah~Blah"<<... 와 같은 형태로 결과를 출력한 경험이 있을 것입니다.
출력에 있어서 저는 printf( ) 함수를 사용하였습니다. 사실 하나의 프로그램을 짜는 데 있어서 두 가지 이상의 언어를 사용하는 것이 바람직하지는 않습니다. 다만 C, C++ 둘 모두를 살짝씩 맛본 입장에서 출력에 있어서는 C의 printf( ) 가 좀더 사용하기는 편하게 느껴졌습니다. 참고로 출력에 있어서는 C 언어 함수를 사용하였지만, 대부분은 C++로 구현하였습니다.
화면 출력에 대해서는 사실 할 말이 많지는 않습니다. 굳이 내부적인 작용을 익힐 필요도 없고, 그래서 간단하게만 짚고 넘어가려 합니다.
출력에 있어서 기본이 되는 함수는 printf( ), gotoXY(int X, int Y), changeCursorColor(int color) 3 개와 콘솔창과 커서의 속성을 결정하는 함수 makeCursorInvisible( ), system( ) 2개 정도를 꼽을 수 있겠습니다.
1. printf( ) : C 에서 너무나도 자주 사용하였던 기본적인 출력 함수
printf("Blah~Blah~", )
2. gotoXY(int x, int y) : 커서의 위치를 바꾸는 함수입니다. 배열과 유사하게 (0, 0)에서 시작하며 x 가 가로 방향 좌표, y 가 세로 방향 좌표를 나타냅니다. 이번 printf( ) 함수와 페어로 이루어져서 사용되는 경우가 많습니다.
void gotoXY(int x, int y) {
COORD Pos;
Pos.X = x;
Pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
3. changeCursorColor(int color) : 글자색을 변경하는 함수, 블록의 색을 입힐 때 사용을 하였습니다. 블록의 색은 이미 컴퓨터 상에 저장되어 있습니다. 저는 보다 직관적으로 사용하기 편하게 색에 대한 상수를 미리 정의해 두고 사용하였습니다.
void changeCursorColor(int color) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
4. makeCursorInvisible( ) : 게임을 할때 거슬리지 않도록 커서를 보이지 않게 설정합니다.
void makeCursorInvisible() {
HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO info;
info.dwSize = 100;
info.bVisible = FALSE;
SetConsoleCursorInfo(consoleHandle, &info);
}
5. system( ) : 콘솔창의 크기를 설정할 때 사용합니다. (적어도 이 프로젝트에서는 말이죠!!) 참고로 행과 열의 크기를 정할 때, 밑의 예처럼 붙혀 써야 합니다!!
system("mode con cols=100 lines=100");
4번, 5번 함수의 경우 처음 설정하는 것 외에는 사용하지 않았습니다. 많이 사용되는 것은 1번~3번 함수입니다. 출력하는 방법은 간단합니다. 콘솔 상에 글자를 출력하고 싶어하는 위치로 가기 위해 gotoXY(int x, int y) 함수를 사용하고, 원하는 색으로 출력하기 위해 changeCursorColor(int color)를 사용한 후 최종적으로 printf( )를 사용하여 출력하는 방식입니다. 블록의 이동을 표현하는 경우 이전 위치의 블록을 지우고 이동한 위치의 블록을 다시 출력하는 방식을 사용하였습니다.
//1번~3번 함수 활용 예시입니다.
//앞으로 떨어질 테트리스 블록을 미리 보여 주기 위해 사용되는 함수 입니다.
void printOutBlockShow(int blockType, int color) {
for (int i = 12; i < 17; i++) {
for (int j = 1; j < 6; j++) {
printOutBlank(i, j); // gotoXY() + printf("BLANK")
}
}
for (int i = 0; i < 4; i++) {
printOutBlock(BLOCKSHOW_X+BLOCKTYPE[blockType][0][i].posX,
BLOCKSHOW_Y + BLOCKTYPE[blockType][0][i].posY, color);
// gotoXY() + changeCursorColor(int color) + printf("BLOCK")
}
}
이 것으로 이번 포스팅을 마칩니다. 좋은 하루 되세요!!