An open API service indexing awesome lists of open source software.

https://github.com/gunh0/PlayTetrisByC

๐Ÿ•น Making of Tetris Game in C
https://github.com/gunh0/PlayTetrisByC

console-game tetris-game visual-studio

Last synced: over 1 year ago
JSON representation

๐Ÿ•น Making of Tetris Game in C

Awesome Lists containing this project

README

          

# PlayTetrisByC

### Environment

- Windows
- Microsoft Visual Studio


### Screenshot







> **Best Score by https://github.com/melli0505 (2019.10.28)**


### Code Detail

```c++
#define _CRT_NONSTDC_NO_WARNINGS // ๋น„ํ‘œ์ค€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์—๋Ÿฌ ๋ฐฉ์ง€
#define _CRT_SECURE_NO_WARNINGS // scanf ๋ณด์•ˆ ๊ฒฝ๊ณ ๋กœ ์ธํ•œ ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐฉ์ง€
#include
#include
#include
#include
#include

#define LEFT 75 //์ขŒ๋กœ ์ด๋™ //ํ‚ค๋ณด๋“œ๊ฐ’๋“ค
#define RIGHT 77 //์šฐ๋กœ ์ด๋™
#define UP 72 //ํšŒ์ „
#define DOWN 80 //soft drop
#define SPACE 32 //hard drop
#define p 112 //์ผ์‹œ์ •์ง€
#define P 80 //์ผ์‹œ์ •์ง€
#define ESC 27 //๊ฒŒ์ž„์ข…๋ฃŒ

#define false 0
#define true 1

#define ACTIVE_BLOCK -2 // ๊ฒŒ์ž„ํŒ๋ฐฐ์—ด์— ์ €์žฅ๋  ๋ธ”๋ก์˜ ์ƒํƒœ๋“ค
#define CEILLING -1 // ๋ธ”๋ก์ด ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์€ 0 ๋˜๋Š” ์Œ์˜ ์ •์ˆ˜๋ฃŒ ํ‘œํ˜„
#define EMPTY 0 // ๋ธ”๋ก์ด ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๊ณต๊ฐ„์€ ์–‘์ˆ˜๋กœ ํ‘œํ˜„
#define WALL 1
#define INACTIVE_BLOCK 2 // ์ด๋™์ด ์™„๋ฃŒ๋œ ๋ธ”๋ก๊ฐ’

#define MAIN_X 11 //๊ฒŒ์ž„ํŒ ๊ฐ€๋กœํฌ๊ธฐ
#define MAIN_Y 23 //๊ฒŒ์ž„ํŒ ์„ธ๋กœํฌ๊ธฐ
#define MAIN_X_ADJ 3 //๊ฒŒ์ž„ํŒ ์œ„์น˜์กฐ์ •
#define MAIN_Y_ADJ 1 //๊ฒŒ์ž„ํŒ ์œ„์น˜์กฐ์ •

#define STATUS_X_ADJ MAIN_X_ADJ+MAIN_X+1 //๊ฒŒ์ž„์ •๋ณดํ‘œ์‹œ ์œ„์น˜์กฐ์ •

int STATUS_Y_GOAL; //GOAL ์ •๋ณดํ‘œ์‹œ์œ„์น˜Y ์ขŒํ‘œ ์ €์žฅ
int STATUS_Y_LEVEL; //LEVEL ์ •๋ณดํ‘œ์‹œ์œ„์น˜Y ์ขŒํ‘œ ์ €์žฅ
int STATUS_Y_SCORE; //SCORE ์ •๋ณดํ‘œ์‹œ์œ„์น˜Y ์ขŒํ‘œ ์ €์žฅ

int blocks[7][4][4][4] = {
{ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 } },
{ { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
{ { 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0 } },
{ { 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0 } },
{ { 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0 } },
{ { 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0 }, { 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
{ { 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0 } }
}; //๋ธ”๋ก๋ชจ์–‘ ์ €์žฅ 4*4๊ณต๊ฐ„์— ๋ธ”๋ก์„ ํ‘œํ˜„ blcoks[b_type][b_rotation][i][j]๋กœ ์‚ฌ์šฉ

int b_type; //๋ธ”๋ก ์ข…๋ฅ˜๋ฅผ ์ €์žฅ
int b_rotation; //๋ธ”๋ก ํšŒ์ „๊ฐ’ ์ €์žฅ
int b_type_next; //๋‹ค์Œ ๋ธ”๋ก๊ฐ’ ์ €์žฅ

int main_org[MAIN_Y][MAIN_X]; //๊ฒŒ์ž„ํŒ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด ๋ชจ๋‹ˆํ„ฐ์— ํ‘œ์‹œํ›„์— main_cpy๋กœ ๋ณต์‚ฌ๋จ
int main_cpy[MAIN_Y][MAIN_X]; //์ฆ‰ maincpy๋Š” ๊ฒŒ์ž„ํŒ์ด ๋ชจ๋‹ˆํ„ฐ์— ํ‘œ์‹œ๋˜๊ธฐ ์ „์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
//main์˜ ์ „์ฒด๋ฅผ ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ์— ํ‘œ์‹œํ•˜์ง€ ์•Š๊ณ (์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋‹ˆํ„ฐ๊ฐ€ ๊นœ๋นก๊ฑฐ๋ฆผ)
//main_cpy์™€ ๋ฐฐ์—ด์„ ๋น„๊ตํ•ด์„œ ๊ฐ’์ด ๋‹ฌ๋ผ์ง„ ๊ณณ๋งŒ ๋ชจ๋‹ˆํ„ฐ์— ๊ณ ์นจ
int bx, by; //์ด๋™์ค‘์ธ ๋ธ”๋ก์˜ ๊ฒŒ์ž„ํŒ์ƒ์˜ x,y์ขŒํ‘œ๋ฅผ ์ €์žฅ

int key; //ํ‚ค๋ณด๋“œ๋กœ ์ž…๋ ฅ๋ฐ›์€ ํ‚ค๊ฐ’์„ ์ €์žฅ

int speed; //๊ฒŒ์ž„์ง„ํ–‰์†๋„
int level; //ํ˜„์žฌ level
int level_goal; //๋‹ค์Œ๋ ˆ๋ฒจ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์œ„ํ•œ ๋ชฉํ‘œ์ ์ˆ˜
int cnt; //ํ˜„์žฌ ๋ ˆ๋ฒจ์—์„œ ์ œ๊ฑฐํ•œ ์ค„ ์ˆ˜๋ฅผ ์ €์žฅ
int score; //ํ˜„์žฌ ์ ์ˆ˜
int last_score = 0; //๋งˆ์ง€๋ง‰๊ฒŒ์ž„์ ์ˆ˜
int best_score = 0; //์ตœ๊ณ ๊ฒŒ์ž„์ ์ˆ˜

int new_block_on = 0; //์ƒˆ๋กœ์šด ๋ธ”๋Ÿญ์ด ํ•„์š”ํ•จ์„ ์•Œ๋ฆฌ๋Š” flag
int crush_on = 0; //ํ˜„์žฌ ์ด๋™์ค‘์ธ ๋ธ”๋ก์ด ์ถฉ๋Œ์ƒํƒœ์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” flag
int level_up_on = 0; //๋‹ค์Œ๋ ˆ๋ฒจ๋กœ ์ง„ํ–‰(ํ˜„์žฌ ๋ ˆ๋ฒจ๋ชฉํ‘œ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Œ์„) ์•Œ๋ฆฌ๋Š” flag
int space_key_on = 0; //hard drop์ƒํƒœ์ž„์„ ์•Œ๋ ค์ฃผ๋Š” flag

void title(void); //๊ฒŒ์ž„์‹œ์ž‘ํ™”๋ฉด
void reset(void); //๊ฒŒ์ž„ํŒ ์ดˆ๊ธฐํ™”
void reset_main(void); //๋ฉ”์ธ ๊ฒŒ์ž„ํŒ(main_org[][]๋ฅผ ์ดˆ๊ธฐํ™”)
void reset_main_cpy(void); //copy ๊ฒŒ์ž„ํŒ(main_cpy[][]๋ฅผ ์ดˆ๊ธฐํ™”)
void draw_map(void); //๊ฒŒ์ž„ ์ „์ฒด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ‘œ์‹œ
void draw_main(void); //๊ฒŒ์ž„ํŒ์„ ๊ทธ๋ฆผ
void new_block(void); //์ƒˆ๋กœ์šด ๋ธ”๋ก์„ ํ•˜๋‚˜ ๋งŒ๋“ฆ
void check_key(void); //ํ‚ค๋ณด๋“œ๋กœ ํ‚ค๋ฅผ ์ž…๋ ฅ๋ฐ›์Œ
void drop_block(void); //๋ธ”๋ก์„ ์•„๋ž˜๋กœ ๋–จ์–ดํŠธ๋ฆผ
int check_crush(int bx, int by, int rotation); //bx, by์œ„์น˜์— rotationํšŒ์ „๊ฐ’์„ ๊ฐ™๋Š” ๊ฒฝ์šฐ ์ถฉ๋Œ ํŒ๋‹จ
void move_block(int dir); //dir๋ฐฉํ–ฅ์œผ๋กœ ๋ธ”๋ก์„ ์›€์ง์ž„
void check_line(void); //์ค„์ด ๊ฐ€๋“์ฐผ๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๊ณ  ์ง€์›€
void check_level_up(void); //๋ ˆ๋ฒจ๋ชฉํ‘œ๊ฐ€ ๋‹ฌ์„ฑ๋˜์—ˆ๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๊ณ  levelup์‹œํ‚ด
void check_game_over(void); //๊ฒŒ์ž„์˜ค๋ฒ„์ธ์ง€ ํŒ๋‹จํ•˜๊ณ  ๊ฒŒ์ž„์˜ค๋ฒ„๋ฅผ ์ง„ํ–‰
void pause(void);//๊ฒŒ์ž„์„ ์ผ์‹œ์ •์ง€์‹œํ‚ด

void gotoxy(int x, int y) { //gotoxyํ•จ์ˆ˜
COORD pos = { 2 * x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

typedef enum { NOCURSOR, SOLIDCURSOR, NORMALCURSOR } CURSOR_TYPE; //์ปค์„œ์ˆจ๊ธฐ๋Š” ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋˜๋Š” ์—ด๊ฑฐํ˜•
void setcursortype(CURSOR_TYPE c) { //์ปค์„œ์ˆจ๊ธฐ๋Š” ํ•จ์ˆ˜
CONSOLE_CURSOR_INFO CurInfo;

switch (c) {
case NOCURSOR:
CurInfo.dwSize = 1;
CurInfo.bVisible = FALSE;
break;
case SOLIDCURSOR:
CurInfo.dwSize = 100;
CurInfo.bVisible = TRUE;
break;
case NORMALCURSOR:
CurInfo.dwSize = 20;
CurInfo.bVisible = TRUE;
break;
}
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &CurInfo);
}

int main() {
int i;

srand((unsigned)time(NULL)); //๋‚œ์ˆ˜ํ‘œ์ƒ์„ฑ
setcursortype(NOCURSOR); //์ปค์„œ ์—†์•ฐ
title(); //๋ฉ”์ธํƒ€์ดํ‹€ ํ˜ธ์ถœ
reset(); //๊ฒŒ์ž„ํŒ ๋ฆฌ์…‹

while (1) {
for (i = 0; i < 5; i++) { //๋ธ”๋ก์ด ํ•œ์นธ๋–จ์–ด์ง€๋Š”๋™์•ˆ 5๋ฒˆ ํ‚ค์ž…๋ ฅ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
check_key(); //ํ‚ค์ž…๋ ฅํ™•์ธ
draw_main(); //ํ™”๋ฉด์„ ๊ทธ๋ฆผ
Sleep(speed); //๊ฒŒ์ž„์†๋„์กฐ์ ˆ
if (crush_on && check_crush(bx, by + 1, b_rotation) == false) Sleep(100);
//๋ธ”๋ก์ด ์ถฉ๋Œ์ค‘์ธ๊ฒฝ์šฐ ์ถ”๊ฐ€๋กœ ์ด๋™๋ฐ ํšŒ์ „ํ•  ์‹œ๊ฐ„์„ ๊ฐ–์Œ
if (space_key_on == 1) { //์ŠคํŽ˜์ด์Šค๋ฐ”๋ฅผ ๋ˆ„๋ฅธ๊ฒฝ์šฐ(hard drop) ์ถ”๊ฐ€๋กœ ์ด๋™๋ฐ ํšŒ์ „ํ• ์ˆ˜ ์—†์Œ break;
space_key_on = 0;
break;
}
}
drop_block(); // ๋ธ”๋ก์„ ํ•œ์นธ ๋‚ด๋ฆผ
check_level_up(); // ๋ ˆ๋ฒจ์—…์„ ์ฒดํฌ
check_game_over(); //๊ฒŒ์ž„์˜ค๋ฒ„๋ฅผ ์ฒดํฌ
if (new_block_on == 1) new_block(); // ๋‰ด ๋ธ”๋Ÿญ flag๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๋ธ”๋Ÿญ ์ƒ์„ฑ
}
}

void title(void) {
int x = 5; //ํƒ€์ดํ‹€ํ™”๋ฉด์ด ํ‘œ์‹œ๋˜๋Š” x์ขŒํ‘œ
int y = 4; //ํƒ€์ดํ‹€ํ™”๋ฉด์ด ํ‘œ์‹œ๋˜๋Š” y์ขŒํ‘œ
int cnt; //ํƒ€์ดํ‹€ ํ”„๋ ˆ์ž„์„ ์„ธ๋Š” ๋ณ€์ˆ˜

gotoxy(x, y + 0); printf("โ– โ–กโ–กโ–กโ– โ– โ– โ–กโ–กโ– โ– โ–กโ–กโ– โ– "); Sleep(100);
gotoxy(x, y + 1); printf("โ– โ– โ– โ–ก โ– โ–กโ–ก โ– โ– โ–กโ–กโ– "); Sleep(100);
gotoxy(x, y + 2); printf("โ–กโ–กโ–กโ–  โ–กโ–  โ– "); Sleep(100);
gotoxy(x, y + 3); printf("โ– โ– โ–กโ– โ–  โ–ก โ–  โ–กโ–กโ– โ–กโ–ก"); Sleep(100);
gotoxy(x, y + 4); printf("โ– โ–  โ– โ–กโ–กโ–กโ– โ– โ– โ–กโ– โ– โ–กโ–ก"); Sleep(100);
gotoxy(x, y + 5); printf(" Play Tetris By C"); Sleep(100);
gotoxy(x + 5, y + 2); printf("T E T R I S"); Sleep(100);
gotoxy(x, y + 7); printf("Please Enter Any Key to Start..");
gotoxy(x, y + 9); printf(" โ–ณ : Shift");
gotoxy(x, y + 10); printf("โ— โ–ท : Left / Right");
gotoxy(x, y + 11); printf(" โ–ฝ : Soft Drop");
gotoxy(x, y + 12); printf(" SPACE : Hard Drop");
gotoxy(x, y + 13); printf(" P : Pause");
gotoxy(x, y + 14); printf(" ESC : Quit");
gotoxy(x, y + 16); printf("BONUS FOR HARD DROPS / COMBOS");

for (cnt = 0;; cnt++) { //cnt๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ ๊ณ„์† ๋ฐ˜๋ณต //ํ•˜๋‚˜๋„ ์•ˆ์ค‘์š”ํ•œ ๋ณ„ ๋ฐ˜์ง์ด๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ํšจ๊ณผ
if (kbhit()) break; //ํ‚ค์ž…๋ ฅ์ด ์žˆ์œผ๋ฉด ๋ฌดํ•œ๋ฃจํ”„ ์ข…๋ฃŒ
if (cnt % 200 == 0) { gotoxy(x + 4, y + 1); printf("โ˜…"); } //cnt๊ฐ€ 200์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์งˆ๋•Œ ๋ณ„์„ ํ‘œ์‹œ
if ((cnt % 200 - 100) == 0) { gotoxy(x + 4, y + 1); printf(" "); } //์œ„ ์นด์šดํŠธ์—์„œ 100์นด์šดํŠธ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ณ„์„ ์ง€์›€
if ((cnt % 350) == 0) { gotoxy(x + 13, y + 2); printf("โ˜†"); } //์œ—๋ณ„๊ณผ ๊ฐ™์ง€๋งŒ ์‹œ๊ฐ„์ฐจ๋ฅผ ๋’€์Œ
if ((cnt % 350 - 100) == 0) { gotoxy(x + 13, y + 2); printf(" "); }
Sleep(10); // 00.1์ดˆ ๋”œ๋ ˆ์ด
}

while (kbhit()) getch(); //๋ฒ„ํผ์— ๊ธฐ๋ก๋œ ํ‚ค๊ฐ’์„ ๋ฒ„๋ฆผ

}

void reset(void) {

FILE* file = fopen("score.dat", "rt"); // score.datํŒŒ์ผ์„ ์—ฐ๊ฒฐ
if (file == 0) { best_score = 0; } //ํŒŒ์ผ์ด ์—†์œผ๋ฉด ๊ฑ ์ตœ๊ณ ์ ์ˆ˜์— 0์„ ๋„ฃ์Œ
else {
fscanf(file, "%d", &best_score); // ํŒŒ์ผ์ด ์—ด๋ฆฌ๋ฉด ์ตœ๊ณ ์ ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ด
fclose(file); //ํŒŒ์ผ ๋‹ซ์Œ
}

level = 1; //๊ฐ์ข…๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”
score = 0;
level_goal = 1000;
key = 0;
crush_on = 0;
cnt = 0;
speed = 100;

system("cls"); //ํ™”๋ฉด์ง€์›€
reset_main(); // main_org๋ฅผ ์ดˆ๊ธฐํ™”
draw_map(); // ๊ฒŒ์ž„ํ™”๋ฉด์„ ๊ทธ๋ฆผ
draw_main(); // ๊ฒŒ์ž„ํŒ์„ ๊ทธ๋ฆผ

b_type_next = rand() % 7; //๋‹ค์Œ๋ฒˆ์— ๋‚˜์˜ฌ ๋ธ”๋ก ์ข…๋ฅ˜๋ฅผ ๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑ
new_block(); //์ƒˆ๋กœ์šด ๋ธ”๋ก์„ ํ•˜๋‚˜ ๋งŒ๋“ฆ

}

void reset_main(void) { //๊ฒŒ์ž„ํŒ์„ ์ดˆ๊ธฐํ™”
int i, j;

for (i = 0; i < MAIN_Y; i++) { // ๊ฒŒ์ž„ํŒ์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
for (j = 0; j < MAIN_X; j++) {
main_org[i][j] = 0;
main_cpy[i][j] = 100;
}
}
for (j = 1; j < MAIN_X; j++) { //y๊ฐ’์ด 3์ธ ์œ„์น˜์— ์ฒœ์žฅ์„ ๋งŒ๋“ฆ
main_org[3][j] = CEILLING;
}
for (i = 1; i < MAIN_Y - 1; i++) { //์ขŒ์šฐ ๋ฒฝ์„ ๋งŒ๋“ฆ
main_org[i][0] = WALL;
main_org[i][MAIN_X - 1] = WALL;
}
for (j = 0; j < MAIN_X; j++) { //๋ฐ”๋‹ฅ๋ฒฝ์„ ๋งŒ๋“ฆ
main_org[MAIN_Y - 1][j] = WALL;
}
}

void reset_main_cpy(void) { //main_cpy๋ฅผ ์ดˆ๊ธฐํ™”
int i, j;

for (i = 0; i < MAIN_Y; i++) { //๊ฒŒ์ž„ํŒ์— ๊ฒŒ์ž„์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ˆซ์ž๋ฅผ ๋„ฃ์Œ
for (j = 0; j < MAIN_X; j++) { //์ด๋Š” main_org์™€ ๊ฐ™์€ ์ˆซ์ž๊ฐ€ ์—†๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ
main_cpy[i][j] = 100;
}
}
}

void draw_map(void) { //๊ฒŒ์ž„ ์ƒํƒœ ํ‘œ์‹œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•จ์ˆ˜
int y = 3; // level, goal, score๋งŒ ๊ฒŒ์ž„์ค‘์— ๊ฐ’์ด ๋ฐ”๋€”์ˆ˜ ๋„ ์žˆ์Œ ๊ทธ y๊ฐ’์„ ๋”ฐ๋กœ ์ €์žฅํ•ด๋‘ 
// ๊ทธ๋ž˜์„œ ํ˜น์‹œ ๊ฒŒ์ž„ ์ƒํƒœ ํ‘œ์‹œ ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๊ทธ ํ•จ์ˆ˜์—์„œ ์•ˆ๋ฐ”๊ฟ”๋„ ๋˜๊ฒŒ..
gotoxy(STATUS_X_ADJ, STATUS_Y_LEVEL = y); printf(" LEVEL : %5d", level);
gotoxy(STATUS_X_ADJ, STATUS_Y_GOAL = y + 1); printf(" GOAL : %5d", 10 - cnt);
gotoxy(STATUS_X_ADJ, y + 2); printf("+- N E X T -+ ");
gotoxy(STATUS_X_ADJ, y + 3); printf("| | ");
gotoxy(STATUS_X_ADJ, y + 4); printf("| | ");
gotoxy(STATUS_X_ADJ, y + 5); printf("| | ");
gotoxy(STATUS_X_ADJ, y + 6); printf("| | ");
gotoxy(STATUS_X_ADJ, y + 7); printf("+-- - - - --+ ");
gotoxy(STATUS_X_ADJ, y + 8); printf(" YOUR SCORE :");
gotoxy(STATUS_X_ADJ, STATUS_Y_SCORE = y + 9); printf(" %6d", score);
gotoxy(STATUS_X_ADJ, y + 10); printf(" LAST SCORE :");
gotoxy(STATUS_X_ADJ, y + 11); printf(" %6d", last_score);
gotoxy(STATUS_X_ADJ, y + 12); printf(" BEST SCORE :");
gotoxy(STATUS_X_ADJ, y + 13); printf(" %6d", best_score);
gotoxy(STATUS_X_ADJ, y + 15); printf(" โ–ณ : Shift SPACE : Hard Drop");
gotoxy(STATUS_X_ADJ, y + 16); printf("โ— โ–ท : Left / Right P : Pause");
gotoxy(STATUS_X_ADJ, y + 17); printf(" โ–ฝ : Soft Drop ESC : Quit");
gotoxy(STATUS_X_ADJ, y + 20); printf("Play Tetris By C");
}

void draw_main(void) { //๊ฒŒ์ž„ํŒ ๊ทธ๋ฆฌ๋Š” ํ•จ์ˆ˜
int i, j;

for (j = 1; j < MAIN_X - 1; j++) { //์ฒœ์žฅ์€ ๊ณ„์† ์ƒˆ๋กœ์šด๋ธ”๋Ÿญ์ด ์ง€๋‚˜๊ฐ€์„œ ์ง€์›Œ์ง€๋ฉด ์ƒˆ๋กœ ๊ทธ๋ ค์คŒ
if (main_org[3][j] == EMPTY) main_org[3][j] = CEILLING;
}
for (i = 0; i < MAIN_Y; i++) {
for (j = 0; j < MAIN_X; j++) {
if (main_cpy[i][j] != main_org[i][j]) { //cpy๋ž‘ ๋น„๊ตํ•ด์„œ ๊ฐ’์ด ๋‹ฌ๋ผ์ง„ ๋ถ€๋ถ„๋งŒ ์ƒˆ๋กœ ๊ทธ๋ ค์คŒ.
//์ด๊ฒŒ ์—†์œผ๋ฉด ๊ฒŒ์ž„ํŒ์ „์ฒด๋ฅผ ๊ณ„์† ๊ทธ๋ ค์„œ ๋А๋ ค์ง€๊ณ  ๋ฐ˜์ง๊ฑฐ๋ฆผ
gotoxy(MAIN_X_ADJ + j, MAIN_Y_ADJ + i);
switch (main_org[i][j]) {
case EMPTY: //๋นˆ์นธ๋ชจ์–‘
printf(" ");
break;
case CEILLING: //์ฒœ์žฅ๋ชจ์–‘
printf(". ");
break;
case WALL: //๋ฒฝ๋ชจ์–‘
printf("โ–ฉ");
break;
case INACTIVE_BLOCK: //๊ตณ์€ ๋ธ”๋Ÿญ ๋ชจ์–‘
printf("โ–ก");
break;
case ACTIVE_BLOCK: //์›€์ง์ด๊ณ ์žˆ๋Š” ๋ธ”๋Ÿญ ๋ชจ์–‘
printf("โ– ");
break;
}
}
}
}
for (i = 0; i < MAIN_Y; i++) { //๊ฒŒ์ž„ํŒ์„ ๊ทธ๋ฆฐ ํ›„ main_cpy์— ๋ณต์‚ฌ
for (j = 0; j < MAIN_X; j++) {
main_cpy[i][j] = main_org[i][j];
}
}
}

void new_block(void) { //์ƒˆ๋กœ์šด ๋ธ”๋ก ์ƒ์„ฑ
int i, j;

bx = (MAIN_X / 2) - 1; //๋ธ”๋ก ์ƒ์„ฑ ์œ„์น˜x์ขŒํ‘œ(๊ฒŒ์ž„ํŒ์˜ ๊ฐ€์šด๋ฐ)
by = 0; //๋ธ”๋ก ์ƒ์„ฑ์œ„์น˜ y์ขŒํ‘œ(์ œ์ผ ์œ„)
b_type = b_type_next; //๋‹ค์Œ๋ธ”๋Ÿญ๊ฐ’์„ ๊ฐ€์ ธ์˜ด
b_type_next = rand() % 7; //๋‹ค์Œ ๋ธ”๋Ÿญ์„ ๋งŒ๋“ฆ
b_rotation = 0; //ํšŒ์ „์€ 0๋ฒˆ์œผ๋กœ ๊ฐ€์ ธ์˜ด

new_block_on = 0; //new_block flag๋ฅผ ๋”

for (i = 0; i < 4; i++) { //๊ฒŒ์ž„ํŒ bx, by์œ„์น˜์— ๋ธ”๋Ÿญ์ƒ์„ฑ
for (j = 0; j < 4; j++) {
if (blocks[b_type][b_rotation][i][j] == 1) main_org[by + i][bx + j] = ACTIVE_BLOCK;
}
}
for (i = 1; i < 3; i++) { //๊ฒŒ์ž„์ƒํƒœํ‘œ์‹œ์— ๋‹ค์Œ์— ๋‚˜์˜ฌ๋ธ”๋Ÿญ์„ ๊ทธ๋ฆผ
for (j = 0; j < 4; j++) {
if (blocks[b_type_next][0][i][j] == 1) {
gotoxy(STATUS_X_ADJ + 2 + j, i + 6);
printf("โ– ");
}
else {
gotoxy(STATUS_X_ADJ + 2 + j, i + 6);
printf(" ");
}
}
}
}

void check_key(void) {
key = 0; //ํ‚ค๊ฐ’ ์ดˆ๊ธฐํ™”

if (kbhit()) { //ํ‚ค์ž…๋ ฅ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
key = getch(); //ํ‚ค๊ฐ’์„ ๋ฐ›์Œ
if (key == 224) { //๋ฐฉํ–ฅํ‚ค์ธ๊ฒฝ์šฐ
do { key = getch(); } while (key == 224);//๋ฐฉํ–ฅํ‚ค์ง€์‹œ๊ฐ’์„ ๋ฒ„๋ฆผ
switch (key) {
case LEFT: //์™ผ์ชฝํ‚ค ๋ˆŒ๋ €์„๋•Œ
if (check_crush(bx - 1, by, b_rotation) == true) move_block(LEFT);
break; //์™ผ์ชฝ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฒดํฌ ํ›„ ๊ฐ€๋Šฅํ•˜๋ฉด ์ด๋™
case RIGHT: //์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅํ‚ค ๋ˆŒ๋ €์„๋•Œ- ์œ„์™€ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋จ
if (check_crush(bx + 1, by, b_rotation) == true) move_block(RIGHT);
break;
case DOWN: //์•„๋ž˜์ชฝ ๋ฐฉํ–ฅํ‚ค ๋ˆŒ๋ €์„๋•Œ-์œ„์™€ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋จ
if (check_crush(bx, by + 1, b_rotation) == true) move_block(DOWN);
break;
case UP: //์œ„์ชฝ ๋ฐฉํ–ฅํ‚ค ๋ˆŒ๋ €์„๋•Œ
if (check_crush(bx, by, (b_rotation + 1) % 4) == true) move_block(UP);
//ํšŒ์ „ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ฒดํฌ ํ›„ ๊ฐ€๋Šฅํ•˜๋ฉด ํšŒ์ „
else if (crush_on == 1 && check_crush(bx, by - 1, (b_rotation + 1) % 4) == true) move_block(100);
} //๋ฐ”๋‹ฅ์— ๋‹ฟ์€ ๊ฒฝ์šฐ ์œ„์ชฝ์œผ๋กœ ํ•œ์นธ๋„์›Œ์„œ ํšŒ์ „์ด ๊ฐ€๋Šฅํ•˜๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•จ(ํŠน์ˆ˜๋™์ž‘)
}
else { //๋ฐฉํ–ฅํ‚ค๊ฐ€ ์•„๋‹Œ๊ฒฝ์šฐ
switch (key) {
case SPACE: //์ŠคํŽ˜์ด์Šคํ‚ค ๋ˆŒ๋ €์„๋•Œ
space_key_on = 1; //์ŠคํŽ˜์ด์Šคํ‚ค flag๋ฅผ ๋„์›€
while (crush_on == 0) { //๋ฐ”๋‹ฅ์— ๋‹ฟ์„๋•Œ๊นŒ์ง€ ์ด๋™์‹œํ‚ด
drop_block();
score += level; // hard drop ๋ณด๋„ˆ์Šค
gotoxy(STATUS_X_ADJ, STATUS_Y_SCORE); printf(" %6d", score); //์ ์ˆ˜ ํ‘œ์‹œ
}
break;
case P: //P(๋Œ€๋ฌธ์ž) ๋ˆŒ๋ €์„๋•Œ
case p: //p(์†Œ๋ฌธ์ž) ๋ˆŒ๋ €์„๋•Œ
pause(); //์ผ์‹œ์ •์ง€
break;
case ESC: //ESC๋ˆŒ๋ €์„๋•Œ
system("cls"); //ํ™”๋ฉด์„ ์ง€์šฐ๊ณ 
exit(0); //๊ฒŒ์ž„์ข…๋ฃŒ
}
}
}
while (kbhit()) getch(); //ํ‚ค๋ฒ„ํผ๋ฅผ ๋น„์›€
}

void drop_block(void) {
int i, j;

if (crush_on && check_crush(bx, by + 1, b_rotation) == true) crush_on = 0; //๋ฐ‘์ด ๋น„์–ด์žˆ์œผ๋ฉด crush flag ๋”
if (crush_on && check_crush(bx, by + 1, b_rotation) == false) { //๋ฐ‘์ด ๋น„์–ด์žˆ์ง€์•Š๊ณ  crush flag๊ฐ€ ์ผœ์ €์žˆ์œผ๋ฉด
for (i = 0; i < MAIN_Y; i++) { //ํ˜„์žฌ ์กฐ์ž‘์ค‘์ธ ๋ธ”๋Ÿญ์„ ๊ตณํž˜
for (j = 0; j < MAIN_X; j++) {
if (main_org[i][j] == ACTIVE_BLOCK) main_org[i][j] = INACTIVE_BLOCK;
}
}
crush_on = 0; //flag๋ฅผ ๋”
check_line(); //๋ผ์ธ์ฒดํฌ๋ฅผ ํ•จ
new_block_on = 1; //์ƒˆ๋กœ์šด ๋ธ”๋Ÿญ์ƒ์„ฑ flag๋ฅผ ์ผฌ
return; //ํ•จ์ˆ˜ ์ข…๋ฃŒ
}
if (check_crush(bx, by + 1, b_rotation) == true) move_block(DOWN); //๋ฐ‘์ด ๋น„์–ด์žˆ์œผ๋ฉด ๋ฐ‘์œผ๋กœ ํ•œ์นธ ์ด๋™
if (check_crush(bx, by + 1, b_rotation) == false) crush_on++; //๋ฐ‘์œผ๋กœ ์ด๋™์ด ์•ˆ๋˜๋ฉด crush flag๋ฅผ ์ผฌ
}

int check_crush(int bx, int by, int b_rotation) { //์ง€์ •๋œ ์ขŒํ‘œ์™€ ํšŒ์ „๊ฐ’์œผ๋กœ ์ถฉ๋Œ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
int i, j;

for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) { //์ง€์ •๋œ ์œ„์น˜์˜ ๊ฒŒ์ž„ํŒ๊ณผ ๋ธ”๋Ÿญ๋ชจ์–‘์„ ๋น„๊ตํ•ด์„œ ๊ฒน์น˜๋ฉด false๋ฅผ ๋ฆฌํ„ด
if (blocks[b_type][b_rotation][i][j] == 1 && main_org[by + i][bx + j] > 0) return false;
}
}
return true; //ํ•˜๋‚˜๋„ ์•ˆ๊ฒน์น˜๋ฉด true๋ฆฌํ„ด
};

void move_block(int dir) { //๋ธ”๋ก์„ ์ด๋™์‹œํ‚ด
int i, j;

switch (dir) {
case LEFT: //์™ผ์ชฝ๋ฐฉํ–ฅ
for (i = 0; i < 4; i++) { //ํ˜„์žฌ์ขŒํ‘œ์˜ ๋ธ”๋Ÿญ์„ ์ง€์›€
for (j = 0; j < 4; j++) {
if (blocks[b_type][b_rotation][i][j] == 1) main_org[by + i][bx + j] = EMPTY;
}
}
for (i = 0; i < 4; i++) { //์™ผ์ชฝ์œผ๋กœ ํ•œ์นธ๊ฐ€์„œ active block์„ ์ฐ์Œ
for (j = 0; j < 4; j++) {
if (blocks[b_type][b_rotation][i][j] == 1) main_org[by + i][bx + j - 1] = ACTIVE_BLOCK;
}
}
bx--; //์ขŒํ‘œ๊ฐ’ ์ด๋™
break;

case RIGHT: //์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ. ์™ผ์ชฝ๋ฐฉํ–ฅ์ด๋ž‘ ๊ฐ™์€ ์›๋ฆฌ๋กœ ๋™์ž‘
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (blocks[b_type][b_rotation][i][j] == 1) main_org[by + i][bx + j] = EMPTY;
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (blocks[b_type][b_rotation][i][j] == 1) main_org[by + i][bx + j + 1] = ACTIVE_BLOCK;
}
}
bx++;
break;

case DOWN: //์•„๋ž˜์ชฝ ๋ฐฉํ–ฅ. ์™ผ์ชฝ๋ฐฉํ–ฅ์ด๋ž‘ ๊ฐ™์€ ์›๋ฆฌ๋กœ ๋™์ž‘
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (blocks[b_type][b_rotation][i][j] == 1) main_org[by + i][bx + j] = EMPTY;
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (blocks[b_type][b_rotation][i][j] == 1) main_org[by + i + 1][bx + j] = ACTIVE_BLOCK;
}
}
by++;
break;

case UP: //ํ‚ค๋ณด๋“œ ์œ„์ชฝ ๋ˆŒ๋ €์„๋•Œ ํšŒ์ „์‹œํ‚ด.
for (i = 0; i < 4; i++) { //ํ˜„์žฌ์ขŒํ‘œ์˜ ๋ธ”๋Ÿญ์„ ์ง€์›€
for (j = 0; j < 4; j++) {
if (blocks[b_type][b_rotation][i][j] == 1) main_org[by + i][bx + j] = EMPTY;
}
}
b_rotation = (b_rotation + 1) % 4; //ํšŒ์ „๊ฐ’์„ 1์ฆ๊ฐ€์‹œํ‚ด(3์—์„œ 4๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋Š” 0์œผ๋กœ ๋˜๋Œ๋ฆผ)
for (i = 0; i < 4; i++) { //ํšŒ์ „๋œ ๋ธ”๋ก์„ ์ฐ์Œ
for (j = 0; j < 4; j++) {
if (blocks[b_type][b_rotation][i][j] == 1) main_org[by + i][bx + j] = ACTIVE_BLOCK;
}
}
break;

case 100: //๋ธ”๋ก์ด ๋ฐ”๋‹ฅ, ํ˜น์€ ๋‹ค๋ฅธ ๋ธ”๋ก๊ณผ ๋‹ฟ์€ ์ƒํƒœ์—์„œ ํ•œ์นธ์œ„๋กœ ์˜ฌ๋ ค ํšŒ์ „์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ
//์ด๋ฅผ ๋™์ž‘์‹œํ‚ค๋Š” ํŠน์ˆ˜๋™์ž‘
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (blocks[b_type][b_rotation][i][j] == 1) main_org[by + i][bx + j] = EMPTY;
}
}
b_rotation = (b_rotation + 1) % 4;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (blocks[b_type][b_rotation][i][j] == 1) main_org[by + i - 1][bx + j] = ACTIVE_BLOCK;
}
}
by--;
break;
}
}

void check_line(void) {
int i, j, k, l;

int block_amount; //ํ•œ์ค„์˜ ๋ธ”๋ก๊ฐฏ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜
int combo = 0; //์ฝค๋ณด๊ฐฏ์ˆ˜ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜ ์ง€์ •๋ฐ ์ดˆ๊ธฐํ™”

for (i = MAIN_Y - 2; i > 3;) { //i=MAIN_Y-2 : ๋ฐ‘์ชฝ๋ฒฝ์˜ ์œ—์นธ๋ถ€ํ„ฐ, i>3 : ์ฒœ์žฅ(3)์•„๋ž˜๊นŒ์ง€ ๊ฒ€์‚ฌ
block_amount = 0; //๋ธ”๋ก๊ฐฏ์ˆ˜ ์ €์žฅ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”
for (j = 1; j < MAIN_X - 1; j++) { //๋ฒฝ๊ณผ ๋ฒฝ์‚ฌ์ด์˜ ๋ธ”๋ก๊ฐฏ๋ฃจ๋ฅผ ์…ˆ
if (main_org[i][j] > 0) block_amount++;
}
if (block_amount == MAIN_X - 2) { //๋ธ”๋ก์ด ๊ฐ€๋“ ์ฐฌ ๊ฒฝ์šฐ
if (level_up_on == 0) { //๋ ˆ๋ฒจ์—…์ƒํƒœ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—(๋ ˆ๋ฒจ์—…์ด ๋˜๋ฉด ์ž๋™ ์ค„์‚ญ์ œ๊ฐ€ ์žˆ์Œ)
score += 100 * level; //์ ์ˆ˜์ถ”๊ฐ€
cnt++; //์ง€์šด ์ค„ ๊ฐฏ์ˆ˜ ์นด์šดํŠธ ์ฆ๊ฐ€
combo++; //์ฝค๋ณด์ˆ˜ ์ฆ๊ฐ€
}
for (k = i; k > 1; k--) { //์œ—์ค„์„ ํ•œ์นธ์”ฉ ๋ชจ๋‘ ๋‚ด๋ฆผ(์œ—์ค„์ด ์ฒœ์žฅ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ)
for (l = 1; l < MAIN_X - 1; l++) {
if (main_org[k - 1][l] != CEILLING) main_org[k][l] = main_org[k - 1][l];
if (main_org[k - 1][l] == CEILLING) main_org[k][l] = EMPTY;
//์œ—์ค„์ด ์ฒœ์žฅ์ธ ๊ฒฝ์šฐ์—๋Š” ์ฒœ์žฅ์„ ํ•œ์นธ ๋‚ด๋ฆฌ๋ฉด ์•ˆ๋˜๋‹ˆ๊นŒ ๋นˆ์นธ์„ ๋„ฃ์Œ
}
}
}
else i--;
}
if (combo) { //์ค„ ์‚ญ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ ์ˆ˜์™€ ๋ ˆ๋ฒจ ๋ชฉํ‘œ๋ฅผ ์ƒˆ๋กœ ํ‘œ์‹œํ•จ
if (combo > 1) { //2์ฝค๋ณด์ด์ƒ์ธ ๊ฒฝ์šฐ ๊ฒฝ์šฐ ๋ณด๋„ˆ์Šค๋ฐ ๋ฉ”์„ธ์ง€๋ฅผ ๊ฒŒ์ž„ํŒ์— ๋„์› ๋‹ค๊ฐ€ ์ง€์›€
gotoxy(MAIN_X_ADJ + (MAIN_X / 2) - 1, MAIN_Y_ADJ + by - 2); printf("%d COMBO!", combo);
Sleep(500);
score += (combo * level * 100);
reset_main_cpy(); //ํ…์ŠคํŠธ๋ฅผ ์ง€์šฐ๊ธฐ ์œ„ํ•ด main_cpy์„ ์ดˆ๊ธฐํ™”.
//(main_cpy์™€ main_org๊ฐ€ ์ „๋ถ€ ๋‹ค๋ฅด๋ฏ€๋กœ ๋‹ค์Œ๋ฒˆ draw()ํ˜ธ์ถœ์‹œ ๊ฒŒ์ž„ํŒ ์ „์ฒด๋ฅผ ์ƒˆ๋กœ ๊ทธ๋ฆฌ๊ฒŒ ๋จ)
}
gotoxy(STATUS_X_ADJ, STATUS_Y_GOAL); printf(" GOAL : %5d", (cnt <= 10) ? 10 - cnt : 0);
gotoxy(STATUS_X_ADJ, STATUS_Y_SCORE); printf(" %6d", score);
}
}

void check_level_up(void) {
int i, j;

if (cnt >= 10) { //๋ ˆ๋ฒจ๋ณ„๋กœ 10์ค„์”ฉ ์—†์• ์•ผํ•จ. 10์ค„์ด์ƒ ์—†์•ค ๊ฒฝ์šฐ
draw_main();
level_up_on = 1; //๋ ˆ๋ฒจ์—… flag๋ฅผ ๋„์›€
level += 1; //๋ ˆ๋ฒจ์„ 1 ์˜ฌ๋ฆผ
cnt = 0; //์ง€์šด ์ค„์ˆ˜ ์ดˆ๊ธฐํ™”

for (i = 0; i < 4; i++) {
gotoxy(MAIN_X_ADJ + (MAIN_X / 2) - 3, MAIN_Y_ADJ + 4);
printf(" ");
gotoxy(MAIN_X_ADJ + (MAIN_X / 2) - 2, MAIN_Y_ADJ + 6);
printf(" ");
Sleep(200);

gotoxy(MAIN_X_ADJ + (MAIN_X / 2) - 3, MAIN_Y_ADJ + 4);
printf("โ˜†LEVEL UP!โ˜†");
gotoxy(MAIN_X_ADJ + (MAIN_X / 2) - 2, MAIN_Y_ADJ + 6);
printf("โ˜†SPEED UP!โ˜†");
Sleep(200);
}
reset_main_cpy(); //ํ…์ŠคํŠธ๋ฅผ ์ง€์šฐ๊ธฐ ์œ„ํ•ด main_cpy์„ ์ดˆ๊ธฐํ™”.
//(main_cpy์™€ main_org๊ฐ€ ์ „๋ถ€ ๋‹ค๋ฅด๋ฏ€๋กœ ๋‹ค์Œ๋ฒˆ draw()ํ˜ธ์ถœ์‹œ ๊ฒŒ์ž„ํŒ ์ „์ฒด๋ฅผ ์ƒˆ๋กœ ๊ทธ๋ฆฌ๊ฒŒ ๋จ)

for (i = MAIN_Y - 2; i > MAIN_Y - 2 - (level - 1); i--) { //๋ ˆ๋ฒจ์—…๋ณด์ƒ์œผ๋กœ ๊ฐ ๋ ˆ๋ฒจ-1์˜ ์ˆ˜๋งŒํผ ์•„๋žซ์ชฝ ์ค„์„ ์ง€์›Œ์คŒ
for (j = 1; j < MAIN_X - 1; j++) {
main_org[i][j] = INACTIVE_BLOCK; // ์ค„์„ ๋ธ”๋ก์œผ๋กœ ๋ชจ๋‘ ์ฑ„์šฐ๊ณ 
gotoxy(MAIN_X_ADJ + j, MAIN_Y_ADJ + i); // ๋ณ„์„ ์ฐ์–ด์คŒ.. ์ด๋ป๋ณด์ด๊ฒŒ
printf("โ˜…");
Sleep(20);
}
}
Sleep(100); //๋ณ„์ฐ์€๊ฑฐ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด delay
check_line(); //๋ธ”๋ก์œผ๋กœ ๋ชจ๋‘ ์ฑ„์šด๊ฒƒ ์ง€์šฐ๊ธฐ
//.check_line()ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ level up flag๊ฐ€ ์ผœ์ ธ์žˆ๋Š” ๊ฒฝ์šฐ ์ ์ˆ˜๋Š” ์—†์Œ.
switch (level) { //๋ ˆ๋ฒจ๋ณ„๋กœ ์†๋„๋ฅผ ์กฐ์ ˆํ•ด์คŒ.
case 2:
speed = 50;
break;
case 3:
speed = 25;
break;
case 4:
speed = 10;
break;
case 5:
speed = 5;
break;
case 6:
speed = 4;
break;
case 7:
speed = 3;
break;
case 8:
speed = 2;
break;
case 9:
speed = 1;
break;
case 10:
speed = 0;
break;
}
level_up_on = 0; //๋ ˆ๋ฒจ์—… flag๊บผ์คŒ

gotoxy(STATUS_X_ADJ, STATUS_Y_LEVEL); printf(" LEVEL : %5d", level); //๋ ˆ๋ฒจํ‘œ์‹œ
gotoxy(STATUS_X_ADJ, STATUS_Y_GOAL); printf(" GOAL : %5d", 10 - cnt); // ๋ ˆ๋ฒจ๋ชฉํ‘œ ํ‘œ์‹œ

}
}

void check_game_over(void) {
int i;

int x = 5;
int y = 5;

for (i = 1; i < MAIN_X - 2; i++) {
if (main_org[3][i] > 0) { //์ฒœ์žฅ(์œ„์—์„œ ์„ธ๋ฒˆ์งธ ์ค„)์— inactive๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ๊ฒŒ์ž„ ์˜ค๋ฒ„
gotoxy(x, y + 0); printf("โ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–ค"); //๊ฒŒ์ž„์˜ค๋ฒ„ ๋ฉ”์„ธ์ง€
gotoxy(x, y + 1); printf("โ–ค โ–ค");
gotoxy(x, y + 2); printf("โ–ค +-----------------------+ โ–ค");
gotoxy(x, y + 3); printf("โ–ค | G A M E O V E R ... | โ–ค");
gotoxy(x, y + 4); printf("โ–ค +-----------------------+ โ–ค");
gotoxy(x, y + 5); printf("โ–ค YOUR SCORE: %6d โ–ค", score);
gotoxy(x, y + 6); printf("โ–ค โ–ค");
gotoxy(x, y + 7); printf("โ–ค Press any key to restart.. โ–ค");
gotoxy(x, y + 8); printf("โ–ค โ–ค");
gotoxy(x, y + 9); printf("โ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–ค");
last_score = score; //๊ฒŒ์ž„์ ์ˆ˜๋ฅผ ์˜ฎ๊น€

if (score > best_score) { //์ตœ๊ณ ๊ธฐ๋ก ๊ฐฑ์‹ ์‹œ
FILE* file = fopen("score.dat", "wt"); //score.dat์— ์ ์ˆ˜ ์ €์žฅ

gotoxy(x, y + 6); printf("โ–ค โ˜…โ˜…โ˜… BEST SCORE! โ˜…โ˜…โ˜… โ–ค ");

if (file == 0) { //ํŒŒ์ผ ์—๋Ÿฌ๋ฉ”์„ธ์ง€
gotoxy(0, 0);
printf("FILE ERROR: SYSTEM CANNOT WRITE BEST SCORE ON \"SCORE.DAT\"");
}
else {
fprintf(file, "%d", score);
fclose(file);
}
}
Sleep(1000);
while (kbhit()) getch();
key = getch();
reset();
}
}
}

void pause(void) { //๊ฒŒ์ž„ ์ผ์‹œ์ •์ง€ ํ•จ์ˆ˜
int i, j;

int x = 5;
int y = 5;

for (i = 1; i < MAIN_X - 2; i++) { //๊ฒŒ์ž„ ์ผ์‹œ์ •์ง€ ๋ฉ”์„ธ์ง€
gotoxy(x, y + 0); printf("โ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–ค");
gotoxy(x, y + 1); printf("โ–ค โ–ค");
gotoxy(x, y + 2); printf("โ–ค +-----------------------+ โ–ค");
gotoxy(x, y + 3); printf("โ–ค | P A U S E | โ–ค");
gotoxy(x, y + 4); printf("โ–ค +-----------------------+ โ–ค");
gotoxy(x, y + 5); printf("โ–ค Press any key to resume.. โ–ค");
gotoxy(x, y + 6); printf("โ–ค โ–ค");
gotoxy(x, y + 7); printf("โ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–คโ–ค");
}
getch(); //ํ‚ค์ž…๋ ฅ์‹œ๊นŒ์ง€ ๋Œ€๊ธฐ

system("cls"); //ํ™”๋ฉด ์ง€์šฐ๊ณ  ์ƒˆ๋กœ ๊ทธ๋ฆผ
reset_main_cpy();
draw_main();
draw_map();

for (i = 1; i < 3; i++) { // ๋‹ค์Œ๋ธ”๋ก ๊ทธ๋ฆผ
for (j = 0; j < 4; j++) {
if (blocks[b_type_next][0][i][j] == 1) {
gotoxy(MAIN_X + MAIN_X_ADJ + 3 + j, i + 6);
printf("โ– ");
}
else {
gotoxy(MAIN_X + MAIN_X_ADJ + 3 + j, i + 6);
printf(" ");
}
}
}
}
```


### Year of Coding : 2015