一个小白写的控制台的俄罗斯方块

我闲来无事,把俄罗斯方块也给写了,还是用Dev c++,控制台上的

#include<iostream>
#include <conio.h>
#include<windows.h>
#include<time.h> 
#include<stdlib.h>
#include<stdio.h>
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<<a[i][k];
  }
      cout<<endl;
    }
}
//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<<p;
for(int d=0;d<*had;d++)
{
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;
}

在下水平有限,只能写到这个水平了,虽然左右翻转,平移,以及消行等功能都有,但游戏体验很差,唉。。。。

一个小白写的控制台的俄罗斯方块