본문 바로가기
C언어

c언어 - 테트리스 만들기 초기 설정,4 블럭 낙하

by Big Sun 2022. 2. 12.
728x90
void init() {
	CONSOLE_CURSOR_INFO cursorInfo;
	cursorInfo.bVisible = 0;
	cursorInfo.dwSize = 1;
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursorInfo);
	srand(time(NULL));
}

콘솔창에 항상 하얀색 커서가 깜빡거리기에 이를 없애주기 위해서 SetConsoleCursorInfo함수를 사용했습니다.

srand(time(NULL))을 사용하여 RANDOM값을 추출하였습니다.

 

void randomform(void)
{
	int blockform;
	blockform = rand() % 7;
}

randomform함수를 이용해 7가지 블럭 중 랜덤으로 하나를 고릅니다.

 

이때, int blockform을 전역변수로 두어 다른 함수에서도 사용할 수 있게끔 합니다.

 

void drawblock(void)
{
	int i, j;

	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 4; j++)
		{
			if (block[blockform][rotation][i][j] == 1)
			{
				gotoxy(current_x + j * 2, current_y + i);
				printf("■");	
			}
				
		}
	}
}
bool checkcrush(int x, int y)//위치값을 받아서 그 위치에 1인지 아닌지를 판별
{
	int i, j;
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 4; j++)
		{
			if (block[blockform][rotation][i][j] == 1)
			{
				if (map[y + i][x/2 + j] == 1)
				{
					return true;// 장애물이 있다.
				}	
			}

		}
	}
	return false;// 장애물이 없다.
	
}

void dropblock(void)
{
	endT = clock();
	if ((float)(endT - startDropT) >= 800)
	{
		if (checkcrush(current_x, current_y + 1) == true) return;
		current_y++;
		startDropT = clock();
		startGroundT = clock();
		system("cls");
	}
		
}

먼저, gotoxy함수의 (x,y)좌표가 block의 배열과 반대여서 이를 주의하여야합니다.

그리고 block이 2칸을 차지하는 것도 고려하여야합니다.

map[ ][ ]을 기준으로 ==1일시에는 해당 공간에 블럭이 있는 것으로 판정했습니다.(반대의 경우는 0일때 블럭 X)

checkcrush함수를 이용하여 해당 위치에 블럭이 있는 지 없는 지를 판단한다.

따라서 이 함수는 위치를 매개변수로 받아야한다. 또한 <stdbool.h>를 사용하여 bool값을 사용하도록 하자

#include <stdbool.h>

 

int main(void)
{
	init();
	startDropT = clock();
	randomform();

	while(1)
	{
		drawmap();
		drawblock();
		dropblock();
	}
	return 0;
}

그리고 함수를 이런 순으로 배치하여 while문을 돌리면 땅바닥에 닿을 때까지 낙하한다.

자세히 설명하면,

맵을 그리고 현재 위치(미리 지정해둔)에 블럭(랜덤으로 선택된)을 그린다.

그리고 checkcrush함수를 이용해 다음에 낙하하게될 위치에 블럭유무를 확인한다.

후에 블럭이 없을 시에 블럭의 현재 위치를 이동시킨다(current_y++)

그리고 다시 처음부터 반복한다. 이렇게 하면 다음 반복시에는 블럭을 이동시킨 위치에 블럭이 그려져서

최종적으로 낙하하는 것처럼 보인다.

 

이상입니다.

728x90