正文

俄罗撕方快2005-09-18 01:41:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wojiele/4874.html

分享到:

/*-------------------------------------------------------*/
/*  sunwise 整理于 2002/5/27/14:35  Original 1999   */
/*                                                       */
/*-------------------------------------------------------*/

/*-------------  Compile  ------------------------------ */
/*        [in os mode:]                                  */
/*            bgiobj  egavga                             */
/*            tlib    lib\graphics.lib+egavga            */
/*        [in TC: ]      */
/*       make exe      */
/*-------------------------------------------------------*/
#include <stdlib.h>
#include <graphics.h>
#include <bios.h>
#define mDRAW     5
#define mLINE     6
#define mADOWN    7
#define mGEN      8
#define mLEFT     75
#define mRIGHT    77
#define mSPACE    57
#define mDOWN     80
#define mESC      1
#define TIMEINT   2
#define MAXX      9
#define MAXY   30
#define BACKCOLOR BLACK
#define WINX      50
#define WINY      470
#define GAP       6
#define AREAX     (WINX+GAP)
#define AREAY     (WINY-GAP)
#define BOXW      15

int oldarea[MAXY+1][MAXX];
int area[MAXY+1][MAXX];
int actW,actH,actX,actY;
int curX,curY,curColor,curW,curH;
int newX,newY,newColor,newW,newH;
int active;
int box[4][4];
int FORCOLOR;
int MESSAGE;
int BOX[7][4][4]={
 {
  {1,1,1,1},
  {0,0,0,0},
  {0,0,0,0},
  {0,0,0,0}
 },{
  {1,1,1,0},
  {1,0,0,0},
  {0,0,0,0},
  {0,0,0,0}
 },{
  {1,1,1,0},
  {0,0,1,0},
  {0,0,0,0},
  {0,0,0,0}

 },{
  {1,1,1,0},
  {0,1,0,0},
  {0,0,0,0},
  {0,0,0,0}
 },{
  {1,1,0,0},
  {0,1,1,0},
  {0,0,0,0},
  {0,0,0,0}
 },{
  {0,1,1,0},
  {1,1,0,0},
  {0,0,0,0},
  {0,0,0,0}
 },{
  {1,1,0,0},
  {1,1,0,0},
  {0,0,0,0},
  {0,0,0,0}
 }
};


void init();
void draw();
int genBox();
int getKey();
void lineFull();
int moveLeft();
int moveRight();
int moveDown();
int rotate();
int getW();
int getH();
void clearOldBox();
void putNewBox();
int collisionRotate(int box[][4]);
void getMessage();
void dispatchMessage();
int timeCome();
void fallDown();
int gameOver();

main()
{
 int i;/*printf("This program is made by xiezhijian");*/
 init();
 do
 {
  getMessage();
  dispatchMessage();
 }
 while(!gameOver());

 getch();
 closegraph();
}

void getMessage()
{
 if(MESSAGE) return;
 if(timeCome())
 {
  MESSAGE=mADOWN;
  return;
 }
 if(bioskey(1))
 {
  MESSAGE=bioskey(0)>>8;
  return;
 }
}

void dispatchMessage()
{
 switch(MESSAGE)
 {
  case mLEFT:  moveLeft();break;
  case mRIGHT: moveRight();break;
  case mADOWN: moveDown();break;
  case mSPACE: rotate();break;
  case mDOWN:  fallDown(); break;
  case mDRAW:  draw();break;
  case mLINE:  lineFull();break;
  case mGEN:   genBox();break;
  case mESC:   closegraph(); exit(0);
  default:     MESSAGE=0;
 }
}

void fallDown()
{
 while(active)
 {
  moveDown(); draw();
 }

 MESSAGE=mLINE;
}

int timeCome()
{

 static long tm, old;
 tm=biostime(0,tm);
 if(tm-old<TIMEINT) return 0;
 else
 {
  old=tm; return 1;
 }
}

void init()
{
 int i,j,x1,y1,x2,y2;
 int driver=DETECT, mode=0;
 randomize();
 registerbgidriver(EGAVGA_driver);
 initgraph(&driver,&mode,"");
 cleardevice();
 setfillstyle(SOLID_FILL,BLUE);
 bar(0,0,639,479);
 x1=AREAX;
 y1=AREAY-BOXW*MAXY;
 x2=AREAX+MAXX*BOXW;
 y2=AREAY;
 rectangle(--x1,--y1,++x2,++y2);
 setfillstyle(SOLID_FILL,BLACK);
 bar(++x1,++y1,--x2,--y2);
 y1=AREAY-MAXY*BOXW; y2=AREAY;
 setcolor(DARKGRAY);
 for(i=0;i<MAXX;i++)
 {
  x1=AREAX+i*BOXW;
  line(x1,y1,x1,y2);
 }

 x1=AREAX; x2=x1+MAXX*BOXW;
 for(j=0;j<MAXY;j++)
 {
  y1=AREAY-j*BOXW;
  line(x1,y1,x2,y1);
 }
 for(j=0;j<MAXY;j++)
  for(i=0;i<MAXX;i++)
   area[j][i]=oldarea[j][i]=0;
 actX=0; actY=0; actW=MAXX-1; actH=MAXY-1;
 draw();
 MESSAGE=mGEN;
}

int genBox()
{
 int i,j,boxidx;
 boxidx=random(7); FORCOLOR=random(7)+1;
 for(j=0;j<4;j++)
  for(i=0;i<4;i++)
   box[j][i]=BOX[boxidx][j][i];
 curW=getW(); curH=getH();
 curX=(MAXX+curW)/2;
 if(curX+curW>=MAXX)curX=MAXX-1-curW;
 curY=MAXY-1-curH;
 newX=curX; newY=curY; actX=curX;actY=curY;
 actW=newW=curW; actH=newH=curH;
 active=1;
 if(collision(box)) return 0;
 putNewBox();
 draw(); MESSAGE=0;
 return 1;
}

void lineFull()
{
 int row,col, rowEnd,full,i,j;
 rowEnd=newY+newH;
 if(rowEnd>=MAXY-1) rowEnd=MAXY-2;
 for(row=newY; row<=rowEnd;)
 {
  full=1;
  for(col=0;col<MAXX;col++)
   if(!area[row][col]){full=0; break;}
  if(!full){++row; continue;}
  for(j=row; j<MAXY-1;j++)
   for(i=0;i<MAXX;i++)
    area[j][i]=area[j+1][i];
  actX=0;actY=row; actW=MAXX-1; actH=MAXY-1-row;
  draw(); rowEnd--;
 }
 MESSAGE=mGEN;
}

void draw()
{
 int row,col,x1,y1,x2,y2;
 for(row=actY;row<=actY+actH;row++)
  for(col=actX;col<=actX+actW;col++)
   if(area[row][col]!=oldarea[row][col])
   {
    if(area[row][col]==0)
     setfillstyle(SOLID_FILL,BACKCOLOR);
    else
     setfillstyle(SOLID_FILL,FORCOLOR);

    x1=AREAX+col*BOXW; x2=x1+BOXW;
    y1=AREAY-(row+1)*BOXW; y2=y1+BOXW;
    bar(++x1,++y1,--x2,--y2);
    oldarea[row][col]=area[row][col];
   }

 MESSAGE=0;
}

int moveLeft()
{
 newX=curX-1; clearOldBox();
 if(collision(box))
 {
  newX=curX;
  putNewBox();
  MESSAGE=0;
  return 0;
 }
 putNewBox();
 actW=curW+1; actX=curX=newX;
 MESSAGE=mDRAW;
 return 1;
}

int moveRight()
{
 newX=curX+1; clearOldBox();
 if(collision(box))
 {
  newX=curX;
  putNewBox();
  MESSAGE=0;
  return 0;
 }
 putNewBox();
 actW=curW+1; actX=curX; curX=newX;
 MESSAGE=mDRAW;
 return 1;
}

int moveDown()
{
 int i,j;
 newY=curY-1;
 clearOldBox();
 if(collision(box))
 {
  newY=curY;
  putNewBox();
  active=0;
  MESSAGE=mLINE;
  return 0;
 }
 putNewBox();
 actH=curH+1; actY=newY; curY=newY;
 MESSAGE=mDRAW;
 return 1;
}

int rotate()
{
 int newBox[4][4];
 int i,j;
 clearOldBox();
 
 for(j=0;j<4;j++)
  for(i=0;i<4;i++)
   newBox[j][i]=0;

 for(j=0;j<4;j++)
  for(i=0;i<4;i++)
   newBox[curW-i][j]=box[j][i];
 newW=curH; newH=curW;
 if(collisionRotate(newBox))
 {
  newW=curW; newH=curH; newX=curX; newY=curY;
  putNewBox();
  MESSAGE=0;
  return 0;
 }

 for(j=0;j<4;j++)
  for(i=0;i<4;i++)
   box[j][i]=newBox[j][i];
 putNewBox();
 actH=newH>curH? newH:curH;
 actW=curX+actH-newX;
 actX=newX; actY=newY; curX=newX;
 curY=newY; curW=newW; curH=newH;
 MESSAGE=mDRAW;
 return 1;
}

int getW()
{
 int i,j;
 for(i=3;i>0;i--)
  for(j=0;j<4;j++)
   if(box[j][i]) return i;
 return 0;
}

int getH()
{
 int i,j;
 for(j=3;j>0;j--)
  for(i=0;i<4;i++)
   if(box[j][i]) return j;
 return 0;
}


void clearOldBox()
{
 int i,j;
 for(j=0;j<=curH; j++)
  for(i=0;i<=curW; i++)
   if(box[j][i])
    area[curY+j][curX+i]=0;
}

void putNewBox()
{
 int i,j;
 for(j=0;j<=newH;j++)
  for(i=0;i<=newW;i++)
   if(box[j][i])
    area[newY+j][newX+i]=FORCOLOR;
}

int collision(int cbox[][4])
{
 int i,j;
 if(newX<0) return 1;
 if(newX+newW>=MAXX) return 1;
 if(newY<0) return 1;
 for(j=0;j<=newH;j++)
  for(i=0;i<=newW;i++)
   if(area[newY+j][newX+i]&&cbox[j][i]) return 1;
 return 0;
}

int collisionRotate(int cbox[][4])
{
 int i,j;
 if(newX+newW>=MAXX) newX=MAXX-1-newW;
 if(newY+newH>=MAXY) newY=MAXY-1-newH;
 if(collision(cbox)) return 1;
 for(i=0;i<=newW;i++)
  for(j=0;j<=newH;j++)
   if(area[newY+j][newX+i])
   {
    newX-=newW-i+1; goto L;
   }
 L: return collision(cbox);
}

int gameOver()
{
 if(!active &&(curY+curH>MAXY-3)) return 1;
 else return 0;
}

/*                  the end                              */

 

阅读(4181) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册