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;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。