//打印开始接口 void print_start_interface(void) { int x, y; printf("\33[2J"); printf("\33[%d;%dH\33[32m分数:\33[0m", p_y + 10, p_x + 25); printf("\33[%d;%dH\33[32m等级:\33[0m", p_y + 14, p_x + 25); for (x = p_x, y = p_y; x <= 46; x++) printf("\33[%d;%dH\33[41m==\33[0m", y, x); for (x = p_x, y = p_y + 1; y <= 25; y++) printf("\33[%d;%dH\33[41m||\33[0m", y, x); for (x = p_x + 22, y = p_y + 1; y <= 25; y++) printf("\33[%d;%dH\33[41m||\33[0m", y, x); for (x = p_x + 36, y = p_y + 1; y <= 25; y++) printf("\33[%d;%dH\33[41m||\33[0m", y, x); for (x = p_x + 24, y = p_y + 8; x <= 44; x++) printf("\33[%d;%dH\33[41m--\33[0m", y, x); for (x = p_x, y = p_y + 21; x <= 46; x++) printf("\33[%d;%dH\33[41m==\33[0m", y, x); printf("\33[?25l"); fflush(stdout); }
//根据标志的颜色来把方块储存到矩阵中去 void store_flag_color(void) { int i, a = 0, b = 0; for (i = 0; i < 16; i++) { if (i / 4 >= shape[num][mode][16] && i % 4 == 0) { a++; b = 0; } if (i / 4 >= shape[num][mode][16]&& i % 4 >= shape[num][mode][17]) { if (shape[num][save_mode][i] == 0) { b = b + 2; } if (shape[num][save_mode][i] == 1) { matirx[save_y + a - 1][save_x + b] = color; b++; matirx[save_y + a - 1][save_x + b] = color; b++; } } } }
//打印保存的矩阵 void print_save_matrix(void) { int i, j, n = 0; for (i = 0; i < Y; i++) { printf("\33[%d;%dH", i + p_y + 1, p_x + 2); for (j = 0; j < X; j++) { if (matirx[i][j] != 0) { n = (n + 1) % 2; fprintf(stdout, "\33[%dm", matirx[i][j]); (n == 1) ? printf("[") : printf("]"); } if (matirx[i][j] == 0) { printf("\33[0m"); printf(" "); } fflush(stdout); } } }
// 变换方块的形状 void change_shape(void) { int i, n; for (i = 0; i < save_row; i++) { if (num == 6) { n = 4; } else { n = 0; } if (((x + n) >= X - save_col * 2 && save_col < save_row) || judge_by_color(x, (mode + 1) % 4) == 1) { return; } } mode = (mode + 1) % 4; fflush(stdout); print_mode_shape(); fflush(stdout); }
//向右移动方块 void move_right(void) { int i; if (x >= X - save_col * 2 || judge_by_color(x + 2, mode) == 1) { return; } x = x + 2; print_mode_shape(); fflush(stdout); }
// 向左移动方块 void move_left(void) { int i; if (x <= 0 || judge_by_color(x - 2, mode) == 1) { return; } x = x - 2; print_mode_shape(); fflush(stdout); }
//当方块拼满一行或多行时,销毁一行或多行方块 void destroy_line(void) { int i, j, full; int a, b, c; for (i = 0; i < Y; i++) { full = 1; for (j = 0; j < X; j++) { if (matirx[i][j] == 0) { full = 0; } } if (full == 1) { for (a = 0; a < i; a++) { for (b = 0; b < X; b++) { matirx[i - a][b] = matirx[i - a - 1][b]; } } print_save_matrix(); score = score + 100; if (score % LEVEL_SCORE == 0) { level = level + 1; if (level >= 9) level = 9; change_level(); print_level(); } print_score(); } } }
//改变游戏水平 , 改变游戏速度 void change_level(void) { switch (level) { case 1: setitimer(ITIMER_REAL, &level_01, NULL); break; case 2: setitimer(ITIMER_REAL, &level_02, NULL); break; case 3: setitimer(ITIMER_REAL, &level_03, NULL); break; case 4: setitimer(ITIMER_REAL, &level_04, NULL); break; case 5: setitimer(ITIMER_REAL, &level_05, NULL); break; case 6: setitimer(ITIMER_REAL, &level_06, NULL); break; case 7: setitimer(ITIMER_REAL, &level_07, NULL); break; case 8: setitimer(ITIMER_REAL, &level_08, NULL); break; case 9: setitimer(ITIMER_REAL, &level_09, NULL); break; default: break; } }
//根据方块颜色来判断方块能否通过 int judge_by_color(int x, int mode) { int i, a = 0, b = 0; for (i = 0; i < 16; i++) { if (i / 4 >= shape[num][mode][16] && i % 4 == 0) { a++; b = 0; } if (i / 4 >= shape[num][mode][16]&& i % 4 >= shape[num][mode][17]) { if (shape[num][mode][i] == 0) { b = b + 2; } if (shape[num][mode][i] == 1) { if (matirx[a + y - 1][b + x] != 0) { return 1; } else b = b + 2; } } } }
//通过键盘键控制方块的变形模式,方向上键用于调节方块模式,下键用于加速方块下沉,左右键用于调整方块左右移动 void key_control(void) { int ch, flag = 1; struct termios save, raw; tcgetattr(0, &save); cfmakeraw(&raw); tcsetattr(0, 0, &raw); if (setjmp(env) == 0) { while (flag) { ch = getchar(); if (ch == '\r') { fall_down(); } if (ch == '\33') { ch = getchar(); if (ch == '[') { ch = getchar(); switch (ch) { case 'A': change_shape(); break; case 'B': move_down(); break; case 'C': move_right(); break; case 'D': move_left(); break; } } } if (ch == 'q' || ch == 'Q') { flag = 0; } } printf("\33[%d;%dH\33[31m-------------game interrupt exit!-----\33[0m",p_y + Y + 3, p_x); printf("\33[%d;0H\33[?25h", p_y + Y + 4); } tcsetattr(0, 0, &save); }
//当方块积攒到顶端时,方块若不能被销毁,则游戏结束,失败退出 void game_over(void) { int i; for (i = 0; i < X; i++) { if (matirx[1][i] != 0) { printf("\33[31m\33[%d;%dH-------------------------game over!-----------------\33[0m",p_y + Y + 3, p_x); printf("\33[0m\33[?25h\33[%d;0H", p_y + Y + 4); longjmp(env, 2); } } }