• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Linux下用C++实现俄罗斯方块

c++ 搞代码 4年前 (2022-01-06) 36次浏览 已收录 0个评论

这篇文章主要为大家详细介绍了Linux下用C++实现俄罗斯方块的相关资料,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++实现俄罗斯方块游戏代码,供大家参考,具体内容如下

1.block.c

 #include  #include  #include  #include  #include  #include  #include  #include "block.h" //init for globle void init_for_globle(void) { x = X / 2 - 2;   // the first diamond appear postion flag_erase = 1; srand(getpid());  //srand num = rand() % 7;  // random appear first diamond mode = rand() % 4; // random appear first diamond mode color = rand() % 7 + 41;  // random first diamond color next_num = rand() % 7; next_mode = rand() % 4; save_color = rand() % 7 + 41; print_start_interface();  // print game start interface // print_score();   // print init score 0 // print_level();   // print init level 1 } //print start interface 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); } //erase last diamonds void erase_last(void) { int j, x1, y1, n; x1 = save_x + p_x + 2; for (j = 0, n = 0; j = shape[num][save_mode][16] && j % 4 == 0) { y1 = save_y + p_y + 1 + n; printf("\33[%d;%dH", y1, x1); n++; } if (j / 4 >= shape[num][save_mode][16] && j % 4 >= shape[num][save_mode][17]) { if (shape[num][save_mode][j] == 0) { printf("\33[2C"); } if (shape[num][save_mode][j] == 1) { printf(" "); } } } fflush(stdout); } //print modes shape void print_mode_shape(void) { int j, x1, y1, n; int left_flag = 0; if (flag_erase == 0) { erase_last(); } x1 = x + p_x + 2; for (j = 0, n = 0; j = shape[num][mode][16] && j % 4 == 0) { y1 = y + p_y + 1 + n; printf("\33[%d;%dH", y1, x1); n++; } if (j / 4 >= shape[num][mode][16] && j % 4 >= shape[num][mode][17]) { if (shape[num][mode][j] == 0) { printf("\33[2C"); } if (shape[num][mode][j] == 1) { printf("\33[%dm[]\33[0m", color); } } fflush(stdout); } printf("\33[0m"); fflush(stdout); save_x = x; save_y = y; save_mode = mode; save_row = 4 - shape[num][mode][16]; save_col = 4 - shape[num][mode][17]; flag_erase = 0; } //store diamonds to matrix by color to flag void store_flag_color(void) { int i, a = 0, b = 0; for (i = 0; i = 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++; } } } } //print the save matrix 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); } } } // change shape void change_shape(void) { int i, n; for (i = 0; i = X - save_col * 2 && save_col = X - save_col * 2 || judge_by_color(x + 2, mode) == 1) { return; } x = x + 2; print_mode_shape(); fflush(stdout); } // move left void move_left(void) { int i; if (x = Y - save_row + 1 || judge_by_color(x, mode) == 1) { store_flag_color(); game_over(); y = 0; save_row = 0; save_col = 0; x = X / 2 - 2; num = next_num; mode = next_mode; color = save_color; next_num = random() % 7; next_mode = random() % 4; save_color = random() % 7 + 41; print_next(); flag_erase = 1; destroy_line(); fflush(stdout); return; } print_mode_shape(); fflush(stdout); } void fall_down() { while (1) { y++; if (y >= Y - save_row + 1 || judge_by_color(x, mode) == 1) { store_flag_color(); game_over(); y = 0; save_row = 0; save_col = 0; x = X / 2 - 2; num = next_num; mode = next_mode; color = save_color; next_num = rand() % 7; next_mode = rand() % 4; save_color = rand() % 7 + 41; print_next(); flag_erase = 1; destroy_line(); fflush(stdout); return; } print_mode_shape(); fflush(stdout); } } //erase next tip diamond void erase_next(void) { int i, j, n = 0; for (i = 0; i <4; i++) { printf("\33[%d;%dH", p_y + 3 + n, p_x + X + 7); n++; for (j = 0; j <4; j++) { printf(" "); } } printf("\33[30;4H\33[?25l"); fflush(stdout); } //print next tip diamond void print_next(void) { int j, n = 0; erase_next(); for (j = 0; j = shape[next_num][next_mode][16] && j % 4 == 0) { printf("\33[%d;%dH", p_y + 3 + n, p_x + X + 7); n++; } if (j / 4 >= shape[next_num][next_mode][16] && j % 4 >= shape[next_num][next_mode][17]) { if (shape[next_num][next_mode] == 0) { printf("\33[2C"); } if (shape[next_num][next_mode][j] == 1) { printf("\33[%dm[]\33[0m", save_color); } } } } //print scores info void print_score(void) { printf("\33[%d;%dH\33[31m%d\33[0m", p_y + 10, p_x + X + 10, score); fprintf(stdout, "\33[%d;0H", p_y + 20 + 2); } //print grades info void print_level(void) { printf("\33[%d;%dH\33[31m%d\33[0m", p_y + 14, p_x + X + 10, level); fprintf(stdout, "\33[%d;0H", p_y + 20 + 2); } //destroy a line or lines 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 = 9) level = 9; change_level(); print_level(); } print_score(); } } } //change level , change rate 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; } } //by the color to judge whether went across or not int judge_by_color(int x, int mode) { int i, a = 0, b = 0; for (i = 0; i = 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; } } } } //control the diamonds shape by the key 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); } //reach the top line, the game is over 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); } } } 

2.block.h

 #ifndef _BLOCK_H_ #define _BLOCK_H_ #define p_x 10      //init postion row; #define p_y 5      //init postion col; #define X 20          // game_window_size #define Y 20 #define LEVEL_SCORE 500     // need scores to upgrade jmp_buf env; static int x, y;                   //  current diamonds postion static int flag_erase;                  //  erase flag static int num, mode, next_num, next_mode;        //  current and next diamonds static int save_row, save_col, save_x, save_y, save_mode;//  save coordinate, save graph static int color, save_color, flag_color;           //  save the color of the next diamonds static int matirx[Y][X] = { 0 };             //  save diamonds' matrix static int level = 1;                   //  game levels static int score = 0;           //  game scores typedef struct itimerval LEVEL; static LEVEL level_00 = { {0,   0}, {0,   0} }; static LEVEL level_01 = { {0, 800000}, {1,   0} }; static LEVEL level_02 = { {0, 500000}, {0, 500000} }; static LEVEL level_03 = { {0, 400000}, {0, 300000} }; static LEVEL level_04 = { {0, 300000}, {0, 300000} }; static LEVEL level_05 = { {0, 200000}, {0, 300000} }; static LEVEL level_06 = { {0, 150000}, {0, 300000} }; static LEVEL level_07 = { {0, 100000}, {0, 300000} }; static LEVEL level_08 = { {0, 80000 }, {0, 300000} }; static LEVEL level_09 = { {0, 60000 }, {0, 300000} }; //three-dimensional for saving diamonds and diamonds' shape : //first-dimensional for kind of diamonds-shape //second-dimensional for alterable's mode //third-dimensional for reality value of row and col static const int shape[7][4][18] = { {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1,   2, 1},  // {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0,   1, 2},  //  []  []  [][][]   [] {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0,   2, 1},  // [][][] [][]  []   [][] {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1,   1, 2}}, //     []        [] {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1,   2, 1},  // {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1,   1, 2}, //     []      [][] {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0,   2, 1},  //   [] []  [][][]  [] {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1,   1, 2}},  // [][][] [][] []    [] {{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1,   1, 2},  // {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1,   2, 1},  //     [][]      [] {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0,   1, 2},  // []    []  [][][]  [] {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1,   2, 1}}, // [][][]  []    [] [][] {{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1,   1, 2},  // {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0,   2, 1},  //  [] {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1,   1, 2},  //  [][]   [][] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0,   2, 1}}, //    []  [][] {{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0,   1, 2},  // {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1,   2, 1},  //   [] {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0,   1, 2},  //  [][]  [][] {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1,   2, 1}}, //  []    [][] {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1,   2, 2},  // {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1,   2, 2},  // {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1,   2, 2},  //   [][] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1,   2, 2}}, //   [][] {{0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1,   0, 3},  //   [] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,   3, 0},  //   []   [][][][] {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1,   0, 3},  //   [] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,   3, 0}}  //   [] }; void init_for_globle(void); void print_start_interface(void); void print_mode_shape(void); void print_save_matrix(<div style="color:transparent">来源gaodai.ma#com搞##代!^码网</div>void); void change_shape(void); void move_left(void); void move_right(void); void move_down(); void fall_down(); void store_flag_color(void); void key_control(void); void erase_last(void); void destroy_line(void); void print_next(void); void erase_next(void); void change_level(void); void print_score(void); void print_level(void); int judge_by_color(int x, int mode); void game_over(void); #endif 

3.main.c

 #include  #include  #include  #include  #include "block.h" int main(int argc, char **argv) { init_for_globle(); //init for globle print_mode_shape(); //print first diamond print_next();    //print next diamond setitimer(ITIMER_REAL, &level_01, NULL);  //init one leve ;interval 800ms signal(SIGALRM, move_down); //diamond down base on the interval time key_control();   //using zhe key to play games return 0; }

以上就是Linux下用C++实现俄罗斯方块的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Linux下用C++实现俄罗斯方块
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址