C语言实现的俄罗斯方块

来源:互联网 发布:电脑抽奖软件破解 编辑:程序博客网 时间:2024/05/01 03:59

#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<time.h>
#include<dos.h>
#include<stdlib.h>
#include<math.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int Box_x[5],Box_y[5],Box_xy[15][10]={0},num,life=1,score,mx,my,key,x[5],y[5],size,grade=0;
int *buf;
void Init();
void my_ad_1();
void my_ad_2();
void my_ad_3();
void play();
void jiang();
void De_B_xy();
void Draw_Box();
void Ad_Box_y();
void Mi_Box_x();
void Ad_Box_x();
void ch_B_xy();
void rebuild();
void Draw_New();
void close();
void delay_n(int n);
void main()
{
 Init();
 my_ad_1();
 my_ad_2();
 my_ad_3();
 play();
 close();
}
void Init()
{
 int driver=DETECT,mode;
 initgraph(&driver,&mode,"");
 mx=getmaxx();
 my=getmaxy();
 setbkcolor(BLUE);
 size=imagesize(0,0,32,32);
 if(size!=-1)
 buf=malloc(size);
 getimage(0,0,32,32,buf);
}
void my_ad_1()
{int ch1[]={100,120,100,300,120,300,120,200,200,200,200,280,180,280,180,300,220,300,220,180,120,180,120,140,300,140,300,100,280,120,100,120},
      ch2[]={240,100,280,300,300,300,260,100,240,100},
      ch3[]={280,160,264,280,284,280,300,160,280,160},
      j1[]={300,120,340,160,360,160,320,100,300,120},
      j2[]={300,180,340,220,360,220,320,160,300,180},
      j3[]={300,300,340,300,380,220,360,220,300,300},
      j4[]={380,120,380,140,420,140,420,280,360,280,360,300,500,300,500,280,440,280,440,140,480,140,480,120,380,120};
  settextjustify(CENTER_TEXT,CENTER_TEXT);
  settextstyle(TRIPLEX_FONT,HORIZ_DIR,5);
  setcolor(WHITE);
  sleep(2);
  outtextxy(320,200,"C Program Flash Creation");
  settextstyle(3,HORIZ_DIR,3);
  sleep(1);
  outtextxy(320,300,"Cheng Jiang,Electronic Class 1,Physic Department, GDUT");
  sleep(1);
  cleardevice();
  fillpoly(16,ch1);
  fillpoly(5,ch2);
  fillpoly(5,ch3);
  fillpoly(5,j1);
  fillpoly(5,j2);
  fillpoly(5,j3);
  fillpoly(12,j4);
  sleep(2);
  cleardevice();
}
void my_ad_2()
{
 setfillstyle(SOLID_FILL,LIGHTBLUE);
 bar(0,0,150,my);
 bar(450,0,mx,my);
 setviewport(150,0,450,my,1);
}
void my_ad_3()
{
 int i,j;
 outtextxy(150,30,"Waitting...");
 setlinestyle(1,1,1);
 rectangle(0,60,450,90);
 setlinestyle(SOLID_LINE,1,THICK_WIDTH);
 jiang();
 for(i=0;i<10;i++)
 {
  bar(30*i,60,30*(i+1),90);
  rectangle(30*i,60,30*(i+1),90);
  sleep(1);
 }
 clearviewport();
 outtextxy(150,240,"OK! Press [Enter]");
 getch();
 clearviewport();
}

void play()
{
 int i,j;
 outtextxy(150,460,"grade:0   score: 0 ");
 while(1)
 {
  randomize();
  num=random(19);
  De_B_xy();
  while(1)
  {
   while(kbhit())
   {
    key=bioskey(0);
    Draw_Box();
    switch(key)
    {
    case UP:getch();break;
    case DOWN:Ad_Box_y();break;
    case RIGHT:Ad_Box_x();break;
    case LEFT:Mi_Box_x();break;
    case ESC:close();break;
    default:ch_B_xy();break;
    }
    if(check())  break;
   }
    Draw_Box();
    if(check()) break;
    for(i=1;i<5;i++)
    Box_y[i]+=1;
   if(!kbhit())
   delay_n(10-grade);
  }
 rebuild();
 Draw_New();
 if(!life) break;
 }
}
void Draw_Box()
{
 int i;
 for(i=1;i<5;i++)
 putimage(x[i]*30-1,30*y[i]-1,buf,COPY_PUT);
 if(!(y[1]&&y[2]&&y[3]&&y[0]))
 for(i=4;i<8;i++)
 putimage(30*i-1,0,buf,COPY_PUT);
 for(i=1;i<5;i++)
 {
  x[i]=Box_x[i];
  y[i]=Box_y[i];
  bar(Box_x[i]*30, Box_y[i]*30, (Box_x[i]+1)*30, (Box_y[i]+1)*30);
  rectangle(Box_x[i]*30, Box_y[i]*30, (Box_x[i]+1)*30, (Box_y[i]+1)*30);
 }
}

void De_B_xy()
{
 int i;
 switch(num)
 {
  case 0: {Box_x[1]=Box_x[2]=Box_x[3]=Box_x[4]=0; Box_y[1]=0;Box_y[2]=1;Box_y[3]=2;Box_y[4]=3;} break;
  case 1: {Box_y[1]=Box_y[2]=Box_y[3]=Box_y[4]=0; Box_x[1]=0;Box_x[2]=1;Box_x[3]=2;Box_x[4]=3;} break;
  case 2: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=0;Box_x[4]=1; Box_y[1]=0;Box_y[2]=0; Box_y[3]=1;Box_y[4]=1;} break;
  case 3: {Box_x[1]=0;Box_x[2]=0; Box_x[3]=0;Box_x[4]=1; Box_y[1]=0;Box_y[2]=1; Box_y[3]=2;Box_y[4]=1;} break;
  case 4: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=2; Box_y[1]=2;Box_y[2]=1; Box_y[3]=2;Box_y[4]=2;} break;
  case 5: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=1; Box_y[1]=1;Box_y[2]=0; Box_y[3]=1;Box_y[4]=2;} break;
  case 6: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=2; Box_y[1]=1;Box_y[2]=1; Box_y[3]=2;Box_y[4]=1;} break;
  case 7: {Box_x[1]=0;Box_x[2]=0; Box_x[3]=1;Box_x[4]=1; Box_y[1]=0;Box_y[2]=1; Box_y[3]=1;Box_y[4]=2;} break;
  case 8: {Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=2; Box_y[1]=1;Box_y[2]=0; Box_y[3]=1;Box_y[4]=0;} break;
  case 9: {Box_x[1]=0;Box_x[2]=0; Box_x[3]=1;Box_x[4]=1; Box_y[1]=1;Box_y[2]=2; Box_y[3]=0;Box_y[4]=1;} break;
  case 10:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=2; Box_y[1]=1;Box_y[2]=1; Box_y[3]=2;Box_y[4]=2;} break;
  case 11:{Box_x[1]=0;Box_x[2]=0; Box_x[3]=0;Box_x[4]=1; Box_y[1]=0;Box_y[2]=1; Box_y[3]=2;Box_y[4]=2;} break;
  case 12:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=2;Box_x[4]=2; Box_y[1]=1;Box_y[2]=1; Box_y[3]=0;Box_y[4]=1;} break;
  case 13:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=1; Box_y[1]=0;Box_y[2]=0; Box_y[3]=1;Box_y[4]=2;} break;
  case 14:{Box_x[1]=0;Box_x[2]=0; Box_x[3]=1;Box_x[4]=2; Box_y[1]=0;Box_y[2]=1; Box_y[3]=0;Box_y[4]=0;} break;
  case 15:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=1;Box_x[4]=1; Box_y[1]=2;Box_y[2]=0; Box_y[3]=1;Box_y[4]=2;} break;
  case 16:{Box_x[1]=0;Box_x[2]=1; Box_x[3]=2;Box_x[4]=2; Box_y[1]=0;Box_y[2]=0; Box_y[3]=0;Box_y[4]=1;} break;
  case 17:{Box_x[1]=0;Box_x[2]=0; Box_x[3]=0;Box_x[4]=1; Box_y[1]=0;Box_y[2]=1; Box_y[3]=2;Box_y[4]=0;} break;
  case 18:{Box_x[1]=0;Box_x[2]=0; Box_x[3]=1;Box_x[4]=2; Box_y[1]=0;Box_y[2]=1; Box_y[3]=1;Box_y[4]=1;} break;
 }
 for(i=1;i<5;i++)
 Box_x[i]+=4;
}

int check()
{
 int i,p=0;
 for(i=1;i<5;i++)
 if(Box_xy[Box_y[i]+1][Box_x[i]]||Box_y[i]>13)
  p=1;
 return(p);
}

void Ad_Box_y()
 {
  int i,p=1;
  for(i=1;i<5;i++)
  if(Box_xy[Box_y[i]+1][Box_x[i]]||Box_y[i]>13)
  p=0;
  if(p)
  for(i=1;i<5;i++)
  Box_y[i]+=1;
 }

void Ad_Box_x()
{
 int i,p=1;
 for(i=1;i<5;i++)
 if(Box_xy[Box_y[i]][ Box_x[i]+1]||Box_x[i]>8)
 p=0;
 if(p)
 for(i=1;i<5;i++)
 Box_x[i]+=1;
}

void Mi_Box_x()
{
 int i,p=1;
 for(i=1;i<5;i++)
 if(Box_xy[Box_y[i]][ Box_x[i]-1]||Box_x[i]<1)
 p=0;
 if(p)
 for(i=1;i<5;i++)
 Box_x[i]-=1;
}

void ch_B_xy()
{
 int i,j,t,maxx=Box_x[1],maxy=Box_y[1];
 for(i=2;i<5;i++)
 {
  if(maxx<Box_x[i])
   maxx=Box_x[i];
  if(maxy<Box_y[i])
   maxy=Box_y[i];
 }
 switch(num)
 {
  case 0:num=num+1;break;
  case 1:num=num-1;
  case 2: ;break;
  case 3:num=num+1;break;
  case 4:num=num+1;break;
  case 5:num=num+1;break;
  case 6:num=num-3;break;
  case 7:num=num+1;break;
  case 8:num=num-1;break;
  case 9:num=num+1;break;
  case 10:num=num-1;break;
  case 11:num=num+1;break;
  case 12:num=num+1;break;
  case 13:num=num+1;break;
  case 14:num=num-3;break;
  case 15:num=num+1;break;
  case 16:num=num+1;break;
  case 17:num=num+1;break;
  case 18:num=num-3;break;
 }
 De_B_xy();
 for(i=1;i<5;i++)
 {
  Box_x[i]=Box_x[i]+maxx-Box_x[4];
  Box_y[i]=Box_y[i]+maxy-2;
 }
}

void rebuild()
{
 int i,j,p,t[4]={0},k=0;
 for(i=1;i<5;i++)
 Box_xy[Box_y[i]][Box_x[i]]=1;
 for(i=0;i<15;i++)
 {
  p=1;
  for(j=0;j<10;j++)
  if(!Box_xy[i][j])
  p=0;
  if(p)
  {
   t[k]=i;
   k++;
   score+=10*k;
  }
 }
 for(k=0;k<4;k++)
 {
  if(t[k])
  {
  for(i=t[k];i>0;i--)
  for(j=0;j<10;j++)
   Box_xy[i][j]=Box_xy[i-1][j];
  }
 }
  for(i=0;i<10;i++)
  if(Box_xy[0][i])
  life=0;
  setfillstyle(1,4);
  for(i=0;i<4;i++)
  if(t[i])
  bar(0,30*t[i],300,30*(t[i]+1));
  setfillstyle(1,9);
  for(i=1;i<5;i++)
  {
  x[i]=0;
  y[i]=0;
  }
  grade=(score-score%100)/100 ;
  delay(30000);
}


void Draw_New()
{
 int i,j;
 char text[20];
 clearviewport();
 for(i=0;i<15;i++)
 for(j=0;j<10;j++)
 if(Box_xy[i][j])
 {
  bar(30*j,30*i,30*j+30,30*i+30);
  rectangle(30*j,30*i,30*j+30,30*i+30);
 }
 sprintf(text,"grade: %d   score: %d",grade,score);
 gotoxy(100,460);
outtextxy(150,460,text);
}

void close()
{
 int i,j;
 for(i=14;i>=0;i--)
 {
  for(j=0;j<10;j++)
  {
   bar(30*j,30*i,30*(j+1),30*(i+1));
   rectangle(30*j,30*i,30*(j+1),30*(i+1));
  }
  delay(20000);
 }
 clearviewport();
 jiang();
 outtextxy(150,60,"game over");
 getch();
 closegraph();
}
void delay_n( int n)
{
int i;
for(i=0;i<n;i++) delay(50000);
}
void jiang()
{
 int jx=0,jy=4;
 for(jx=0;jx<3;jx++)
 {
   bar(30*jx,30*jy,30*(jx+1),30*(jy+1));
   rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1));
   bar(30*jx,30*(jy+3),30*(jx+1),30*(jy+4));
   rectangle(30*jx,30*(jy+3),30*(jx+1),30*(jy+4));
   jy++;
 }
 jy=14;
 for(jx=0;jx<4;jx++)
 {
  bar(30*jx,30*jy,30*(jx+1),30*(jy+1));
  rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1));
  jy--;
 }
 jy=4;
 for(jx=4;jx<9;jx++)
 {
  bar(30*jx,30*jy,30*(jx+1),30*(jy+1));
  rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1));
 }
 jy=14;
 for(jx=3;jx<11;jx++)
 {
  bar(30*jx,30*jy,30*(jx+1),30*(jy+1));
  rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1));
 }
 jx=6;
 for(jy=5;jy<15;jy++)
 {
  bar(30*jx,30*jy,30*(jx+1),30*(jy+1));
  rectangle(30*jx,30*jy,30*(jx+1),30*(jy+1));
 }
}