#include<graphics.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
#include <dos.h>
/*-------------------------------------------------------*/
void setfram(void);
void barr(int,int,int,int);
void changed(int,int,int*);
void barc(int,int,int,int);
void clearc(int,int,int*);
void delay1(unsigned x);
void initpump(void);
int test(int xx,int yy,int left,int right,int bottom,int roll);
void randone(void);
void mark(int xx,int yy);
int scans(void);
void kick(int rownum);
void redisplay(void);
void exchanged(void);
void outnum(int x,int y,int num);
void gameover(void);
/*-----------------------------------------------------*/
static int pump[37][18];
static int pause=0;
static int i=0;
static int *p[4];
static int x,y;
static int inext;
static int *pnext[4];
static int xnext=60,ynext=0;
static int quit=0;
static int *pp[7][4];
static int score;
static int layer;
static int t0[4][4]={{2,3,1},{0,1,0}};
static int t1[4][4]={{3,-2},{1,1},{1,0}};
static int t2[4][4]={{-2,3,0},{1,1,1}};
static int t3[4][4]={{-3,2},{1,1},{0,1}};
static int f[4][4]={{2,2},{1,1}};
static int a0[4][4]={{2,3,0},{0,1,1}};
static int a1[4][4]={{-3,2},{1,1},{1,0}};
static int b0[4][4]={{-2,3,1},{1,1,0}};
static int b1[4][4]={{3,-2},{1,1},{0,1}};
static int c0[4][4]={{3,2},{1,0},{1,0}};
static int c1[4][4]={{2,-3,0},{1,1,1}};
static int c2[4][4]={{-3,2},{0,1},{1,1}};
static int c3[4][4]={{2,3,1},{0,0,1}};
static int d0[4][4]={{3,2},{0,1},{0,1}};
static int d1[4][4]={{2,3,1},{1,0,0}};
static int d2[4][4]={{3,-2},{1,0},{1,1}};
static int d3[4][4]={{-2,-3,1},{1,1,1}};
static int e0[4][4]={{-4,2},{0,1},{0,1},{0,1}};
static int e1[4][4]={{-2,-4,0,0},{1,1,1,1}};
/*--------------------------------------------------------*/
main(void)
{ extern int i;
extern int *p[4];
extern int x,y;
extern int layer,score;
int exchangeon;
int rownum;
int count;
char ch;
int drive=VGA,mode=2;
initgraph(&drive,&mode,"");
/*##############数据初始化#####################################*/
pp[0][0]=t0[0];pp[0][1]=t1[0];pp[0][2]=t2[0];pp[0][3]=t3[0];
pp[1][0]=f[0];pp[1][1]=f[0];pp[1][2]=f[0];pp[1][3]=f[0];
pp[2][0]=a0[0];pp[2][1]=a1[0];pp[2][2]=a0[0];pp[2][3]=a1[0];
pp[3][0]=b0[0];pp[3][1]=b1[0];pp[3][2]=b0[0];pp[3][3]=b1[0];
pp[4][0]=c0[0];pp[4][1]=c1[0];pp[4][2]=c2[0];pp[4][3]=c3[0];
pp[5][0]=d0[0];pp[5][1]=d1[0];pp[5][2]=d2[0];pp[5][3]=d3[0];
pp[6][0]=e0[0];pp[6][1]=e1[0];pp[6][2]=e0[0];pp[6][3]=e1[0];
/*##############################################################*/
initpump();
setfram();
/*##############主程序#########################################*/
randone();
exchanged();
exchangeon=1;
while(1)
{if(exchangeon)
{randone();
barc(220,30,289,99);
changed(240,50,pnext[inext]);
exchangeon=0;}
delay1(15);
if(quit) break;
if(test(x,y,0,0,1,0))
{ clearc(x,y,p[i]);
y+=10;
changed(x,y,p[i]);
}
else {mark(x,y);
exchanged();
exchangeon=1;
if(!test(x,y,0,0,1,0)) {gameover();
ch=getch();
while(!(ch=='p'||ch=='P'))
{if(ch=='q'||ch=='Q') break;ch=getch();}
if(ch=='q'||ch=='Q') break;
initpump();
clearviewport();
layer=0;
score=0;
barc(220,160,289,189);
outnum(223,170,layer);
barc(220,250,289,279);
outnum(223,260,score);
}
count=0;
rownum=scans();
while(rownum)
{count++;layer++;
kick(rownum); rownum=scans();
redisplay();
}
barc(220,160,289,189);
outnum(223,170,layer);
switch(count){case 1:score+=100;break;
case 2:score+=300;break;
case 3:score+=500;break;
case 4:score+=700;break;
}
barc(220,250,289,279);
outnum(223,260,score);
}
if(pause){ ch=getch();
while(!(ch=='p'||ch=='P'))
{if(ch=='q'||'Q') break;ch=getch();}
pause=0;
if(ch=='q'||ch=='Q') break;
}
}
/*##############################################################*/
closegraph();
}
/*---------------------------------------------------------------*/
void changed(int xx,int yy,int*pp)
{int maxm,maxn,xx1,m,n;
maxm=abs(*pp);maxn=abs(*(pp+1));
xx1=xx;
for(m=0;m<maxm;m++)
{xx=xx1;
for(n=0;n<maxn;n++)
{if(*(pp+m*4+n)>0)
barr(xx,yy,xx+9,yy+9);
xx+=10;
}
yy+=10;
}
}
/*-----------------------------------------------------------*/
void clearc(int xx,int yy,int*pp)
{int maxm,maxn,xx1,m,n;
maxm=abs(*pp);maxn=abs(*(pp+1));
xx1=xx;
for(m=0;m<maxm;m++)
{xx=xx1;
for(n=0;n<maxn;n++)
{if(*(pp+m*4+n)>0)
barc(xx,yy,xx+9,yy+9);
xx+=10;
}
yy+=10;
}
}
/*--------------------------------------------------------------*/
void barr(int left,int top,int right,int bottom)
{char pattern[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
setcolor(0);
rectangle(left,top,right,bottom);
setfillpattern(pattern,rand()%15+1);
bar(++left,++top,--right,--bottom);
}
/*-------------------------------------------------------------*/
void barc(int left,int top,int right,int bottom)
{char pattern[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
setfillpattern(pattern, 0);
bar(left,top,right,bottom);
}
/*-------------------------------------------------------------*/
void initpump(void)
{ extern int pump[37][18];
int m,n;
n=0;
for(m=0;m<37;m++)
pump[m][n]=1;
n=17;
for(m=0;m<37;m++)
pump[m][n]=1;
m=36;
for(n=0;n<18;n++)
pump[m][n]=1;
for(m=0;m<36;m++)
for(n=1;n<17;n++)
pump[m][n]=0;
}
/*------------------------------------------------------------*/
void delay1(unsigned xx)
{int m;
extern int i;
extern int *p[4];
extern int pause;
extern int quit;
union REGS in,out;
unsigned int zf;
for(m=0;m<800;m++)
{ while(1)
{ in.h.ah=0x01;
int86(0x16,&in,&out);
zf=out.x.flags&0x0040;
if(zf) break;
in.h.ah=0x00;
int86(0x16,&in,&out);
switch(out.h.al)
{case 'j':
case 'J': if(test(x,y,0,0,0,1))
{clearc(x,y,p[i]);
i++;
if(i>3) i=0;
changed(x,y,p[i]);
}
break;
case 'a':
case 'A': if(test(x,y,1,0,0,0))
{clearc(x,y,p[i]);
x-=10;
changed(x,y,p[i]);
} break;
case 'd':
case 'D': if(test(x,y,0,1,0,0))
{clearc(x,y,p[i]);
x+=10;
changed(x,y,p[i]);
} break;
case 's':
case 'S': m=9999;break;
case 'p':
case 'P':pause=1;break;
case 'q':
case 'Q':quit=1;break;
default:break;
}
}
delay(xx);
}
}
/*----------------------------------------------------------------*/
int test(int xx,int yy,int left,int right,int bottom,int roll)
{extern int i;
extern pump[37][18];
extern int *p[4];
int *pp;
int maxm,maxn,m,n,k;
int row=yy/10;
int col=xx/10+1;
int temp;
temp=i;
i=i+roll;
if(i>3) i=0;
pp=p[i];
maxm=abs(*pp);maxn=abs(*(pp+1));
k=1;
for(m=0;m<maxm;m++)
for(n=0;n<maxn;n++)
if(*(pp+m*4+n)>0&&pump[row+m+bottom][col+n-left+right])
k=0;
i=temp;
return k;
}
/*----------------------------------------------------------------*/
void setfram(void)
{int left, top, right, bottom;
left =178;
top = 78;
right =341;
bottom =441;
rectangle(50,10,500,465);
rectangle(49,9,501,466);
settextstyle(0,0,1);
setcolor(9);
outtextxy(70,140,"LEFT: A");
outtextxy(70,170,"RIGHT: D");
outtextxy(70,200,"DOWN: S");
outtextxy(70,230,"ROLL: J");
outtextxy(70,260,"QUIT: Q");
outtextxy(70,290,"PAUSE: P");
outtextxy(70,320,"START: P");
settextstyle(0,0,2);
setcolor(10);
outtextxy(110,30,"WELCOME TO OUR GAME !");
setcolor(10);
rectangle(left,top,right,bottom);
left++;
top++;
right--;
bottom--;
setcolor(9);
rectangle(left,top,right,bottom);
setviewport(180, 80, 339,439, 0);
setcolor(14);
rectangle(218,28,291,101);
rectangle(219,29,290,100);
settextstyle(0,0,1);
setcolor(4);
outtextxy(170,60,"NEXT");
setcolor(4);
rectangle(218,158,291,191);
rectangle(219,159,290,190);
barc(220,160,289,189);
outnum(223,170,0);
settextstyle(0,0,1);
setcolor(9);
outtextxy(170,165,"LAYER");
setcolor(3);
rectangle(218,248,291,281);
rectangle(219,249,290,280);
barc(220,250,289,279);
outnum(223,260,0);
settextstyle(0,0,1);
setcolor(6);
outtextxy(170,255,"SCORE");
settextstyle(0,0,0);
setcolor(15);
outtextxy(25,180,"PRE ANY KEY TO");
outtextxy(50,195,"START !");
getch();
clearviewport();
}
/*----------------------------------------------------------------*/
void randone(void)
{ extern int inext;
extern int *pnext[4];
extern int *pp[7][4];
int m,n;
m=rand()%7;
for(n=0;n<4;n++) pnext[n]=pp[m][n];
inext=rand()%4;
}
/*----------------------------------------------------------------*/
void exchanged(void)
{ extern int inext;
extern int *pnext[4];
extern int xnext,ynext;
extern int i;
extern int *p[4];
extern int x,y;
int m;
for(m=0;m<4;m++)
p[m]=pnext[m];
i=inext;
x=xnext;
y=ynext;
changed(x,y,p[i]);
}
/*------------------------------------------------*/
void mark(int xx,int yy)
{extern int i;
extern pump[37][18];
extern int *p[4];
int *pp=p[i];
int maxm,maxn,m,n;
int row=yy/10;
int col=xx/10+1;
maxm=abs(*pp);maxn=abs(*(pp+1));
for(m=0;m<maxm;m++)
for(n=0;n<maxn;n++)
if(*(pp+m*4+n)>0)
pump[row+m][col+n]=1;
}
/*------------------------------------------------*/
int scans(void)
{extern int pump[37][18];
int k;
int row,col;
for(row=35;row>=0;row--)
{ k=0;
for(col=1;col<=16;col++)
if(pump[row][col])
k++;
if(k==16) return row;
}
return 0;
}
/*------------------------------------------------*/
void kick(int rownum)
{ extern int pump[37][18];
int row,col;
for(row=rownum;row>0;row--)
for(col=1;col<=16;col++)
pump[row][col]=pump[row-1][col];
}
/*------------------------------------------------*/
void redisplay(void)
{extern int pump[37][18];
int row,col;
clearviewport();
for(row=35;row>0;row--)
for(col=1;col<=16;col++)
if(pump[row][col])
barr((col-1)*10,row*10,(col-1)*10+9, row*10+9);
}
/*------------------------------------------------*/
void outnum(int x,int y,int num)
{char string[8];
itoa(num, string, 10);
settextstyle(0,0,0);
setcolor(10);
outtextxy(x, y, string);
}
/*------------------------------------------------*/
void gameover(void)
{ settextstyle(0,0,2);
setcolor(15);
outtextxy(8,140,"GAME OVER");
settextstyle(0,0,0);
setcolor(15);
outtextxy(43,180,"PRESS P KEY");
outtextxy(43,195,"TO RESTART");
outtextxy(43,210,"PRESS Q KEY");
outtextxy(43,225,"TO QUITE");
}
/*------------------------------------------------*/
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |