C์–ธ์–ด ํ…ŒํŠธ๋ฆฌ์Šค ์ฝ˜์†” ๊ฒŒ์ž„

๐Ÿ›  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

โ— ์–ธ์–ด(Language) : C
โ— ๊ฐœ๋ฐœ ๋„๊ตฌ(IDE) : Visual Studio
โ— ์šด์˜์ฒด์ œ(OS) : Windows

์„ค๊ณ„ ๋ฐ ๊ตฌ์กฐ

โ— Main.c : ๊ฒŒ์ž„ ๋ฃจํ”„ ๋ฐ ์ „์ฒด ํ๋ฆ„ ์ œ์–ด
โ— Console.c : ์ฝ˜์†” ์ปค์„œ ์ œ์–ด ๋ฐ ์ถœ๋ ฅ ๊ด€๋ จ ํ•จ์ˆ˜
โ— Data.c : ๋ธ”๋ก ๋ฐ์ดํ„ฐ, ์ ์ˆ˜ ์ฒ˜๋ฆฌ
โ— Tetris.h : ์ „์—ญ ์ƒ์ˆ˜ ๋ฐ ํ•จ์ˆ˜ ์„ ์–ธ

ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„

โœ… ์ž๋™ ๋ธ”๋ก ํ•˜๊ฐ• : ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ๋ธ”๋ก์ด ํ•œ ์นธ์”ฉ ๋‚ด๋ ค๊ฐ

if (check_time()) // ํ™”๋ฉด๊ฐฑ์‹ ์‹œ๊ฐ„์— ๋„๋‹ฌํ•˜๋ฉด
		key = DOWNKEY; // ์•„๋ž˜์ชฝ์œผ๋กœ ์ทจ๊ธ‰

โœ… ์ขŒ์šฐ ์ด๋™ ํšŒ์ „ : ๋ฐฉํ–ฅํ‚ค๋กœ ๋ธ”๋ก์„ ์ž์œ ๋กญ๊ฒŒ ์ด๋™ ๋ฐ ํšŒ์ „ ๊ฐ€๋Šฅ

// ์ž…๋ ฅ์— ๋”ฐ๋ผ ๋ธ”๋ก์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ํšŒ์ „
int process_event(int key)
{
	int addy; // ๊ณต๋ฐฑํ‚ค ์ฒ˜๋ฆฌ ๋ณ€์ˆ˜
	int ret = 0; // ๋ฆฌํ„ด๊ฐ’
	if (check_time()) // ํ™”๋ฉด๊ฐฑ์‹ ์‹œ๊ฐ„์— ๋„๋‹ฌํ•˜๋ฉด
		key = DOWNKEY; // ์•„๋ž˜์ชฝ์œผ๋กœ ์ทจ๊ธ‰
	switch (key)
	{
	case RIGHTKEY:
		if (can_move(blockx + 1, blocky, current_block, block_rotation)) // ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉด
		{
			delete_block(blockx, blocky, current_block, block_rotation); // ์ง€์šฐ๊ณ 
			blockx += 1; // ์˜ฎ๊ธฐ๊ณ 
			draw_block(blockx, blocky, current_block, block_rotation); // ๋‹ค์‹œ ๊ทธ๋ฆผ
		}
		break;
	case LEFTKEY:
		if (can_move(blockx - 1, blocky, current_block, block_rotation)) // ์™ผ์ชฝ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉด
		{
			delete_block(blockx, blocky, current_block, block_rotation); // ์ง€์šฐ๊ณ 
			blockx -= 1; // ์˜ฎ๊ธฐ๊ณ 
			draw_block(blockx, blocky, current_block, block_rotation); // ๋‹ค์‹œ ๊ทธ๋ฆผ
		}
		break;
	case UPKEY:
		if (can_move(blockx, blocky, current_block, (block_rotation + 1) % 4)) // ํšŒ์ „
		{
			delete_block(blockx, blocky, current_block, block_rotation); // ์ง€์šฐ๊ณ 
			block_rotation = (block_rotation + 1) % 4;
			draw_block(blockx, blocky, current_block, block_rotation); // ๋‹ค์‹œ ๊ทธ๋ฆผ
		}
		break;
	case DOWNKEY:
		if (can_move(blockx, blocky + 1, current_block, block_rotation)) // ์•„๋ž˜์ชฝ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉด
		{
			delete_block(blockx, blocky, current_block, block_rotation); // ์ง€์šฐ๊ณ 
			blocky = blocky + 1;
			draw_block(blockx, blocky, current_block, block_rotation); // ๋‹ค์‹œ ๊ทธ๋ฆผ
		}
		else // ๋ธ”๋ก์ด ๋งจ๋ฐ‘์ด๋ฉด
		{
			set_block(blockx, blocky, current_block, block_rotation);
			ret = 1; // 1 ๋ฆฌํ„ด
		}
		break;
	case SPACE:
		addy = blocky;

		do {
			addy = addy + 1;
		} while (can_move(blockx, addy, current_block, block_rotation));

		delete_block(blockx, blocky, current_block, block_rotation);
		blocky = addy - 1;
		draw_block(blockx, blocky, current_block, block_rotation);
		set_block(blockx, blocky, current_block, block_rotation);
		ret = 1;
	default:
		break;
	}
	return ret;
}

โœ… ๋ผ์ธ ์‚ญ์ œ ๊ธฐ๋Šฅ : ๊ฐ€๋“ ์ฐฌ ๋ผ์ธ์„ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๊ณ  ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐ

// ๊ฒŒ์ž„ํŒ์—์„œ ํ•œ ์ค„ ๋ผ์ธ์„ ์ฐพ์•„ ์ง€์šฐ๊ณ , ์ ์ˆ˜ ๋ฐ ๋ ˆ๋ฒจ์„ ์—…๋ฐ์ดํŠธ
int check_line()
{
	int dlines = 0;
	int checky, checkx; // ๊ฒŒ์‹œํŒ ์ขŒํ‘œ
	int filled; // ํ•œ ๋ผ์ธ์— ๋ธ”๋Ÿญ ์กฐ๊ฐ ์ฑ„์›Œ์ง„ ์ˆ˜
	checky = blocky + 4; // ๋ผ์ธ ๊ฒ€์‚ฌ ์ดˆ๊ธฐ๊ฐ’

	do
	{
		if (checky >= PLATEY) // ๋ผ์ธ์ด ๋ฐ”๊นฅ์ด๋ฉด
			checky -= 1; // ํ•œ ์ค„ ์œ„๋ฅผ ๊ฒ€์‚ฌ
		else
		{
			filled = 0; // ๋ผ์ธ ๋‚ด ๋ธ”๋Ÿญ ์กฐ๊ฐ ์ˆ˜ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
			for (checkx = 1; checkx < PLATEX - 1; checkx++)
				if (game_plate[checky][checkx] == 1) // ํ•œ์ค„์— ๋Œ€ํ•˜์—ฌ ๋ธ”๋ก ์กฐ๊ฐ ์ˆ˜๋ฅผ ์…ˆ
					filled += 1;
			if (filled == PLATEX - 2) // ํ•œ์ค„ ๋‹ค ์ฑ„์šฐ๋ฉด
			{
				move_block(checky); // ์œ„์ชฝ ๋ธ”๋ก์„ ์˜ฎ๊น€
				game_score += 10;
				dlines += 1;
			}
			else
				checky -= 1; // ์•„๋‹ˆ๋ฉด ์œ—์ค„ ๊ฒ€์‚ฌ
		}

	} while (checky >= blocky);
	if (dlines > 0) // ์ง€์›Œ์ง„ ๋ผ์ธ์ด ํ•œ ๊ฐœ ์ด์ƒ์ด๋ฉด
	{
		game_score += (dlines - 1) * 4;
		deleted_lines += dlines;
		game_level = deleted_lines / 4 + 1; // ๊ฒŒ์ž„ ๋ ˆ๋ฒจ ์„ค์ •
		if (game_level > 9)
			game_level = 9;
		block_delay = 500 - (50 * (game_level - 1)); // ํ™”๋ฉด๊ฐฑ์‹  ์‹œ๊ฐ„ ์กฐ์ •
		print_score(game_score);
		print_level(game_level);

		if (game_high_score < game_score)
		{
			game_high_score = game_score;
		}
		print_high_score(game_high_score);
	}
	if ((checky <= 1) && (filled != 0))
		return 1;
	else
		return 0;
}

โœ… ๊ฒŒ์ž„ ์˜ค๋ฒ„ ํŒ์ • : ๋ธ”๋ก์ด ํ™”๋ฉด ์ƒ๋‹จ์— ๋„๋‹ฌํ•˜๋ฉด ๊ฒŒ์ž„ ์ข…๋ฃŒ

	if ((checky <= 1) && (filled != 0))
		return 1;
	else
		return 0;

โœ… ์ตœ๊ณ  ์ ์ˆ˜(High Score) : ์ ์ˆ˜ ์ €์žฅ ๋ฐ ์ฝ˜์†” ํ™”๋ฉด์— ์ถœ๋ ฅ

void print_high_score(int high_score)
{
	char buf[10];

	sprintf(buf, "%4d", high_score);
	print_at(48, 20, buf);
}

โœ… NEXT ๋ธ”๋Ÿญ ํ‘œ์‹œ : ๋‹ค์Œ์— ๋‚˜์˜ฌ ๋ธ”๋Ÿญ์„ ์˜ค๋ฅธ์ชฝ ํŒจ๋„์— ์‹œ๊ฐ์ ์œผ๋กœ ์ถœ๋ ฅ

// ๋‹ค์Œ์— ๋ธ”๋Ÿญ์„ ์˜ˆ์ƒํ•ด์„œ ์ถœ๋ ฅ
void get_nextblock()
{
	// ์˜ˆ๊ณ ๋œ ๋ธ”๋ก์˜ ๊ทธ๋ฆผ์ž๋ฅผ ์ง€์šฐ๊ณ 
	textcolor(15); delete_block(20, 8, next_block, 0);

	// ์˜ˆ๊ณ ๋œ ๋ธ”๋ก์„ ๋žœ๋ค์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์ถœ๋ ฅ
	next_block = rand() % 18;
	textcolor(15); draw_block(20, 8, next_block, 0);
}
// ๋‹ค์Œ ๋ธ”๋Ÿญ ์ถœ๋ ฅ๋  ๊ณต๊ฐ„
char* nextblock[9] = {
	"  NEXT Block ",
	"โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ–  ",
	"โ–                โ–  ",
	"โ–                โ–  ",
	"โ–                โ–  ",
	"โ–                โ–  ",
	"โ–                โ–  ",
	"โ–                โ–  ",
	"โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ– โ–  "
};
// ๋‹ค์Œ ๋ธ”๋Ÿญ, ์ดˆ๊ธฐํ™”๋ฉด, ์ ์ˆ˜ ์ถœ๋ ฅ
void init_screen()
{
	int n = 0;

	for (n = 0; n < 9; n++)
	{
		textcolor(15); print_at(18 * 2, 5 + n, nextblock[n]); // ๋‹ค์Œ ๋ธ”๋ก ์˜ˆ๊ณ 
		textcolor(15); print_at(28 * 2, 5 + n, gamemenu[n]); // ๊ฒŒ์ž„ ๋ฉ”๋‰ด
	}
	textcolor(15); print_at(18 * 2, 18, "     LEVEL : ");
	textcolor(15); print_at(18 * 2, 19, "     SCORE : ");
	textcolor(15); print_at(18 * 2, 20, "HIGH SCORE : ");
}

โœ… ๊ฒŒ์ž„ ์‹œ๊ฐ„ ํ‘œ์‹œ : ํ”Œ๋ ˆ์ด ํƒ€์ด๋จธ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฝ˜์†”์— ์ถœ๋ ฅ

void myClock() {
	int hour = 0, minute = 0, second = 0, i = 0;

	while (1) {
		if (state != GAMEOVER) {
			second++;

			if (second == 60) {
				second = 0;
				minute++;
			}

			if (minute == 60) {
				minute = 0;
				hour++;
			}

			if (hour == 24) {
				hour = 0;
			}

			gotoxy(36, 0);
			printf("%02d:%02d:%02d", hour, minute, second);
			Sleep(1000);

			for (i = 1; i <= minute; i++) {
				if (game_score <= i * 100) {
					textcolor(12);
					print_at(8, 10, "โ€ป GAME OVER โ€ป");
					state = GAMEOVER;
					break;
				}
			}
		}
		else {
			if (key == ENTER) {
				hour = 0;
				minute = 0;
				second = 0;
			}
		}
	}
}
HANDLE hClockThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)myClock, NULL, 0, NULL);

โœ… ๊ฒŒ์ž„ ๋ ˆ๋ฒจ ๋ฐ ์†๋„ ์กฐ์ ˆ : ์ ์ˆ˜ ๋˜๋Š” ๋ผ์ธ ์ˆ˜์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์†๋„ ์ฆ๊ฐ€

if (dlines > 0) // ์ง€์›Œ์ง„ ๋ผ์ธ์ด ํ•œ ๊ฐœ ์ด์ƒ์ด๋ฉด
{
    game_score += (dlines - 1) * 4;   // ์ถ”๊ฐ€ ์ ์ˆ˜
    deleted_lines += dlines;           // ์ง€์›Œ์ง„ ๋ผ์ธ ์ˆ˜ ๋ˆ„์ 
    game_level = deleted_lines / 4 + 1; // ๋ ˆ๋ฒจ ๊ณ„์‚ฐ (4๋ผ์ธ๋งˆ๋‹ค 1๋ ˆ๋ฒจ ์ฆ๊ฐ€)
    if (game_level > 9)
        game_level = 9;               // ์ตœ๋Œ€ ๋ ˆ๋ฒจ ์ œํ•œ
    block_delay = 500 - (50 * (game_level - 1)); // ๋ธ”๋ก ๋–จ์–ด์ง€๋Š” ์†๋„ ์กฐ์ ˆ
    print_score(game_score);          // ์ ์ˆ˜ ์ถœ๋ ฅ
    print_level(game_level);          // ๋ ˆ๋ฒจ ์ถœ๋ ฅ

    if (game_high_score < game_score)
    {
        game_high_score = game_score;
    }
    print_high_score(game_high_score); // ์ตœ๊ณ  ์ ์ˆ˜ ์ถœ๋ ฅ
}

โœ… ํ…์ŠคํŠธ ์ƒ‰์ƒ ์ ์šฉ : ๋ธ”๋Ÿญ๊ณผ UI ํ…์ŠคํŠธ์— ์ƒ‰์ƒ์„ ์ž…ํ˜€ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

// ํ…์ŠคํŠธ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜
// ์œˆ๋„์šฐ์ฆˆ ํ—ค๋”ํŒŒ์ผ ์‚ฌ์šฉ
void textcolor(int color_number) {
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color_number);
}
// ์ƒ‰์ƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์—ด๊ฑฐํ˜• ๊ตฌ์กฐ์ฒด
typedef enum Color {
	GRAY = 8,
	WHITE = 15
} COLOR;
// ์ƒ‰์ƒ์„ ์œ ์ง€ํ•˜๋ฉด์„œ "โ– "์„ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜
void colorRetention(int colorType) {
	// ๋งŒ์•ฝ colorType์ด 1์ด๋ฉด
	if (colorType == 1) {
		textcolor(GRAY); // ํ…์ŠคํŠธ ์ƒ‰์ƒ์„ ํšŒ์ƒ‰(GRAY)์œผ๋กœ ๋ณ€๊ฒฝ
		printf("โ– ");    // "โ– " ์ถœ๋ ฅ
		textcolor(WHITE); // ํ…์ŠคํŠธ ์ƒ‰์ƒ์„ ํฐ์ƒ‰(WHITE)์œผ๋กœ ๋ณ€๊ฒฝ
	}
}

โœ… ์ œํ•œ ์‹œ๊ฐ„ : ์ œํ•œ ์‹œ๊ฐ„ ์•ˆ์— ๋ชฉํ‘œ ์ ์ˆ˜ ๋ฏธ๋‹ฌ ์‹œ ๊ฒŒ์ž„ ์ข…๋ฃŒ

for (i = 1; i <= minute; i++) {
    if (game_score <= i * 100) {     // ์ œํ•œ ์‹œ๊ฐ„(๋ถ„)๋งˆ๋‹ค ๋ชฉํ‘œ ์ ์ˆ˜ ์ฒดํฌ
        textcolor(12);
        print_at(8, 10, "โ€ป GAME OVER โ€ป");
        state = GAMEOVER;            // ๊ฒŒ์ž„ ์ข…๋ฃŒ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
        break;
    }
}

โœ… ๊ทธ๋ฆผ์ž ๋ธ”๋Ÿญ : ๋ธ”๋Ÿญ์ด ๋–จ์–ด์งˆ ์œ„์น˜๋ฅผ ๋ฏธ๋ฆฌ ๋ณด์—ฌ์ฃผ์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์ฐฉ์ง€ ์œ„์น˜๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ๋ธ”๋ก ๊ทธ๋ฆฌ๊ธฐ
void draw_block(int sx, int sy, int btype, int rotation)
{
	int bx, by;

	for (by = 0; by < 4; by++) // ๋ธ”๋ก๋‚ด๋ถ€ y์ถ•
		for (bx = 0; bx < 4; bx++) // ๋ธ”๋ก๋‚ด๋ถ€ x์ถ•
			if (tet_block[btype][rotation][by][bx] == 1) // ๊ฐ’์ด 1์ธ ์œ„์น˜์—
				PUT_BS(2 * (sx + bx), sy + by); // ๊ฒ€์€ ๋ธ”๋ก

	// ๊ทธ๋ฆผ์ž ๋ธ”๋ก ๊ทธ๋ฆฌ๊ธฐ
	if (sx != 20 || sy != 8) {
		if (can_move(sx, sy + 1, btype, rotation)) {
			shadow_blockx = sx; // ๊ทธ๋ฆผ์ž์˜ x์ขŒํ‘œ๋Š” ํ˜„์žฌ ๋ธ”๋ก์˜ x์ขŒํ‘œ์™€ ๋™์ผํ•˜๊ฒŒ ์„ค์ •
			shadow_blocky = sy;

			while (can_move(shadow_blockx, shadow_blocky + 1, btype, rotation)) {
				shadow_blocky++; // ๊ทธ๋ฆผ์ž๋ฅผ ์•„๋ž˜๋กœ ์ด๋™
			}

			// ๋ฉ”๋‰ด ์ฐฝ ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋Š”์ง€ ํ™•์ธ ํ›„ ๊ทธ๋ฆฌ๊ธฐ
			for (by = 0; by < 4; by++)
				for (bx = 0; bx < 4; bx++)
					if (tet_block[btype][rotation][by][bx] == 1)
						PUT_SS(2 * (shadow_blockx + bx), shadow_blocky + by);
		}
	}

}

// ๋ธ”๋ก ์ง€์šฐ๊ธฐ
void delete_block(int sx, int sy, int btype, int rotation)
{
	int bx, by;

	for (by = 0; by < 4; by++) // ๋ธ”๋ก๋‚ด๋ถ€ y์ถ•
		for (bx = 0; bx < 4; bx++) // ๋ธ”๋ก๋‚ด๋ถ€ x์ถ•
			if (tet_block[btype][rotation][by][bx] == 1) // ๊ฐ’์ด 1์ธ ์œ„์น˜์—
				print_at(2 * (sx + bx), sy + by, "  "); // ๊ณต๋ฐฑ ์ถœ๋ ฅ

	// ๊ทธ๋ฆผ์ž ๋ธ”๋Ÿญ ์‚ญ์ œ
	if (sx != 20 || sy != 8) {
		shadow_blockx = sx; // ๊ทธ๋ฆผ์ž์˜ x์ขŒํ‘œ๋Š” ํ˜„์žฌ ๋ธ”๋ก์˜ x์ขŒํ‘œ์™€ ๋™์ผํ•˜๊ฒŒ ์„ค์ •
		shadow_blocky = sy;

		while (can_move(shadow_blockx, shadow_blocky + 1, btype, rotation)) {
			shadow_blocky++; // ๊ทธ๋ฆผ์ž๋ฅผ ์•„๋ž˜๋กœ ์ด๋™
		}

		for (by = 0; by < 4; by++)
			for (bx = 0; bx < 4; bx++)
				if (tet_block[btype][rotation][by][bx] == 1)
					print_at(2 * (shadow_blockx + bx), shadow_blocky + by, "  "); // ๋ธ”๋ก์„ ์‚ญ์ œํ•˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ (์ ์ ˆํ•œ ํ•จ์ˆ˜๋ช…์œผ๋กœ ๋ณ€๊ฒฝ ํ•„์š”)
	}
}

๋””๋ฒ„๊น… [๊ฒŒ์ž„ ์‹œ๊ฐ„ ํ‘œ์‹œ ์‹œ ๋ฉ”์ธ ๋ฃจํ”„ ์ •์ง€ ์—๋Ÿฌ]

๊ฒŒ์ž„ ๋‚ด ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ ์ค‘์— ๊ฒŒ์ž„ ์‹œ์ž‘์‹œ ์ฝ˜์†”์ฐฝ์ด ๋ฉˆ์ถ”๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

์ ์œ ๋œ ์Šค๋ ˆ๋“œ

๊ฒŒ์ž„ ๋‚ด ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด myClock() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ ์œ ํ•ด๋ฒ„๋ฆผ

์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ

myClock() ํ•จ์ˆ˜๋ฅผ ๋ฉ”์ธ ๋ฃจํ”„์™€ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก, CreateThread()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰๋˜๋„๋ก ์ˆ˜์ •

์ด๋ฅผ ํ†ตํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๊ฒŒ์ž„ ์ง„ํ–‰(์ž…๋ ฅยท์ด๋™ยทํ™”๋ฉด ๊ฐฑ์‹ )์„ ๋‹ด๋‹นํ•˜๊ณ , ๋ณด์กฐ ์Šค๋ ˆ๋“œ๋Š” ๊ฒฝ๊ณผ ์‹œ๊ฐ„์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ธก์ • ๋ฐ ์ถœ๋ ฅํ•˜๊ฒŒ ๋จ

์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์Šค๋ ˆ๋“œ

์‹คํ–‰ ํ™”๋ฉด

์‹œ์ž‘ํ™”๋ฉด

Tetris_Game ์ฝ˜์†”์ฐฝ ๋ฉ”์ธ ์‹คํ–‰ ์ฐฝ

๊ฒŒ์ž„ ์ค‘ ํ™”๋ฉด

Tetris_Game ์‹คํ–‰ ํ™”๋ฉด

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ