用纯C写的游戏

/************************* 
<Russia Diamonds Ver 1.0> 
Copyright by forever_chang 
forever_chang@china.com 
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:forever_chang@163.com"); 
}
 
/*****************************************************************************************/  
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 (" "); 

}
*/
 
/*****************************************************************************************/  
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); 
}
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值