#include<stdio.h>
#include<conio.h>
#include<bios.h>
#define KEY_UP 0x48
#define KEY_LEFT 0x4B
#define KEY_RIGHT 0x4D
#define KEY_DOWN 0x50
#define TIME 10000
int i,j,score=0;/*所得分数*/
int p[7][4][4][4]={0};/*存放物体,7表示有7种物体,第一个4表示每种最多有4种变形*/
int a;/*在数组中确定是哪个物体*/
int b;/*确定变化后的物体*/
int x,y;/*光标位置标志*/
int q[18][14]={0};/*存放物体下落后形成的图形*/
int key;/*按键标志*/
int fast;/*按下加速标志*/
int die;/*死亡标志*/
void delay()/*延迟函数*/
{ long t1,t2,t3;
for(t1=0;t1<=1200;t1++)
for(t2=0;t2<=TIME;t2++)
if(0==fast)
{for(t3=0;t3<=15;t3++)
;
}
}
void boundary()/*显示边界,可移动有效范围为(21,5)~(35,23)*/
{j=5;
gotoxy(21,5);
for(i=0;i<14;i++)
printf("-");
gotoxy(21,24);
for(i=0;i<14;i++)
printf("-");
for(i=0;i<20;i++)
{gotoxy(20,j++);
printf("l");
}
j=5;
for(i=0;i<20;i++)
{
gotoxy(35,j++);
printf("l");
}
}
void show_object()/*显示物体*/
{ for(i=0;i<4;i++)
{gotoxy(x,y);
for(j=0;j<4;j++)
if(p[a][b][i][j]==0)
gotoxy(x+j+1,y);
else
printf("*");
y++;
}
y=y-4;
}
void graph()/*显示物体堆积后的图形*/
{ int m=21,n=6;
gotoxy(m,n);
for(i=0;i<18;i++)
{for(j=0;j<14;j++)
{if(q[i][j]==0)
printf(" ");/*若不输出空格,光标不移动。*/
else
printf("*");
}
printf("/n");
gotoxy(m,++n);
}
}
void show()/*总的显示函数*/
{ clrscr();
boundary();
graph();
show_object();
}
int arrive_boundaryl()/*判断有没有出左边*/
{int l=1;
for(j=0;j<4;j++)
for(i=0;i<4;i++)
if(p[a][b][i][j]==1&&x+j-1<21)
l=0;
return l;
}
int arrive_boundaryr()/*判断有没有出右边*/
{int r=1;
for(j=3;j>-1;j--)
for(i=0;i<4;i++)
if(p[a][b][i][j]==1&&x+j+1>34)
r=0;
return r;
}
void change()/*变换*/
{if(b>3)
b=0;
else
b++;
}
int dead()/*判断是否死亡*/
{int c=1;
for(i=0;i<14;i++)
if(q[1][i]==1)
c=0;
else
;
return c;
}
void get_grade()/*判断是否得分,有则要更新图形*/
{ int m,n;
for(i=0;i<18;i++)
for(j=0;j<14;j++)
{ if(q[i][j]==0)
break;
else
if(j==13)
{score++; /*分数加一*/
for(m=i;m>0;m--)
for(n=0;n<14;n++)
q[m][n]=q[m-1][n];
for(m=0;m<14;m++)
q[0][m]=0;
}/*得分则将上一行依次复制给该行*/
}
}
void move()/*计算能否继续向下运动*/
{int flag;
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
if(p[a][b][i][j]==1&&(q[y-5+i+1][x-21+j]==1||y+4==23))
{flag=0;break;
}
else
flag=1;
if(0==flag)
break;
}
if(flag)
y++;
else
{for(i=0;i<4;i++)
{for(j=0;j<4;j++)
if(p[a][b][i][j]==1)
q[y-5+i][x-21+j]=1;
}
get_grade();
a=rand()%7+0;
b=0;
x=25;y=4;
}
}
void main()
{a=5;
b=0;
x=25;y=4;
fast=0;
die=0;
p[0][0][0][1]=1;p[0][0][1][1]=1;p[0][0][2][1]=1;p[0][0][3][1]=1;/*长条及其变形*/
p[0][1][3][0]=1;p[0][1][3][1]=1;p[0][1][3][2]=1;p[0][1][3][3]=1;
p[0][2][0][1]=1;p[0][2][1][1]=1;p[0][2][2][1]=1;p[0][2][3][1]=1;
p[0][3][3][0]=1;p[0][3][3][1]=1;p[0][3][3][2]=1;p[0][3][3][3]=1;
p[1][0][2][2]=1;p[1][0][2][3]=1;p[1][0][3][2]=1;p[1][0][3][3]=1;/*正方体及其变形*/
p[1][1][2][2]=1;p[1][1][2][3]=1;p[1][1][3][2]=1;p[1][1][3][3]=1;
p[1][2][2][2]=1;p[1][2][2][3]=1;p[1][2][3][2]=1;p[1][2][3][3]=1;
p[1][3][2][2]=1;p[1][3][2][3]=1;p[1][3][3][2]=1;p[1][3][3][3]=1;
p[2][0][2][1]=1;p[2][0][3][0]=1;p[2][0][3][1]=1;p[2][0][3][2]=1;/*上型及其变形*/
p[2][1][1][1]=1;p[2][1][2][0]=1;p[2][1][2][1]=1;p[2][1][3][1]=1;
p[2][2][2][0]=1;p[2][2][2][1]=1;p[2][2][2][2]=1;p[2][2][3][1]=1;
p[2][3][1][1]=1;p[2][3][2][1]=1;p[2][3][2][2]=1;p[2][3][3][1]=1;
p[3][0][1][1]=1;p[3][0][1][2]=1;p[3][0][2][1]=1;p[3][0][3][1]=1;/*反7型及其变形*/
p[3][1][2][0]=1;p[3][1][3][0]=1;p[3][1][3][1]=1;p[3][1][3][2]=1;
p[3][2][1][1]=1;p[3][2][2][1]=1;p[3][2][3][0]=1;p[3][2][3][1]=1;
p[3][3][2][0]=1;p[3][3][2][1]=1;p[3][3][2][2]=1;p[3][3][3][2]=1;
p[4][0][1][1]=1;p[4][0][1][2]=1;p[4][0][2][2]=1;p[4][0][3][2]=1;/*7型及其变形*/
p[4][1][2][0]=1;p[4][1][2][1]=1;p[4][1][2][2]=1;p[4][1][3][0]=1;
p[4][2][1][0]=1;p[4][2][2][0]=1;p[4][2][3][0]=1;p[4][2][3][1]=1;
p[4][3][2][2]=1;p[4][3][3][0]=1;p[4][3][3][1]=1;p[4][3][3][2]=1;
p[5][0][2][1]=1;p[5][0][2][2]=1;p[5][0][3][0]=1;p[5][0][3][1]=1;/*反z型及其变形*/
p[5][1][1][1]=1;p[5][1][2][1]=1;p[5][1][2][2]=1;p[5][1][3][2]=1;
p[5][2][2][1]=1;p[5][2][2][2]=1;p[5][2][3][0]=1;p[5][2][3][1]=1;
p[5][3][1][1]=1;p[5][3][2][1]=1;p[5][3][2][2]=1;p[5][3][3][2]=1;
p[6][0][2][0]=1;p[6][0][2][1]=1;p[6][0][3][1]=1;p[6][0][3][2]=1;/*z型及其变形*/
p[6][1][1][2]=1;p[6][1][2][1]=1;p[6][1][2][2]=1;p[6][1][3][1]=1;
p[6][2][2][0]=1;p[6][2][2][1]=1;p[6][2][3][1]=1;p[6][2][3][2]=1;
p[6][3][1][2]=1;p[6][3][2][1]=1;p[6][3][2][2]=1;p[6][3][3][1]=1;
while(1)
{ while(!kbhit())
{y++;
delay();
move();
if(!dead())
{die=1;
goto over;
}
show();
fast=0;
}
key=getch();
switch(key)
{case KEY_UP:
change();break; /*变形*/
case KEY_DOWN:
fast=1;break; /*加速*/
case KEY_LEFT:
if(arrive_boundaryl())
x--;break;
case KEY_RIGHT:
if(arrive_boundaryr())
x++;break;
}
if(key==32)/*空格退出*/
break;
over:if(die)
{char again;
clrscr();
gotoxy(20,10);
printf("do you want again?y/n");
scanf("%c",&again);
if('y'==again)
{for(i=0;i<18;i++)
for(j=0;j<14;j++)
q[i][j]=0;
die=0;/*重新开始*/
}
else
break;
}
}
}
/*漏洞1:物体运动到两侧无法返回中间(已解决)*/
/*漏洞2:部分物体变形会出现错误*/
/*漏洞3:物体下落后形成的图形有些时候不对*/
/*漏洞4:不会死亡(已解决)*/
/*漏洞5:游戏结束按下y无法重新开始时*/