一个dos下tc编的俄罗斯方块源程序(附注释)

类别:编程语言 点击:0 评论:0 推荐:

使用环形链表构造方块,编译前将turboc目录下的egavga.bgi考到源程序所在目录下。

 

 

/*************************
<Russia Diamonds Ver 1.0>
Copyright by forever_chang
[email protected]
2001.11.1
*************************/
/*****************************************************************************************/
#include "graphics.h" /*头文件*/
#include "time.h"
#include "stdlib.h"
#include "bios.h"
#include "dos.h"
#include "stdio.h"
#define ESC 0x11b /*键盘扫描码*/
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define F1 0x3b00
#define RIGHT 0x4d00
#define YES 0x1579
#define NO 0x316e
#define RESTART 0x1372
/*****************************************************************************************/
struct diamond /*记录每种方块每种状态的信息*/
{
 int x[4];
 int y[4];
 int start_x;
 int start_y;
 int color;
 struct diamond *next;
};
int grid[12][23]; /*记录所有格子的状态 (0)没有方块 (1)有固定方块 (2)有活动方块*/
int x; /*活动方块所在位置*/
int y;
int level; /*游戏难度*/
int count; /*计数器*/
int score;/*得分*/
struct diamond *nowinfo; /*当前活动方块*/
struct diamond *nextinfo; /*下一个方块*/
int color;/*画格子的颜色*/
int backcolor;/*游戏区域背景色*/
/*****************************************************************************************/
void show_interface (int mode);/*显示游戏界面*/
void show_copsign (int topx,int topy,int size,int color);/*显示公司标志--恒基伟业*/
void show_intro (int xs,int ys);/*显示软件介绍区*/
/*void print(); 测试用函数*/
void scandel();/*扫描所有格子看是否有可消除行*/
void show_down ();/*方块下落后的下一个状态*/
void show_next ();/*方块翻转后的下一个状态*/
void show_left ();/*方块向左移动后的下一个状态*/
void show_right ();/*方块向右移动后的下一个状态*/
void interrupt (*oldtimer)();/*指向未安装前的中断向量,即函数指针,指向一段可执行的代码*/
void install();/*安装新的中断向量,即将中断服务程序安装到中断向量表中*/
void interrupt newtimer();/*中断服务程序*/
struct diamond *get_diamond();/*随机得到一个方块*/
struct diamond *create_I();/*函数用来构造各种类形方块的环形链表*/
struct diamond *create_T();/*返回链表中随机一个状态的指针*/
struct diamond *create_L();
struct diamond *create_J();
struct diamond *create_Z();
struct diamond *create_N();
struct diamond *create_H();
void delinfo (struct diamond *info);/*释放当前方块所占用的空间*/
void addtobuffer(int c);/*向键盘缓冲区中增加一个DOWN*/
/*void clrkey();调用dos中断清空键盘缓冲区,未使用此方法.*/
void showsubwin(struct diamond *next);/*在小窗口显示下一个方块*/
void showscore(int scoreget);/*显示分数*/
void startset();/*初始化游戏*/
/*****************************************************************************************/
main ()
{
 int driver=VGA;
 int mode=VGAHI;
 int i;/*计数器*/
 int j;
 int key;/*记录键盘扫描码*/
 initgraph (&driver,&mode,"");/*初始化*/
 color=8;
 backcolor=7;
 level=1;
 score=298;
 count=0;
 show_interface (9);/*显示界面*/
 setfillstyle(SOLID_FILL,1);
 bar(0,465,640,480);
 outtextxy(5,469,"Press any key to start...");
 getch();
 setfillstyle(SOLID_FILL,9);
 bar(0,465,640,480);
 showscore(0);/*显示分数*/
 randomize();
 nowinfo=get_diamond ();/*得到一个当前方块*/
 oldtimer=getvect(0x1c);
 install(newtimer);
 for(i=0;i<=21;i++)/*初始化grid[12][23]*/
 {
  for(j=1;j<=10;j++)
  grid[j][i]=0;
 }
 for(i=0;i<=22;i++)
 {
  grid[0][i]=1;
  grid[11][i]=1;
 }
 for(i=0;i<=11;i++)
 {
  grid[i][22]=1;
 }

 x=nowinfo->start_x;/*初始化方块位置*/
 y=nowinfo->start_y;
 nextinfo=get_diamond ();/*得到下一个方块*/
 showsubwin(nextinfo);

 for (;;)
 {
  key=bioskey(0);/*得到键盘扫描码*/
  if (key)
  {
   switch(key)
   {

 case DOWN:{
               show_down ();
      break;
        }
 case UP:{
          show_next ();
    break;
   }
 case LEFT:{
         show_left();
      break;
     }
 case RIGHT:{
                show_right();
          break;
      }
    case RESTART:{
         install(oldtimer);
      setfillstyle(SOLID_FILL,1);
         bar(0,465,640,480);
         outtextxy(5,469,"Are you sure to restart (Y/N)...");
      for (;;)
      {
                 key=bioskey(0);/*得到键盘扫描码*/
                   if (key==YES)
       {
                    startset();
        setfillstyle(SOLID_FILL,9);
           bar(0,465,640,480);
     break;
       }
                   if (key==NO)
       {
          setfillstyle(SOLID_FILL,9);
          bar(0,465,640,480);
       install(newtimer);
       break;
       }
     }
     break;
    }
/* case F1:{
       print();
    break;
   }
*/
 case ESC:{
        install(oldtimer);
        setfillstyle(SOLID_FILL,1);
     bar(0,465,640,480);
     outtextxy(5,469,"Are you sure to exit (Y/N)...");
     for (;;)
     {
             key=bioskey(0);/*得到键盘扫描码*/
               if (key==YES)
      {
    closegraph();
          exit(0);
      }
               if (key==NO)
      {
       setfillstyle(SOLID_FILL,9);
       bar(0,465,640,480);
    install(newtimer);
    break;
      }
     }
       
    }
   }
  }
 }
}
/*****************************************************************************************/
struct diamond *get_diamond()
{
 struct diamond *now;
 switch (random(7)+1)
 {
  case 1:{
        now=create_I();
     return now;
    }
   case 2:{
        now=create_T();
     return now;
       }
   case 3:{
        now=create_L();
     return now;
    }
   case 4:{
        now=create_J();
     return now;
    }
   case 5:{
        now=create_Z();
     return now;
    }
   case 6:{
        now=create_N();
     return now;
    }
   case 7:{
        now=create_H();
     return now;
    }
 }
}
/*****************************************************************************************/
void show_interface (int fill_mode)
{
 int i;
 setbkcolor (9);
 setcolor (color);
 setfillstyle (SOLID_FILL,backcolor);
 bar (100,60,300,420);
 bar (360,60,440,140);
 rectangle (100,60,300,420);
 rectangle (96,56,304,424);

 rectangle (360,60,440,140);
 rectangle (356,56,444,144);
 setfillstyle (fill_mode,14);
 floodfill (97,57,color);
 floodfill (397,57,color);
 setcolor(1);
 rectangle(96,56,304,424);
 setcolor (color);
 for (i=80;i<=400;i+=20)
  {
   line (100,i,300,i);
  }
 for (i=120;i<=280;i+=20)
  {
   line (i,60,i,420);
  }
 for (i=80;i<=120;i+=20)
 {
  line (360,i,440,i);
 }
 for (i=380;i<=420;i+=20)
 {
  line (i,60,i,140);
 }
 show_intro (360,180);
 show_copsign (475,320,40,1);
 setfillstyle(SOLID_FILL,1);
 setcolor(14);
 rectangle(420,405,534,417);
 floodfill (421,406,14);
 outtextxy(422,408,"HI-TECH WEALTH");
}
/*****************************************************************************************/
void show_copsign (int topx,int topy,int size,int color)
{
 int halfsize,qtrsize;
 int xadd,xdel,yadd1,yadd2;
 halfsize=0.5*size;
 qtrsize=0.25*size;

 xadd=topx+size;
 xdel=topx-size;
 yadd1=topy+size;
 yadd2=topy+2*size;

 setcolor(color);
 line (topx,topy,xdel,yadd1);
 line (xdel,yadd1,topx,yadd2);
 line (topx,yadd2,xadd,yadd1);
 line (xadd,yadd1,topx,topy);
 rectangle (topx-halfsize,topy+halfsize,topx+halfsize,yadd1+halfsize);
 setfillstyle (SOLID_FILL,color);
 floodfill (topx,topy+1,color);
 floodfill (xdel+1,yadd1,color);
 floodfill (topx,yadd2-1,color);
 floodfill (xadd-1,yadd1,color);
 rectangle (topx-halfsize,yadd1-qtrsize,topx-0.75*halfsize,yadd1+qtrsize);
 floodfill (topx-halfsize+1,yadd1-qtrsize+1,color);
 rectangle (topx-qtrsize,yadd1-halfsize,topx+qtrsize,yadd1-0.25*halfsize);
 floodfill (topx-qtrsize+1,yadd1-halfsize+1,color);
 rectangle (topx+0.75*halfsize,yadd1-qtrsize,topx+halfsize,yadd1+qtrsize);
 floodfill (topx+0.75*halfsize+1,yadd1-qtrsize+1,color);
 rectangle (topx-qtrsize,yadd1+0.25*halfsize,topx+qtrsize,yadd2-halfsize);
 floodfill (topx-qtrsize+1,yadd1+0.25*halfsize+1,color);
 setcolor(14);
 line (topx,topy-1,xdel-1,yadd1);
 line (xdel-1,yadd1,topx,yadd2+1);
 line (topx,yadd2+1,xadd+1,yadd1);
 line (xadd+1,yadd1,topx,topy-1);
 setfillstyle (SOLID_FILL,14);
 floodfill (topx,yadd1,color);
}
/*****************************************************************************************/
 void show_intro (int xs,int ys)
{
 char stemp[20];
 setcolor (15);
 rectangle(xs-3,ys-3,xs+239,ys+115);
 line (xs-3,ys+26,xs+239,ys+26);
 line (xs-3,ys+72,xs+239,ys+72);
 outtextxy(xs,ys,"Level:");
 outtextxy(xs,ys+15,"Score:");
 sprintf(stemp," -Roll  -Downwards");
 stemp[0]=24;
 stemp[7]=25;
 outtextxy(xs,ys+30,"Help:");
 setcolor(14);
 outtextxy(xs+40,ys+30,stemp);
 outtextxy(xs+40,ys+45,"<-Turn Left >-Turn Right");
 outtextxy(xs+40,ys+60,"Esc-Exit R-Restart");
 outtextxy(xs,ys+75,"Russia Diamonds Ver 1.0");
 outtextxy(xs,ys+90,"CopyRight By ChangYong.01-11-1");
 outtextxy(xs,ys+105,"Email:[email protected]");
}
/*****************************************************************************************/
struct diamond *create_I()
{
 struct diamond *info;
 struct diamond *first;
 first=(struct diamond *)malloc(sizeof(struct diamond));
 info=(struct diamond *)malloc(sizeof(struct diamond));
 first->next=info;
 info->next=first;
 first->x[0]=0;
 first->y[0]=0;
 first->x[1]=-1;
 first->y[1]=0;
 first->x[2]=1;
 first->y[2]=0;
 first->x[3]=2;
 first->y[3]=0;
 first->start_x=5;
 first->start_y=3;
 first->color=2;

 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=0;
 info->y[1]=-1;
 info->x[2]=0;
 info->y[2]=1;
 info->x[3]=0;
 info->y[3]=2;
 info->start_x=5;
 info->start_y=1;
 info->color=2;

 if(random(2)==0) {return first;}
  else {return first->next;}
}
/*****************************************************************************************/
struct diamond *create_T()
{
 struct diamond *info;
 struct diamond *first;
 struct diamond *last;
 int i;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=-1;
 info->y[1]=0;
 info->x[2]=0;
 info->y[2]=-1;
 info->x[3]=1;
 info->y[3]=0;
 info->start_x=5;
 info->start_y=3;
 info->color=4;
 first=info;
 last=info;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=0;
 info->y[1]=1;
 info->x[2]=0;
 info->y[2]=-1;
 info->x[3]=1;
 info->y[3]=0;
 info->start_x=5;
 info->start_y=2;
 info->color=4;
 last->next=info;
 last=info;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=-1;
 info->y[1]=0;
 info->x[2]=1;
 info->y[2]=0;
 info->x[3]=0;
 info->y[3]=1;
 info->start_x=5;
 info->start_y=2;
 info->color=4;
 last->next=info;
 last=info;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=0;
 info->y[1]=1;
 info->x[2]=0;
 info->y[2]=-1;
 info->x[3]=-1;
 info->y[3]=0;
 info->start_x=5;
 info->start_y=2;
 info->color=4;
 last->next=info;
 last=info;
 last->next=first;

 for (i=0;i<=random(4);i++)
 {
  first=first->next;
 }
 return first;
}
/*****************************************************************************************/
struct diamond *create_L()
{
 struct diamond *info;
 struct diamond *first;
 struct diamond *last;
 int i;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=0;
 info->y[1]=1;
 info->x[2]=0;
 info->y[2]=-1;
 info->x[3]=1;
 info->y[3]=1;
 info->start_x=5;
 info->start_y=2;
 info->color=5;
 first=info;
 last=info;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=-1;
 info->y[1]=0;
 info->x[2]=1;
 info->y[2]=0;
 info->x[3]=-1;
 info->y[3]=1;
 info->start_x=5;
 info->start_y=2;
 info->color=5;
 last->next=info;
 last=info;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=0;
 info->y[1]=1;
 info->x[2]=0;
 info->y[2]=-1;
 info->x[3]=-1;
 info->y[3]=-1;
 info->start_x=5;
 info->start_y=2;
 info->color=5;
 last->next=info;
 last=info;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=-1;
 info->y[1]=0;
 info->x[2]=1;
 info->y[2]=0;
 info->x[3]=1;
 info->y[3]=-1;
 info->start_x=5;
 info->start_y=2;
 info->color=5;
 last->next=info;
 last=info;
 last->next=first;

 for (i=0;i<=random(4);i++)
 {
  first=first->next;
 }
 return first;
}
/*****************************************************************************************/
struct diamond *create_J()
{
 struct diamond *info;
 struct diamond *first;
 struct diamond *last;
 int i;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=0;
 info->y[1]=1;
 info->x[2]=0;
 info->y[2]=-1;
 info->x[3]=-1;
 info->y[3]=1;
 info->start_x=5;
 info->start_y=2;
 info->color=6;
 first=info;
 last=info;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=-1;
 info->y[1]=0;
 info->x[2]=1;
 info->y[2]=0;
 info->x[3]=-1;
 info->y[3]=-1;
 info->start_x=5;
 info->start_y=2;
 info->color=6;
 last->next=info;
 last=info;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=0;
 info->y[1]=1;
 info->x[2]=0;
 info->y[2]=-1;
 info->x[3]=1;
 info->y[3]=-1;
 info->start_x=5;
 info->start_y=2;
 info->color=6;
 last->next=info;
 last=info;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=-1;
 info->y[1]=0;
 info->x[2]=1;
 info->y[2]=0;
 info->x[3]=1;
 info->y[3]=1;
 info->start_x=5;
 info->start_y=2;
 info->color=6;
 last->next=info;
 last=info;
 last->next=first;

 for (i=0;i<=random(4);i++)
 {
  first=first->next;
 }
 return first;
}
/*****************************************************************************************/
struct diamond *create_Z()
{
 struct diamond *info;
 struct diamond *first;
 first=(struct diamond *)malloc(sizeof(struct diamond));
 info=(struct diamond *)malloc(sizeof(struct diamond));
 first->next=info;
 info->next=first;
 first->x[0]=0;
 first->y[0]=0;
 first->x[1]=-1;
 first->y[1]=0;
 first->x[2]=0;
 first->y[2]=1;
 first->x[3]=1;
 first->y[3]=1;
 first->start_x=5;
 first->start_y=2;
 first->color=9;

 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=0;
 info->y[1]=1;
 info->x[2]=1;
 info->y[2]=0;
 info->x[3]=1;
 info->y[3]=-1;
 info->start_x=5;
 info->start_y=2;
 info->color=9;

 if(random(2)==0) {return first;}
  else {return first->next;}
}
/*****************************************************************************************/
struct diamond *create_N()
{
 struct diamond *info;
 struct diamond *first;
 first=(struct diamond *)malloc(sizeof(struct diamond));
 info=(struct diamond *)malloc(sizeof(struct diamond));
 first->next=info;
 info->next=first;
 first->x[0]=0;
 first->y[0]=0;
 first->x[1]=0;
 first->y[1]=1;
 first->x[2]=-1;
 first->y[2]=1;
 first->x[3]=1;
 first->y[3]=0;
 first->start_x=5;
 first->start_y=2;
 first->color=14;

 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=0;
 info->y[1]=-1;
 info->x[2]=1;
 info->y[2]=0;
 info->x[3]=1;
 info->y[3]=1;
 info->start_x=5;
 info->start_y=2;
 info->color=14;

 if(random(2)==0) {return first;}
  else {return first->next;}
}
/*****************************************************************************************/
struct diamond *create_H()
{
 struct diamond *first;
 first=(struct diamond *)malloc(sizeof(struct diamond));
 first->next=first;
 first->x[0]=0;
 first->y[0]=0;
 first->x[1]=0;
 first->y[1]=1;
 first->x[2]=1;
 first->y[2]=0;
 first->x[3]=1;
 first->y[3]=1;
 first->start_x=5;
 first->start_y=2;
 first->color=1;
 return first;
}
/*****************************************************************************************/
void show_next ()
{
 int nowx;/*记录当前每个格子的位置*/
 int nowy;
 int i;/*计数器*/
 int j;
 int haveit;/*当前格子是否已经显示*/
 struct diamond *next;/*当前方块的翻转后的下一个状态*/
 next=nowinfo->next;
 if (next==NULL) {gotoxy(1,1);printf("null");}
 for (i=0;i<=3;i++)/*判断是否能够翻转,若不能,就直接退出该函数*/
 {
  if (grid[x+next->x[i]][y+next->y[i]]==1)
  {
   return;
  }
 }

 setfillstyle(SOLID_FILL,backcolor);/*设置背景色以消除不需要的格子*/
 for (i=0;i<=3;i++)
 {
  haveit=0;
  for (j=0;j<=3;j++)
  {
   if (next->x[j]==nowinfo->x[i]&&next->y[j]==nowinfo->y[i]) {haveit=1;break;}
  }
  if (haveit==0) /*判断翻转后该格子是否显示,若不显示,将该格子设为背景色*/
  {
  grid[x+nowinfo->x[i]][y+nowinfo->y[i]]=0;
  if (y+nowinfo->y[i]>=4)/*判断该格子是否到了可以显示的区域*/
   floodfill(80+(nowinfo->x[i]+x)*20+1,-20+(nowinfo->y[i]+y)*20+1,color);
  }
 }

 nowinfo=next;
 nowx=x;
 nowy=y;
 setfillstyle(SOLID_FILL,nowinfo->color);/*设置填冲色为方块的颜色*/
 for (i=0;i<=3;i++)
 {
  if (grid[x+nowinfo->x[i]][y+nowinfo->y[i]]!=2)/*如果该格子还没有被显示*/
  {
   nowx=x+nowinfo->x[i];
   nowy=y+nowinfo->y[i];
   if (y+nowinfo->y[i]>=4)
   floodfill(80+nowx*20+1,-20+nowy*20+1,color);
   grid[nowx][nowy]=2; /*设置该格子当前有活动方块*/
  }
 }
 return;
}
/*****************************************************************************************/
void show_left ()
{
 int i;/*计数器*/
 int j;
 int haveit;/*当前格子是否已经显示*/
 int nowx;/*记录当前每个格子的位置*/
 int nowy;
 for (i=0;i<=3;i++)/*判断是否可以向左移动*/
 {
  if (grid[x-1+nowinfo->x[i]][y+nowinfo->y[i]]==1)
  {
   return;
  }
 }

 setfillstyle(SOLID_FILL,backcolor);/*设置背景色以消除不需要的格子*/
 for (i=0;i<=3;i++)
 {
  haveit=0;
  for (j=0;j<=3;j++)
  {
   if (nowinfo->x[i]==nowinfo->x[j]-1&&nowinfo->y[i]==nowinfo->y[j]) {haveit=1;break;}
  }
   if (haveit==0) /*判断翻转后该格子是否显示,若不显示,将该格子设为背景色*/
  {
   grid[x+nowinfo->x[i]][y+nowinfo->y[i]]=0;
   if (y+nowinfo->y[i]>=4)/*判断该格子是否到了可以显示的区域*/
   floodfill(80+(nowinfo->x[i]+x)*20+1,-20+(nowinfo->y[i]+y)*20+1,color);
  }
 }

 setfillstyle(SOLID_FILL,nowinfo->color);/*设置填冲色为方块的颜色*/
 for (i=0;i<=3;i++)
 {
  nowx=x+nowinfo->x[i]-1;
  nowy=y+nowinfo->y[i];
  if (grid[nowx][nowy]!=2)/*如果该格子还没有被显示*/
  {
   if (nowy>=4)
   floodfill(80+nowx*20+1,-20+nowy*20+1,color);
   grid[nowx][nowy]=2;
  }
 }
 x=x-1;
 return;
}
/*****************************************************************************************/
void show_right ()
{
 int i;/*计数器*/
 int j;
 int haveit;/*当前格子是否已经显示*/
 int nowx;/*记录当前每个格子的位置*/
 int nowy;
 for (i=0;i<=3;i++)
 {
  if (grid[x+1+nowinfo->x[i]][y+nowinfo->y[i]]==1)
  {
   return;/*判断是否可以向右移动*/
  }
 }

 setfillstyle(SOLID_FILL,backcolor);/*设置背景色以消除不需要的格子*/
 for (i=0;i<=3;i++)
 {
  haveit=0;
  for (j=0;j<=3;j++)
  {
   if (nowinfo->x[i]==nowinfo->x[j]+1&&nowinfo->y[i]==nowinfo->y[j]) {haveit=1;break;}
  }
   if (haveit==0)/*判断翻转后该格子是否显示,若不显示,将该格子设为背景色*/
  {
   grid[x+nowinfo->x[i]][y+nowinfo->y[i]]=0;
   if (y+nowinfo->y[i]>=4)/*判断该格子是否到了可以显示的区域*/
   floodfill(80+(nowinfo->x[i]+x)*20+1,-20+(nowinfo->y[i]+y)*20+1,color);
  }
 }


 setfillstyle(SOLID_FILL,nowinfo->color);/*设置填冲色为方块的颜色*/
 for (i=0;i<=3;i++)
 {
  nowx=x+nowinfo->x[i]+1;
  nowy=y+nowinfo->y[i];
  if (grid[nowx][nowy]!=2)
  {
   if (nowy>=4)/*判断该格子是否到了可以显示的区域*/
   floodfill(80+nowx*20+1,-20+nowy*20+1,color);
   grid[nowx][nowy]=2;
  }
 }
 x=x+1;
 return;
}
/*****************************************************************************************/
void show_down ()
{

 int i;/*计数器*/
 int j;
 int haveit;/*当前格子是否已经显示*/
 int nowx;/*记录当前每个格子的位置*/
 int nowy;
 int key;
 for (i=0;i<=3;i++)
 {
  if (grid[x+nowinfo->x[i]][y+nowinfo->y[i]+1]==1)/*判断方块是否能够下落*/
  {
   for (j=0;j<=3;j++)
   {
    grid[x+nowinfo->x[j]][y+nowinfo->y[j]]=1;
 if (y+nowinfo->y[j]<=3)
 {/*判断游戏是否已经玩完*/
  install(oldtimer);
     setfillstyle(SOLID_FILL,1);
  bar(0,465,640,480);
  outtextxy(5,469,"Do you want to restart (Y/N)...");
  for (;;)
  {
      key=bioskey(0);
      if (key==YES)
   {
       startset();
    setfillstyle(SOLID_FILL,9);
    bar(0,465,640,480);
    return;
   }
      if (key==NO)
   {
    closegraph();
    exit (0);}
   }
  }
 }

   delinfo(nowinfo);
   scandel();/*扫描,删除*/
   delay(2500);
   while(bioskey(1)) bioskey(0);/*清除键盘缓冲区*/
  /* clrkey();*/
   nowinfo=nextinfo;/*得到新的方块*/
   nextinfo=get_diamond();/*得到下一个方块*/
   showsubwin(nextinfo);
   x=nowinfo->start_x;/*重新设置方块位置*/
   y=nowinfo->start_y;
   return;
  }
 }

 setfillstyle(SOLID_FILL,backcolor);/*设置背景色以消除不需要的格子*/

 for (i=0;i<=3;i++)
 {
  haveit=0;
  for (j=0;j<=3;j++)
  {
   if (nowinfo->x[i]==nowinfo->x[j]&&nowinfo->y[i]==nowinfo->y[j]+1) {haveit=1;break;}
  }
   if (haveit==0)/*判断翻转后该格子是否显示,若不显示,将该格子设为背景色*/
  {
   grid[x+nowinfo->x[i]][y+nowinfo->y[i]]=0;
   if (y+nowinfo->y[i]>=4)/*判断该格子是否到了可以显示的区域*/
    floodfill(80+(nowinfo->x[i]+x)*20+1,-20+(nowinfo->y[i]+y)*20+1,color);
  }
 }
 setfillstyle(SOLID_FILL,nowinfo->color);/*设置填冲色为方块的颜色*/
 for (i=0;i<=3;i++)
 {
  nowx=x+nowinfo->x[i];
  nowy=y+nowinfo->y[i]+1;
  if (grid[nowx][nowy]!=2)/*如果该格子还没有被显示*/
  {
   if (nowy>=4)
   floodfill(80+nowx*20+1,-20+nowy*20+1,color);
   grid[nowx][nowy]=2;
  }
 }
 y=y+1;
 return;
}
/*****************************************************************************************/
/*void print()测试用函数
{
int i;
int j;
gotoxy(1,1);
for (j=0;j<=22;j++)
{for (i=0;i<=11;i++)
{
printf ("%d",grid[i][j]);}
printf ("\n");
}
}*/
/*****************************************************************************************/
void scandel()
{
 int i;
 int k;
 int j;
 int num;
 int scoreadd;
 scoreadd=0;
 for (k=21;k>=4;k--)
 {
  num=0;
  for (i=1;i<=10;i++)
  {
   if (grid[i][k]==1) num++;
  }
  if (num==10)
  {
   scoreadd++;
   for (i=1;i<=10;i++)
   {
    setfillstyle(SOLID_FILL,backcolor);
    floodfill(80+i*20+1,-20+k*20+1,color);
   }

   for (j=k;j>=5;j--)
   {
 for (i=1;i<=10;i++)
 {
  setfillstyle(SOLID_FILL,getpixel(80+i*20+1,-40+j*20+1));
     floodfill(80+i*20+1,-20+j*20+1,color);
  grid[i][j]=grid[i][j-1];
 }
   }
   for (i=1;i<=10;i++)
   {
    setfillstyle(SOLID_FILL,backcolor);
    floodfill(80+i*20+1,61,color);
 grid[i][4]=0;
   }
   k++;
  }
 }
if (scoreadd!=0) showscore(2*scoreadd-1);
}
/*****************************************************************************************/
void interrupt newtimer()/*新的定时中断调用*/
{
  int leveltemp;
  leveltemp=11-level;
  count++;
  if(count>=leveltemp)
  {
  addtobuffer(DOWN);
  count=0;
  }
 (*oldtimer)();
}
/*****************************************************************************************/
void install (void interrupt (*paddr)())
{
 disable();
 setvect(0x1c,paddr);
 enable();
}
/******************************************************************************************/
void delinfo (struct diamond *info)/*释放开辟的空间*/
{
 struct diamond *now;
 struct diamond *next;
 now=info->next;
 next=info->next;
 while(next!=info)
 {
  next=now->next;
  free(now);
  now=next;
 }
 free(info);
 }
/******************************************************************************************/
void addtobuffer(int c)/*向键盘缓冲区中增加一个DOWN*/
{
 unsigned i;
 i=*(unsigned far *)0x0040001CL;
 *(unsigned far *)(0x00400000L | i)=c;
 i+=2;
 if (i>=*(unsigned far *)0x00400082L) i=*(unsigned far *)0x00400080L;
 *(unsigned far *)0x0040001CL=i;
}
/******************************************************************************************/
/*void clrkey()调用dos中断清空键盘缓冲区,未使用此方法.
{
  union REGS in ;
  in.h.ah = 0x0c ;
  in.h.al = 0x00 ;
  intdos(&in , &in) ;
}
*/
/******************************************************************************************/
void showsubwin(struct diamond *next)
{
 int i;/*计数器*/
 int j;
 setfillstyle (SOLID_FILL,backcolor);
 for (i=0;i<=3;i++)
 {
  for(j=0;j<=3;j++)
  {
   floodfill(361+20*i,61+20*j,color);
  }
 }
 setfillstyle (SOLID_FILL,next->color);
 for (i=0;i<=3;i++)
 {
  floodfill(381+next->x[i]*20,81+next->y[i]*20,color);
 }
}
/******************************************************************************************/
void showscore(int scoreget)
{
 char sscore[6];
 char slevel[2];
 score+=scoreget;
 if (score<1000) level=score/100+1;
 sprintf(sscore,"%d",score);
 sprintf(slevel,"%d",level);
 setfillstyle(SOLID_FILL,9);
 bar(406,179,490,203);
 setcolor(14);
 outtextxy (408,180,slevel);
 outtextxy (408,195,sscore);
}
/*******************************************************************************************/
void startset()
{
 int i;
 int j;
 setfillstyle(SOLID_FILL,backcolor);
 for(i=0;i<=21;i++)/*重新初始化*/
 {
  for(j=1;j<=10;j++)
  if (grid[j][i]!=0)
  {
  grid[j][i]=0;
  if (i>=4) floodfill(80+j*20+1,-20+i*20+1,color);
  }
 }
 score=0;
 showscore(0);
 nowinfo=get_diamond ();/*得到一个当前方块*/
 x=nowinfo->start_x;/*初始化方块位置*/
 y=nowinfo->start_y;
 nextinfo=get_diamond ();/*得到下一个方块*/
 showsubwin(nextinfo);
 install(newtimer);
}

 

本文地址:http://com.8s8s.com/it/it29835.htm