我闲来无事,把俄罗斯方块也给写了,还是用Dev c++,控制台上的
#include for(int d=0;d<*had;d++) } 在下水平有限,只能写到这个水平了,虽然左右翻转,平移,以及消行等功能都有,但游戏体验很差,唉。。。。
#include
#include
#include
#include
#include
struct point{
int x,y;
};
struct row{
point p[4];
};
row image[7][4]=
{
{
/*
□■■□ □■■□ □■■□ □■■□
□■■□ □■■□ □■■□ □■■□
□□□□ □□□□ □□□□ □□□□
□□□□ □□□□ □□□□ □□□□
*/
{{{0,1},{0,2},{1,1},{1,2}}},
{{{0,1},{0,2},{1,1},{1,2}}},
{{{0,1},{0,2},{1,1},{1,2}}},
{{{0,1},{0,2},{1,1},{1,2}}},
},
{
/*
□■□□ □■■□ □■□□ □■■□
□■■□ ■■□□ □■■□ ■■□□
□□■□ □□□□ □□■□ □□□□
□□□□ □□□□ □□□□ □□□□
*/
{{{0,1},{1,1},{1,2},{2,2}}},
{{{0,1},{0,2},{1,0},{1,1}}},
{{{0,1},{1,1},{1,2},{2,2}}},
{{{0,1},{0,2},{1,0},{1,1}}},
},
{
/*
□□■□ ■■□□ □□■□ ■■□□
□■■□ □■■□ □■■□ □■■□
□■□□ □□□□ □■□□ □□□□
□□□□ □□□□ □□□□ □□□□
*/
{{{0,2},{1,1},{1,2},{2,1}}},
{{{0,0},{0,1},{1,1},{1,2}}},
{{{0,2},{1,1},{1,2},{2,1}}},
{{{0,0},{0,1},{1,1},{1,2}}},
},
{
/*
□■□□ □□□□ ■■□□ □□■□
□■□□ ■■■□ □■□□ ■■■□
□■■□ ■□□□ □■□□ □□□□
□□□□ □□□□ □□□□ □□□□
*/
{{{0,1},{1,1},{2,1},{2,2}}},
{{{1,0},{1,1},{1,2},{2,0}}},
{{{0,0},{0,1},{1,1},{2,1}}},
{{{0,2},{1,0},{1,1},{1,2}}},
},
{
/*
□■□□ ■□□□ □■■□ □□□□
□■□□ ■■■□ □■□□ ■■■□
■■□□ □□□□ □■□□ □□■□
□□□□ □□□□ □□□□ □□□□
*/
{{{0,1},{1,1},{2,0},{2,1}}},
{{{0,0},{1,0},{1,1},{1,2}}},
{{{0,1},{0,2},{1,1},{2,1}}},
{{{1,0},{1,1},{1,2},{2,2}}},
},
{
/*
□■□□ □■□□ □□□□ □■□□
■■■□ □■■□ ■■■□ ■■□□
□□□□ □■□□ □■□□ □■□□
□□□□ □□□□ □□□□ □□□□
*/
{{{0,1},{1,0},{1,1},{1,2}}},
{{{0,1},{1,1},{1,2},{2,1}}},
{{{1,0},{1,1},{1,2},{2,1}}},
{{{0,1},{1,0},{1,1},{2,1}}},
},
{
/*
□■□□ □□□□ □■□□ □□□□
□■□□ ■■■■ □■□□ ■■■■
□■□□ □□□□ □■□□ □□□□
□■□□ □□□□ □■□□ □□□□
*/
{{{0,1},{1,1},{2,1},{3,1}}},
{{{1,0},{1,1},{1,2},{1,3}}},
{{{0,1},{1,1},{2,1},{3,1}}},
{{{1,0},{1,1},{1,2},{1,3}}},
}
} ;
void putboard(char a[40][40],row R[200],int *had);
row creat(int *f,int *x,int *y);//产生随机数以产生各种图形 ,f用来判断当前的图形是否落地,若未落地,在空中则为1,
void deleteline(row R[200],char a[40][40],int *had);//消行
int getmove(int d);//得到命令
void imagego(int *f,int *d,row *r,char a[40][40],row R[200],int *y,int *x,int *heng,int *zong,int *had);//f判断落地,d表示左右上下及翻转,a显示移动中的,R存储落地的
int ifover(char a[40][40]);//判断是否失败 失败就返回0 //had是已有的元素个数
void showboard(char a[40][40]);//展示整个界面
using namespace std;
int main()
{
int f=0;int d;int x,y;row r;row R[200];int heng=0;int zong=0;int had=0 ;
char a[40][40];
r=image[5][3];
while(true)
{
putboard(a,R,&had);
d=getmove(d);
if(f==0){r=creat(&f,&x,&y);}
imagego(&f,&d,&r,a,R,&y,&x,&heng,&zong,&had);
deleteline(R,a,&had);
showboard(a);
for(int md=0;md<4;md++)
{
if(R[had-1].p[md].x==1&&had>0)
{
cout<<"GAME OVER";
return 0;
}
}
Sleep(700);
system("cls");
}
}
row creat(int *f,int *x,int *y)
{
row r;
srand((unsigned)time(NULL));
*x=rand()%7;//产生7个图案的一个
*y=rand()%4;//产生4个方向中的一个
r=image[*x][*y];
for(int o=0;o<4;o++){r.p[o].y=r.p[o].y+12;}
*f=1;
return r;
}
void imagego(int *f,int *d,row *r,char a[40][40],row R[200],int *y,int *x,int *heng,int *zong,int *had)//heng表示从开始到现在左右移动格数
{
for(int l=0;l<4;l++){a[r->p[l].x][r->p[l].y]='*';}
switch(*d)
{
case 1:
while(a[r->p[0].x+2][r->p[0].y]!='-'&&a[r->p[1].x+2][r->p[0].y]!='-'&&a[r->p[2].x+2][r->p[0].y]!='-'&&a[r->p[3].x+2][r->p[0].y]!='-')
{
for(int zd=0;zd<4;zd++)
{
r->p[zd].x=r->p[zd].x+1;
}
}
*f=0;*heng=0;*zong=0;
*d=0;
break;
case 2:
if(r->p[0].y<34&&r->p[1].y<34&&r->p[2].y<34&&r->p[3].y<34)
{
for(int q=0;q<4;q++)
{
r->p[q].y++;
*heng=*heng+1;
}
}
else *d=0;
break;
case 3:
if(r->p[0].y>1&&r->p[1].y>1&&r->p[2].y>1&&r->p[3].y>1)
{
for(int q=0;q<4;q++)
{
r->p[q].y--;
*heng=*heng-1;
}
}
else *d=0;
break;
case 4:
if((*y+1)!=4)*y=*y+1;
else *y=0;
*r=image[*x][*y];
for(int mm=0;mm<4;mm++)
{
r->p[mm].x=r->p[mm].x+*zong-10;
r->p[mm].y=r->p[mm].y+*heng+12;
}
*d=0;
break;
case 5:
if((*y-1)!=-1)*y=*y-1;
else *y=3;
*r=image[*x][*y];
for(int mm=0;mm<4;mm++)
{
r->p[mm].x=r->p[mm].x+*zong-10;
r->p[mm].y=r->p[mm].y+*heng+12;
}
*d=0;
break;
}
for(int u=0;u<4;u++)
{
r->p[u].x+=1;
*zong=*zong+1;
}
if(a[r->p[0].x+1][r->p[0].y]=='-'||a[r->p[1].x+1][r->p[1].y]=='-'||a[r->p[2].x+1][r->p[2].y]=='-'||a[r->p[3].x+1][r->p[3].y]=='-')
{
for(int qq=0;qq<4;qq++)
{
R[*had].p[qq].x=r->p[qq].x;
R[*had].p[qq].y=r->p[qq].y;
}
*f=0;*heng=0;*zong=0;*had=*had+1;
}
}
void putboard(char a[40][40],row R[200],int *had)
{
int c,b;
for(int i=0;i<35;i++)
{
for(int k=0;k<35;k++)
{
a[i][k]=' ';
}
}
for(int i=2;i<25;i++)a[i][0]='|'; // int y=rand()%28+1;
for(int i=2;i<25;i++)a[i][34]='|';
for(int k=1;k<34;k++)a[21][k]='-';
for(int k=0;k<35;k++)a[24][k]='-';//产生墙壁
for(int uu=0;uu<*had;uu++)
{
for(int uuu=0;uuu<4;uuu++)
{
c=R[uu].p[uuu].x ;
b=R[uu].p[uuu].y;
a[c][b]='-';
}
}
}
int getmove(int d)
{
char c;int dir=d;
if(_kbhit()) //kbhit判断是否有键盘输入
{
c=getchar();
if(c=='s'){dir=1;}
else if(c=='d'){dir=2;}//a左移 d右移 s加快直接下来 r右旋 l左旋
else if(c=='a'){dir=3;}
else if(c=='r'){dir=4;}
else if(c=='l'){dir=5;}
}
return dir;
}
void showboard(char a[40][40])
{
for(int i=0;i<25;i++)
{
for(int k=0;k<35;k++)
{
cout< }
cout<
}
//d表示左右下移,f表示横竖,x,y表示初始位置,p存储以触底的点
void deleteline(row R[200],char a[40][40],int *had)
{
int i=1;
for(int p=23;p>10;p--)//检查是否有某行全是-
{
while(a[p][i]=='-'){i++;}
if(i>32)//则第p行全是
{
cout<
{
for(int s=0;s<4;s++)
{
if(R[d].p[s].x==p)
{
R[d].p[s].x=24;
}
} //消行
}
for(int pp=1;pp<34;pp++)
{
for(int zz=p;zz>=3;zz--)
{
a[zz][pp]=a[zz-1][pp];
}
}
}
i=1;
}