- Windows
- Microsoft Visual Studio
Best Score by https://github.com/melli0505 (2019.10.28)
#define _CRT_NONSTDC_NO_WARNINGS // ๋นํ์ค ํจ์๋ฅผ ์ฌ์ฉํ์ ๋ ์๋ฌ ๋ฐฉ์ง
#define _CRT_SECURE_NO_WARNINGS // scanf ๋ณด์ ๊ฒฝ๊ณ ๋ก ์ธํ ์ปดํ์ผ ์๋ฌ ๋ฐฉ์ง
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#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(" ");
}
}
}
}