TC下的俄罗斯方块原代码

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

 


 /*TC下的俄罗斯方块原代码 */
 
 
/* 使用环形链表构造方块,编译前将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); 

 
 
 
 
 发表评论
 
 
 
CCBonline all right reserved
 

        
 
 

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