程序员开发实例大全宝库

网站首页 > 编程文章 正文

TC 2.0源文件:俄罗斯方块程序(开源俄罗斯方块)

zazugpt 2024-09-07 01:56:47 编程文章 19 ℃ 0 评论

/* 俄罗斯方块程序 */

/* 此软件必须与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();

}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表