/* 俄罗斯方块程序 */
/* 此软件必须与EGAVGA.BGI文件在同一目录中才能运行 */
/* 改进方法如下: */
/* 1.建立一个含图形功能的新库文件 */
/* BGIOBJ EGAVGA */
/* TLIB LIB\GRAPHICS.LI+EGAVGA */
/* 2.在软件开发中使用新库GRAPHICS.LIB */
/* REGISTERBGIDRIVER(EGAVGA_DRIVER); */
# include <dos.h>
# include <graphics.h>
# include <stdlib.h>
# include <time.h>
# define len 20
# define wei 8
# define mid wei /2
# define L 15
struct m{int x,y;}
/* 方块图数据,按顺时针旋转存放 */
mo[7][4][4]={{{{0,-1},{-1,0},{1,0},{0,0}},
{{0,-1},{1,0},{0,1},{0,0}},
{{-1,0},{1,0},{0,1},{0,0}},
{{-1,0},{0,-1},{0,1},{0,0}}},
{{{-1,0},{0,1},{1,1},{0,0}},
{{0,-1},{-1,0},{-1,1},{0,0}},
{{-1,-1},{0,-1},{1,0},{0,0}},
{{1,-1},{1,0},{0,1},{0,0}}},
{{{1,0},{1,1},{0,1},{0,0}},
{{1,0},{1,1},{0,1},{0,0}},
{{1,0},{1,1},{0,1},{0,0}},
{{1,0},{1,1},{0,1},{0,0}}},
{{{-1,0},{0,1},{0,2},{0,0}},
{{0,-1},{-1,0},{-2,0},{0,0}},
{{0,-2},{0,-1},{1,0},{0,0}},
{{2,0},{1,0},{0,1},{0,0}}},
{{{0,3},{0,2},{0,1},{0,0}},
{{1,0},{2,0},{3,0},{0,0}},
{{0,3},{0,2},{0,1},{0,0}},
{{1,0},{2,0},{3,0},{0,0}}},
{{{1,0},{0,1},{0,2},{0,0}},
{{-2,0},{-1,0},{0,1},{0,0}},
{{0,-2},{0,-1},{-1,0},{0,0}},
{{0,-1},{2,0},{1,0},{0,0}}},
{{{0,-1},{1,-1},{-1,0},{0,0}},
{{0,-1},{1,0},{1,1},{0,0}},
{{0,-1},{1,-1},{-1,0},{0,0}},
{{0,-1},{1,0},{1,1},{0,0}}}};
int win[len+2][wei+2];
xprint(m,n1,n2,x1,x2,y1,y2)
/* M为方块图号,N1为方块图M的第N1号旋态,N2为方块M变前位坐标,X2,Y2为变化后坐标 */
int m,*n1,*n2,*x1,*x2,*y1,*y2;
{
int i,k;
/* 函数用于判断方块图M参数从N1,X1,Y1变为N2,X2,Y2是否合法 */
for(i=0;i<=3;i++)
{
k=(mo[m][*n2][i].y*L+*y2)/L;
if(k<=0)
continue;
if(win[k+1][(mo[m][*n2][i].x*L+*x2)/L+1]==1)
{
if(*y1!=*y2)
{
*y2=*y1;
*x2=*x1;
return(1);
}
if(*x1!=*x2)*x2=*x1;
if(*n1!=*n2)*n2=*n1;
return(0);
}
}
*n1=*n2;
*x1=*x2;
*y1=*y2;
return(0);
}
hprint(bitmap,m,n,x,y,c)
/* 打印方块图M,M为1号旋态,坐标(X,Y),颜色为C */
void far *bitmap;
int m,n,x,y,c;
{
int i,kx,ky;
for(i=0;i<=3;i++)
{
kx=mo[m][n][i].x*L+x;
ky=mo[m][n][i].y*L+y;
if(kx<0||ky<0)continue;
moveto(kx,ky);
putimage(kx,ky,bitmap,c);
}
}
xfill(bitmap,y)
/* 判断Y行是否填满 */
void far *bitmap;int y;
{
int i,j,ky;
if(y<0)return(0);
ky=y/L+1;
for(i=1;i<=wei;i++)
/* 如果满则Y行以上的方块下移 */
if(win[ky][i]==0)return(-1);
for(i=1;i<=wei;i++)
{
for(j=ky;j>2;j--)
{
if(win[j][i]==1 && win[j-1][i]==0)
putimage(i*L-L,j*L-L,bitmap,XOR_PUT);
else
if(win[j-1][i]==1)
putimage(i*L-L,j*L-L,bitmap,COPY_PUT);
win[j][i]=win[j-1][i];
}
}
return(1);
}
main()
{
void far *bitmap;
int m,n1,n2,x1,x2,y1,y2,i,j,sc,gadapter=DETECT,gmode;
int speed,Nm,Nn,count,k;
char ct;
x1=x2=mid*L;
y1=y2=0;
for(i=0;i<=len+1;i++)
for(j=0;j<=wei+1;j++)
if(j==0||j==wei+1||i==0||i==len+1)
win[i][j]=1;
else
win[i][j]=0;
initgraph(&gadapter,&gmode," ");
setbkcolor(0);
cleardevice();
setfillstyle(SOLID_FILL,GREEN);
bar(x1+1,y1+1,x1+L-1,y1+L-1);
bitmap=malloc(imagesize(x1+1,y1+1,x1+L-1,y1+L-1));
getimage(x1+1,y1+1,x1+L-1,y1+L-1,bitmap);
outtextxy(100,190,"This Game is made by Huang Gui Hua");
outtextxy(100,200,"Now please input 0 to 9 to choose speed");
ct=getch();
switch(ct)
/* 选择速度 */
{
case '0':
speed=500;
break;
case '1':
speed=450;
break;
case '2':
speed=400;
break;
case '3':
speed=350;
break;
case '4':
speed=300;
break;
case '5':
speed=250;
break;
case '6':
speed=200;
break;
case '7':
speed=150;
break;
case '8':
speed=100;
break;
case '9':
speed=80;
break;
otherwise:
speed=200;
break;
}
cleardevice();
/* 屏幕主窗口初始化 */
rectangle(199,0,wei*L+201,len*L+2);
setviewport(200,1,wei*L+200,len*L+1,1);
sc=0;
/* SC为加分计数器,置0 */
randomize();
/* 用随机数初始化方块图参数 */
m=random(7);
n1=n2=random(4);
Nm=random(7);
Nn=random(4);
setviewport(401,2,601,200,1);
/* 屏幕加分窗口初始化 */
rectangle(0,0,100,180);
outtextxy(1,10,"Your score:");
gotoxy(53,3);
printf("%d",sc);
outtextxy(1,50,"Next:");
hprint(bitmap,Nm,Nn,50,100,COPY_PUT);
setviewport(200,1,wei*L+200,len*L+1,1);
while(ct!=27)
{
if(kbhit())
/* 击键改变方块图参数 */
{
ct=getch();
if(ct==' ')n2=(++n2)%4;
else if(ct==0)
{
ct=getch();
if(ct==75)x2-=L;
else if(ct==77)x2+=L;
else if(ct==80)y2+=L;
else if(ct==72)getch();
}
}
else
{
y2+=L;
delay(speed);
}
hprint(bitmap,m,n1,x1,y1,COPY_PUT);
hprint(bitmap,m,n1,x1,y1,XOR_PUT);
if(xprint(m,&n1,&n2,&x1,&x2,&y1,&y2)==1)
if(kbhit())continue;
else
{
hprint(bitmap,m,n1,x1,y1,COPY_PUT);
/* 变化合法,固定方块,WIN[][]的各相应位赋1 */
count=0;
sound(500);
for(i=0;i<4;i++)
win[(mo[m][n1][i].y*L+y1)/L+1][(mo[m][n1][i].x*L+x1)/L+1]=1;
for(i=0;i<4;i++)
{
if(mo[m][n1][i].y+y1==0)
{
nosound();
exit(1);
}
if(xfill(bitmap,mo[m][n1][i].y*L+y1)==1)
/* 行满,消除掉并加分 */
{
k=mo[m][n1][i].y*L+y1;
for(i=0;i<4;i++)
{
if(xfill(bitmap,k)==1)
{
sc+=100;
/* 消除行数大于1时,每多1行COUNT加1,以后据COUNT多分 */
delay(100);
count++;
}
else
break;
}
sc+=100;
delay(100);
count++;
}
}
nosound();
x1=x2=mid*L;
y1=y2=0;
m=Nm;
n2=n1=Nn;
Nm=random(7);
/* 产生下一方块图 */
Nn=random(4);
if(count>1)
{
if(count==2)sc+=100;
if(count==3)sc+=200;
if(count==4)sc+=300;
}
setviewport(401,2,601,200,1);
/* 修改加分窗口 */
gotoxy(53,3);
printf("%d",sc);
hprint(bitmap,m,n1,50,100,COPY_PUT);
hprint(bitmap,m,n1,50,100,XOR_PUT);
hprint(bitmap,Nm,Nn,50,100,COPY_PUT);
setviewport(200,1,wei*L+200,len*L+1,1);
/* 恢复主窗口 */
}
else
hprint(bitmap,m,n1,x1,y1,COPY_PUT);
}
closegraph();
}
本文暂时没有评论,来添加一个吧(●'◡'●)