查看文章
C语言写的俄罗斯方块
#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ESC 0x011b
#define SPACE 0x3920
int a[7][7],b[4][4];
initialize()
{
int driver,gmode;
driver=VGA;
gmode=VGAHI;
initgraph(&driver,&gmode,"");
}
fangkuai(int x,int y)
{
int p[8];
x=x*20+10;
y=y*20+10;
p[0]=x;p[1]=y;
p[2]=x+20;p[3]=y;
p[4]=x+20;p[5]=y+20;
p[6]=x;p[7]=y+20;
setcolor(GREEN);
setfillstyle(SOLID_FILL,DARKGRAY);
fillpoly(4,p);
drawpoly(4,p);
}
xiantiao(int wid,int deg,int x,int y,int z)
{
int i;
setcolor(RED);
if(deg==0)
{
for(i=0;i<wid;i++)
line(x+i,y,x+i,z);
}
else
if(deg==90)
{
for(i=1;i<=wid;i++)
line(x,y+i,z,y+i);
}
}
drawall(int x,int y)
{
int c,i,j,xmin,ymin;
for(i=0;i<7;i++)
for(j=0;j<7;j++)
a[ i][j]=0;
c=0;
i=j=3;
xmin=ymin=3;
while(c<4)
{
if(a[ i][j]==0)
{
a[ i][j]=1;
if(i<xmin) xmin=i;
if(y<ymin) ymin=j;
c++;
}
switch(random(3))
{
case 0:i++;break;
case 1:j++;break;
case 2:i--;break;
case 3:j--;break;
}
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
b[ i][j]=a[i+xmin][j+ymin];
if(b[ i][j]==1)
fangkuai(x+i,y+j);
}
}
clr(int x,int y,int xx,int yy)
{
setfillstyle(SOLID_FILL,LIGHTBLUE);
bar(x*20+10,y*20+10,xx*20+10,yy*20+10);
}
void main()
{
int i,j,key,top,up,count,count1,xm,ym,cd,score,c[12][21],d[4][4];
char s[5];
score=0;
for(i=0;i<12;i++)
for(j=0;j<21;j++)
c[ i][j]=0;
for(i=0;i<21;i++)
{
c[0][ i]=1;
c[11][ i]=1;
}
for(i=1;i<11;i++)
c[ i][20]=1;
initialize();
setbkcolor(LIGHTBLUE);
setcolor(RED);
randomize();
xiantiao(5,0,5+20,10,410);
xiantiao(5,0,211+20,10,410);
xiantiao(5,90,5+20,410,215+20);
moveto(150,450);
outtext("<Press Key:MOVE LEFT,REGHT::DOWN DOWN:: CHANGE SPACE>");
while(1)
{
key=bioskey(0);
if(ESC==key)
break;
top=0;
up=4;
xm=ym=4;
clr(15,10,19,14);
drawall(15,10);
bar(250,250,290,290);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
itoa(b[ i][j],s,10);
moveto(250+i*10,250+j*10);
outtext(s);
}
for(i=0;i<4;i++)
{
count=0;
for(j=0;j<4;j++)
{
if(b[ i][j]==0)
count=count+1;
}
if(count==4)
xm--;
}
for(j=0;j<4;j++)
{
count=0;
for(i=0;i<4;i++)
{
if(b[ i][j]==0)
count=count+1;
}
if(count==4)
ym--;
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(b[ i][j]==1)
fangkuai(up+i,top+j);
while(1)
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(b[ i][j]==1&&c[up+i][top+j]==1)
break;
bar(400,100,520,310);
for(i=0;i<12;i++)
for(j=0;j<21;j++)
{
moveto(400+10*i,100+10*j);
itoa(c[ i][j],s,10);
outtext(s);
}
key=bioskey(0);
if(ESC==key)
break;
if(LEFT==key)
{
count=0;
for(j=0;j<ym;j++)
{
for(i=0;i<xm;i++)
{
if(b[ i][j]==1) break;
}
if(c[up+i-1][top+j]==1)
break;
else
count=count+1;
}
if(count==ym)
{
clr(up-1,top,up+xm,top+ym);
for(i=up;i<up+xm;i++)
for(j=top;j<top+ym;j++)
if(b[i-up][j-top]==1)
{
c[ i][j]=0;
c[i-1][j]=1;
}
for(i=up-1;i<up+xm;i++)
for(j=top;j<top+ym;j++)
{
if(c[ i][j]==1) fangkuai(i,j);
}
up--;
}
}
if(RIGHT==key)
{
count=0;
for(j=0;j<ym;j++)
{
for(i=xm-1;i>=0;i--)
{
if(b[ i][j]==1) break;
}
if(c[up+i+1][top+j]==1)
break;
else
count=count+1;
}
if(count==ym)
{
clr(up,top,up+xm+1,top+ym);
for(i=up+xm-1;i>=up;i--)
for(j=top+ym-1;j>=top;j--)
if(b[i-up][j-top]==1)
{
c[ i][j]=0;
c[i+1][j]=1;
}
for(i=up;i<=up+xm;i++)
for(j=top;j<top+ym;j++)
if(c[ i][j]==1)
fangkuai(i,j);
up++;
}
}
if(SPACE==key)
{
clr(up,top,xm+up,ym+top);
for(i=up;i<xm+up;i++)
for(j=top;j<top+ym;j++)
if(b[i-up][j-top]==1)
c[ i][j]=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
d[ i][j]=b[ i][j];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
b[ i][j]=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
b[3-j][ i]=d[ i][j];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
d[ i][j]=b[ i][j];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
b[ i][j]=0;
xm=ym=0;
count=count1=4;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(d[ i][j]==1)
{
if(count>i) count=i;
if(count1>j) count1=j;
if(ym<i) ym=i;
if(xm<j) xm=j;
}
for(i=count;i<=ym;i++)
for(j=count1;j<=xm;j++)
if(d[ i][j]==1)
b[i-count][j-count1]=1;
xm=ym=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(b[ i][j]==1)
{
if(xm<i) xm=i;
if(ym<j) ym=j;
}
xm++;
ym++;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(b[ i][j]==1)
c[up+i][top+j]=1;
for(i=top;i<top+ym;i++)
for(j=up;j<up+xm;j++)
if(c[j][ i]==1) fangkuai(j,i);
}
if(DOWN==key)
{
count=0;
for(i=0;i<xm;i++)
{
for(j=ym;j>=0;j--)
{
if(b[ i][j]==1) break;
}
if(c[up+i][top+j+1]==1)
break;
else
count=count+1;
}
if(count==xm)
{
clr(up,top,xm+up,top+ym+1);
for(j=top+ym-1;j>=top;j--)
for(i=up;i<up+xm;i++)
if(b[i-up][j-top]==1)
{
c[ i][j]=0;
c[ i][j+1]=1;
}
for(i=up;i<up+xm;i++)
for(j=top;j<=top+ym;j++)
{
if(c[ i][j]==1) fangkuai(i,j);
}
top++;
}
else
break;
}
for(i=0;i<20;i++)
{
count=0;
for(j=1;j<11;j++)
{
count=count+c[j][ i];
if(count==10)
{
for(count1=i;count1>=0;count1--)
for(j=1;j<11;j++)
{
if(count1==0)
c[j][count1]=0;
else
c[j][count1]=c[j][count1-1];
}
score++;
bar(300,100,350,110);
moveto(300,100);
outtext(itoa(score,s,10));
setfillstyle(SOLID_FILL,LIGHTBLUE);
bar(1*20+10,0,11*20+10,20*20+10);
for(i=0;i<20;i++)
for(j=1;j<11;j++)
{
if(c[j][ i]==1)
fangkuai(j,i);
}
}
}
}
}
}
}