Linux下用C++实现俄罗斯方块
本文实例为大家分享了C++实现俄罗斯方块游戏代码,供大家参考,具体内容如下
1.block.c
#include<stdio.h> #include<termios.h> #include<unistd.h> #include<stdlib.h> #include<setjmp.h> #include<sys/time.h> #include<string.h> #include"block.h" //initforgloble void init_for_globle(void) { x=X/2-2;//thefirstdiamondappearpostion flag_erase=1; srand(getpid());//srand num=rand()%7;//randomappearfirstdiamond mode=rand()%4;//randomappearfirstdiamondmode color=rand()%7+41;//randomfirstdiamondcolor next_num=rand()%7; next_mode=rand()%4; save_color=rand()%7+41; print_start_interface();//printgamestartinterface //print_score();//printinitscore0 //print_level();//printinitlevel1 } //printstartinterface void print_start_interface(void) { intx,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); } //eraselastdiamonds void erase_last(void) { intj,x1,y1,n; x1=save_x+p_x+2; for(j=0,n=0;j<16;j++){ if(j/4>=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); } //printmodesshape void print_mode_shape(void) { intj,x1,y1,n; intleft_flag=0; if(flag_erase==0){ erase_last(); } x1=x+p_x+2; for(j=0,n=0;j<16;j++){ if(j/4>=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; } //storediamondstomatrixbycolortoflag void store_flag_color(void) { inti,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++; } } } } //printthesavematrix void print_save_matrix(void) { inti,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); } } } //changeshape void change_shape(void) { inti,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); } //moveright void move_right(void) { inti; if(x>=X-save_col*2||judge_by_color(x+2,mode)==1){ return; } x=x+2; print_mode_shape(); fflush(stdout); } //moveleft void move_left(void) { inti; if(x<=0||judge_by_color(x-2,mode)==1){ return; } x=x-2; print_mode_shape(); fflush(stdout); } //movedown void move_down() { 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=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); } } //erasenexttipdiamond void erase_next(void) { inti,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); } //printnexttipdiamond void print_next(void) { intj,n=0; erase_next(); for(j=0;j<16;j++){ if(j/4>=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); } } } } //printscoresinfo 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); } //printgradesinfo 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); } //destroyalineorlines void destroy_line(void) { inti,j,full; inta,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(); } } } //changelevel,changerate void change_level(void) { switch(level){ case1: setitimer(ITIMER_REAL,&level_01,NULL); break; case2: setitimer(ITIMER_REAL,&level_02,NULL); break; case3: setitimer(ITIMER_REAL,&level_03,NULL); break; case4: setitimer(ITIMER_REAL,&level_04,NULL); break; case5: setitimer(ITIMER_REAL,&level_05,NULL); break; case6: setitimer(ITIMER_REAL,&level_06,NULL); break; case7: setitimer(ITIMER_REAL,&level_07,NULL); break; case8: setitimer(ITIMER_REAL,&level_08,NULL); break; case9: setitimer(ITIMER_REAL,&level_09,NULL); break; default: break; } } //bythecolortojudgewhetherwentacrossornot int judge_by_color(intx,intmode) { inti,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){ return1; }else b=b+2; } } } } //controlthediamondsshapebythekey void key_control(void) { intch,flag=1; structtermiossave,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-----gameinterruptexit!-----\33[0m", p_y+Y+3,p_x); printf("\33[%d;0H\33[?25h",p_y+Y+4); } tcsetattr(0,0,&save); } //reachthetopline,thegameisover void game_over(void) { inti; for(i=0;i<X;i++){ if(matirx[1][i]!=0){ printf ("\33[31m\33[%d;%dH-------gameover!--------\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_ #definep_x10//initpostionrow; #definep_y5//initpostioncol; #defineX20//game_window_size #defineY20 #defineLEVEL_SCORE500//needscorestoupgrade jmp_bufenv; staticintx,y;//currentdiamondspostion staticintflag_erase;//eraseflag staticintnum,mode,next_num,next_mode;//currentandnextdiamonds staticintsave_row,save_col,save_x,save_y,save_mode;//savecoordinate,savegraph staticintcolor,save_color,flag_color;//savethecolorofthenextdiamonds staticintmatirx[Y][X]={0};//savediamonds'matrix staticintlevel=1;//gamelevels staticintscore=0;//gamescores typedefstructitimervalLEVEL; staticLEVELlevel_00={{0,0},{0,0}}; staticLEVELlevel_01={{0,800000},{1,0}}; staticLEVELlevel_02={{0,500000},{0,500000}}; staticLEVELlevel_03={{0,400000},{0,300000}}; staticLEVELlevel_04={{0,300000},{0,300000}}; staticLEVELlevel_05={{0,200000},{0,300000}}; staticLEVELlevel_06={{0,150000},{0,300000}}; staticLEVELlevel_07={{0,100000},{0,300000}}; staticLEVELlevel_08={{0,80000},{0,300000}}; staticLEVELlevel_09={{0,60000},{0,300000}}; //three-dimensionalforsavingdiamondsanddiamonds'shape: //first-dimensionalforkindofdiamonds-shape //second-dimensionalforalterable'smode //third-dimensionalforrealityvalueofrowandcol staticconstintshape[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}}//[] }; voidinit_for_globle(void); voidprint_start_interface(void); voidprint_mode_shape(void); voidprint_save_matrix(void); voidchange_shape(void); voidmove_left(void); voidmove_right(void); voidmove_down(); voidfall_down(); voidstore_flag_color(void); voidkey_control(void); voiderase_last(void); voiddestroy_line(void); voidprint_next(void); voiderase_next(void); voidchange_level(void); voidprint_score(void); voidprint_level(void); intjudge_by_color(intx,intmode); voidgame_over(void); #endif
3.main.c
#include<stdio.h> #include<signal.h> #include<sys/time.h> #include<setjmp.h> #include"block.h" int main(intargc,char**argv) { init_for_globle();//initforgloble print_mode_shape();//printfirstdiamond print_next();//printnextdiamond setitimer(ITIMER_REAL,&level_01,NULL);//initoneleve;interval800ms signal(SIGALRM,move_down);//diamonddownbaseontheintervaltime key_control();//usingzhekeytoplaygames return0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。