俄罗斯方块代码 C++(
#include #include #include
#include #include #include #include
#define ESC 0x011b #define UP 0x4800 #define DOWN 0x5000 #define LEFT 0x4b00 #define RIGHT 0x4d00 #define SPACE 0x3920 #define Y 0x1579
#define N 0x316e
#define clearkbd(); while(bioskey(1)) bioskey(0);
void update();
void messagebox(); void process();
void initremove(); void initinfo();
void initbox();
void initposition(); void next_shape();
typedef struct shape { int attr;
int co[8];
}shape;
typedef struct RE_AB { int Rx,Ry;
int x1,x2,y1,y2;
}RE_AB;
RE_AB RA;
shape p[19]={ { RED,0,1,1,0,1,1,2,1 },
{ RED,0,1,1,0,1,1,1,2 }, { RED,0,0,1,0,2,0,1,1 }, { RED,0,0,0,1,1,1,0,2 }, { GREEN,0,0,1,0,2,0,3,0 },
{ GREEN,0,0,0,1,0,2,0,3 }, { CYAN,0,0,0,1,1,0,1,1 }, { BROWN,0,0,1,0,1,1,2,1 }, { BROWN,1,0,0,1,1,1,0,2 }, { BLUE,1,0,2,0,1,1,0,1 }, { BLUE,0,0,0,1,1,1,1,2 }, { MAGENTA,0,0,0,1,0,2,1,2 }, { MAGENTA,2,0,0,1,1,1,2,1}, { MAGENTA,0,0,1,0,1,1,1,2 }, { MAGENTA,0,0,0,1,1,0,2,0 }, { YELLOW,0,2,1,0,1,1,1,2 }, { YELLOW,0,0,1,0,2,0,2,1 }, { YELLOW,1,0,0,0,0,1,0,2}, { YELLOW,0,0,0,1,1,1,2,1 }, };
int nback,nleft,nright,r_f[12][22],rs1,rs2,xcors,xcorb,ycors,ycorb;
void interrupt (*oldint)(); int count_down=0,count_other=0;
void interrupt newint() { count_down++;
count_other++;
oldint();
}
void intenable()
{ oldint=getvect(0x1c); disable();
setvect(0x1c,newint);
enable();
}
void intrestore()
{ disable();
setvect(0x1c,oldint);
enable();
}
void HZ12(int x0,int y0,int w,int color,char *s)
{ FILE *fp;
register char buffer[24];
register char str[2]; unsigned long fpos; register int i,j,k; fp=fopen("hzk12","r"); while(*s)
{
if(*s<0)
{ str[0]=(*s)-0xa0; str[1]=*(s+1)-0xa0; fpos=((str[0]-1)*94+(str[1]-1))*24L;
fseek(fp,fpos,SEEK_SET); fread(buffer,24,1,fp); for(i=0;i<12;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
putpixel(x0+8*j+k,y0+i,color);
s+=2;
x0+=w;
}
else
{ settextstyle(0,0,1); setcolor(color);
str[0]=*s;str[1]=0; outtextxy(x0,y0+3,str); x0+=w-7;
s++;
}
}
fclose(fp);
}
void translation() { if(RA.Rx==1)
{ RA.x1=1; RA.x2=16; } else
{ RA.x1=16*(RA.Rx-1); RA.x2=16*RA.Rx; }
if(RA.Ry==1)
{ RA.y1=1; RA.y2=16; } else
{ RA.y1=16*(RA.Ry-1); RA.y2=16*RA.Ry; }
}
int check_b()
{ int x,y,i,zf=0; for(i=0;i<7;i++,i++) { x=RA.Rx+p[rs1].co[i]; y=RA.Ry+p[rs1].co[i+1]; if(y>=6)
zf+=r_f[x-15][y-6+1]; }
if(zf==0)
return 1;
else
return 0;
}
int finish()
{ int tfull=0,i;
for(i=1;i<11;i++) tfull+=r_f[i][1]; if(tfull!=0)
return 1;
}
int check_l()
{ int x,y,i,zf=0; for(i=0;i<7;i++,i++) { x=RA.Rx+p[rs1].co[i]; y=RA.Ry+p[rs1].co[i+1]; if(y>6)
zf+=r_f[x-15-1][y-6]; if(y<=6&&x==16)
zf+=1;
}
if(zf==0)
return 1;
else
return 0;
}
int check_r()
{
int x,y,i,zf=0;
for(i=0;i<7;i++,i++) {
x=RA.Rx+p[rs1].co[i]; y=RA.Ry+p[rs1].co[i+1];
if(y>6)
zf+=r_f[x-15+1][y-6]; if(y<=6&&x==25)
zf+=1;
}
if(zf==0)
return 1;
else
return 0;
}
void check_touch() { nback=check_b(); nleft=check_l();
nright=check_r();
}
void draw(int cb)
{ int i,recordx=RA.Rx,recordy=RA.Ry;
for(i=0;i<7;i++,i++) { RA.Rx+=p[rs1].co[i]; RA.Ry+=p[rs1].co[i+1]; if(RA.Ry<=6)
{ RA.Rx=recordx;
RA.Ry=recordy;
continue;
}
translation();
if(cb==1)
setfillstyle(1,p[rs1].attr);
else
if(cb==2)
setfillstyle(1,BLACK); else
if(cb==3)
{ setfillstyle(1,WHITE); r_f[RA.Rx-15][RA.Ry-6]=1; }
bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1);
RA.Rx=recordx;
RA.Ry=recordy;
}
}
void mov(int key) { draw(2);
if(key==LEFT&&nleft) RA.Rx--;
else
if(key==RIGHT&&nright) RA.Rx++;
else
RA.Ry++;
nback=check_b(); if(nback)
draw(1);
else
draw(3);
}
void change()
{ int status=rs1,buffer,i,x,y,zf=0;
if(p[rs1].attr==p[rs1+1].attr)
rs1++;
else
while(p[rs1].attr==p[rs1-1].attr)
rs1--;
for(i=0;i<7;i++,i++) { x=RA.Rx+p[rs1].co[i]; y=RA.Ry+p[rs1].co[i+1]; if(y>6)
zf+=r_f[x-15][y-6]; }
if(zf!=0)
rs1=status;
buffer=rs1;
rs1=status;
status=buffer;
draw(2);
buffer=rs1;
rs1=status;
status=buffer;
nback=check_b();
if(nback)
draw(1);
else
draw(3);
}
void accelerate()
{ if(count_down>=1)
{ check_touch();
count_down=0;
if(nback)
mov(DOWN);
}
}
void drawbox()
{ int xcor,ycor;
for(xcor=xcors;xcor<=xcorb;xcor++)
for(ycor=ycors;ycor<=ycorb;ycor++)
{ if(xcor==xcors||xcor==xcorb||ycor==ycors||ycor==ycorb)
{ RA.Rx=xcor;
RA.Ry=ycor;
translation();
setfillstyle(1,DARKGRAY); bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1);
}
}
}
void erasure(int k)
{ int i,j,recordx=RA.Rx,recordy=RA.Ry;
{ j=k-1;
for(;j>0;j--)
{ for(i=1;i<11;i++)
{ r_f[i][j+1]=r_f[i][j]; RA.Rx=i+15;
RA.Ry=j+1+6;
translation();
if(r_f[i][j+1]==1)
setfillstyle(1,WHITE); else
setfillstyle(1,BLACK); bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1);
RA.Rx=recordx;
RA.Ry=recordy;
}
}
}
}
void pause()
{ HZ12(450,400,15,BLACK,"正常");
HZ12(450,400,15,GREEN,"暂停");
for(;;)
if(bioskey(1)&&bioskey(0)==SPACE)
{ clearkbd();
HZ12(450,400,15,BLACK,"暂停");
HZ12(450,400,15,RED,"正常");
return;
}
}
void judge()
{ int i,j,full=0;
if(finish())
messagebox();
for(j=1;j<21;j++)
{ for(i=1;i<11;i++) full+=r_f[i][j];
if(full==10)
erasure(j);
full=0;
}
}
void update()
{ cleardevice();
setbkcolor(BLACK);
initinfo();
initbox();
srand((unsigned)time(NULL)); rs1=random(19);
rs2=random(19);
next_shape();
initposition();
initremove();
HZ12(450,400,15,RED,"正常");
process();
}
void EXIT()
{ closegraph();
intrestore();
exit(0);
}
void initremove()
{ int i,j;
for(i=0;i<12;i++)
for(j=0;j<22;j++)
if(i==0||i==11||j==0||j==21)
r_f[i][j]=1;
else
r_f[i][j]=0;
}
void initinfo()
{ char aStr[2];
setcolor(RED);
outtextxy(450,100,"This game's writer is:");
HZ12(450,140,15,RED,"该程序作者:NULL");
outtextxy(525,110,"NULL");
outtextxy(450,180,"FUNCTION FOR KEYS:");
outtextxy(450,200,"UP:change the shape");
outtextxy(450,210,"DOWN:accelerate");
outtextxy(450,220,"LEFT:move left");
outtextxy(450,230,"RIGHT:move right");
outtextxy(450,240,"ESC:exit this game");
outtextxy(450,250,"SPACE:pause");
HZ12(450,260,20,RED,"上:"); HZ12(450,280,20,RED,"下:"); HZ12(450,300,20,RED,"左:"); HZ12(450,320,20,RED,"右:"); HZ12(450,340,20,RED,"ESC:退出");
HZ12(450,360,15,RED,"空格: 暂停/开始");
HZ12(450,380,15,RED,"目前状态:");
HZ12(20,200,15,RED,"下一个形状");
aStr[0]=24;
aStr[1]=0;
aStr[6]=0;
HZ12(480,260,12,GREEN,aStr);
HZ12(500,260,12,GREEN,"( 变形 )");
aStr[0]=25;
aStr[1]=0;
HZ12(480,280,12,GREEN,aStr);
HZ12(500,280,12,GREEN,"( 加速 )");
aStr[0]=27;
aStr[1]=0;
HZ12(480,300,12,GREEN,aStr);
HZ12(500,300,12,GREEN,"向左");
aStr[0]=26;
aStr[1]=0;
HZ12(480,320,12,GREEN,aStr);
HZ12(500,320,12,GREEN,"向右");
}
void messagebox()
{ int key;
setcolor(GREEN);
setfillstyle(1,DARKGRAY);
rectangle(220,200,420,300);
bar(221,201,419,299);
HZ12(280,210,15,GREEN,"GAME OVER");
HZ12(275,230,15,GREEN,"重新游戏: Y");
HZ12(275,270,15,GREEN,"退出游戏: N");
HZ12(450,400,15,BLACK,"正常");
HZ12(450,400,15,GREEN,"GAME OVER");
for(;;)
if(bioskey(1))
{ key=bioskey(0);
if(key==Y)
{ clearkbd();
update();
}
else
if(key==N)
{ clearkbd();
EXIT();
}
else
clearkbd();
}
}
void initbox() { xcors=15; xcorb=26;
ycors=6;
ycorb=27;
drawbox();
xcors=2;
xcorb=7;
ycors=6;
ycorb=11;
drawbox();
}
void initposition()
{ RA.Rx=18; RA.Ry=6-p[rs1].co[7];;
RA.x1=0;
RA.x2=0;
RA.y1=0;
RA.y2=0;
}
void next_shape()
{ int recordx=RA.Rx,recordy=RA.Ry,buffer;
RA.Rx=3;
RA.Ry=7;
draw(2);
buffer=rs1;
rs1=rs2;
rs2=buffer;
draw(1);
RA.Rx=recordx; RA.Ry=recordy;
buffer=rs1;
rs1=rs2;
rs2=buffer; }
void process() { for(;;)
{ check_touch(); if(!nback)
{ rs1=rs2;
rs2=random(19); initposition(); judge();
draw(1);
next_shape();
}
if(count_other>=1) { count_other=0; if(bioskey(1)) { int key=bioskey(0); clearkbd();
if(key==ESC)
EXIT();
if(key==LEFT&&nleft&&nback)
mov(LEFT);
if(key==RIGHT&&nright&&nback)
mov(RIGHT);
if(key==UP&&nback) change();
if(key==SPACE) pause();
if(key==DOWN)
accelerate();
}
}
if(count_down>=4) { check_touch(); count_down=0;
if(nback)
mov(DOWN);
}
}
}
main()
{ int gdriver=DETECT,gmode=0;
initgraph(&gdriver,&gmode,"c:\\turboc2");
intenable();
update();
}