PHP Code:
/*************************
<Russia Diamonds Ver 1.0>
Copyright by forever_chang
[email]forever_chang@china.com[/email]
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 ("\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);
}