www.pudn.com > C-box.rar > C-box.C


#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include   
#include  
#include   
#define  MAX   3        /*游戏的总关数*/  
#define  STEPMAX   3    /*悔棋的最大步数*/  
#define Key_R 0x1372  
#define Key_Up  0x4800  
#define Key_Enter 0x1c0d  
#define Key_Down  0x5000  
#define Key_P     0x1970  
#define Key_Esc   0x11b  
#define Key_Right  0x4d00  
#define Key_Left  0x4b00  
#define  BKCOLOR   GREEN /*设置背景颜色*/  
#define  STARTX   40     /*画游戏界面时,二维数组中ghose[0][0]左上角顶点在VGA模式下的横坐标*/  
#define  STARTY   80     /*画游戏界面时,二维数组中ghose[0][0]左上角顶点在VGA模式下的纵坐标*/   
int ghose[10][10];       /*用来表示游戏中各种状态的二维数组*/  
int BOXNUM;              /*每关中箱子的个数*/  
int MISSIONNUM;          /*玩家正在玩的关数*/  
int Key;                 /*从键盘读取按键值*/  
int STEPNUM;             /*人走的步数*/  
int DIRECTIONKEY;        /*用来记录玩家所按的方向键*/  
int BOXMOVE[STEPMAX];    /*记录人行走时箱子移动了没有.如有,BOXMOVE[ i ]=1,否则BOXMOVE[ i ]=0*/  
int STEP[STEPMAX];           /*记录人行走的方向*/  
typedef  struct  CURRENT     
{ int x;  
  int y;  
  }PLAYER;            
PLAYER  p;               /*p.x和p.y分别表示人当前所在的横纵坐标*/  
typedef  struct ADD  
{ int x;  
  int y;  
}ADD;                    /*人行走或悔棋时,用来表示人下一步移动需要增加的横纵坐标值*/  
 
void GAME()     /*游戏过程的控制*/  
{ int i,j,flag;  
  ADD  a;  
  MISSIONNUM=0;  
  NEXTMISSION();  
  do { flag=0;  
       Key=bioskey(0);  
    switch(Key)  
    { case  Key_Enter:{NEXTMISSION();break;}  
      case  Key_Up:{a.x=-1;a.y=0;flag=1;DIRECTIONKEY=Key;break;}  
      case  Key_Down:{a.x=1;a.y=0;flag=1;DIRECTIONKEY=Key;break;}  
      case  Key_Left:{a.x=0;a.y=-1;flag=1;DIRECTIONKEY=Key;break;}  
      case  Key_Right:{a.x=0;a.y=1;flag=1;DIRECTIONKEY=Key;break;}  
      case  Key_R:{MISSIONNUM--;NEXTMISSION();break;}  
      case  Key_P:{REVERSELYMOVE();break;}  
      case  Key_Esc:{DRAWEND();break;} 
    }  
  if(flag==1)  
     { if(MOVE(a)) /*判断下一步是否能走,若能走就记录这一步*/ 
         {  REGISTERSTEP(); /*登记步子为了悔棋用,但只能悔三步*/ 
            if(JUDGEWIN())  
               {settextstyle(1,0,2);  
                setcolor(RED);  
                outtextxy(40,10,"YOU HAVE PASSED THIS MISSION!");  
                outtextxy(40,30,"PLEASE PRESS ANYKEY TO CONTINUE!");  
                bioskey(0);  
                NEXTMISSION(); 
                } 
          } 
     } 
    }while(1);  
 }  
  NEXTMISSION()          /*画下一关的游戏界面和游戏初始化*/  
  {int i,j;  
   if(MISSIONNUM+1>MAX)  
   MISSIONNUM=1;  
   else  MISSIONNUM++;  
   cleardevice();  
   CHOOSEMISSION(MISSIONNUM);  
   for(i=0;i<10;i++)  
   for(j=0;j<10;j++)  
   DRAWMISSION(ghose[i][j],j,i);  
   DRAWINTRODUCTION();  
   settextstyle(1,0,2);  
   switch(MISSIONNUM)  
   { case 1:outtextxy(60,50,"MISSION 1");break;  
     case 2:outtextxy(60,50,"MISSION 2");break;  
     case 3:outtextxy(60,50,"MISSION 3");break;  
   }  
   for(i=0;i4;m++,n--)  
ghose[m][n]=1;  
ghose[6][8]=ghose[8][5]=ghose[5][3]=1;  
ghose[8][1]=2;                 /*构造人物在的地方,值为2*/ 
for(m=2;m<4;m++)  
ghose[m][2]=ghose[3][m]=3;     /*构造箱子放的地方,值为3*/ 
ghose[1][8]=ghose[6][6]=ghose[8][8]=4;   /*构造目的地,值为4*/ 
p.x=8; p.y=1;            /*设定玩家起点*/ 
BOXNUM=3;                /*设定这关的箱子数*/ 
}  
MISSION2()                /*画第二关的游戏界面*/  
{int m,n;  
for(m=0;m<10;m++)  
for(n=0;n<10;n++)  
ghose[m][n]=0;  
for(m=0;m<10;m++)  
ghose[0][m]=ghose[9][m]=ghose[m][0]=ghose[m][9]=1;  
for(m=2;m<4;m++)  
ghose[m][1]=ghose[3][m-1]=1;  
for(m=3,n=6;m>1&&n<8;m--,n++)  
ghose[m][n]=1;  
for(m=4;m<7;m++)  
ghose[6][m]=ghose[m+1][5]=1;  
ghose[1][4]=ghose[2][8]=1;  
ghose[6][8]=2;  
for(m=3;m<5;m++)  
ghose[m][4]=ghose[4][m]=3;  
ghose[4][2]=3;  
ghose[2][6]=ghose[3][7]=ghose[5][6]=ghose[7][6]=4;  
p.x=6;  p.y=8;BOXNUM=4;  
}  
MISSION3()           /*画第三关的游戏界面*/  
{int m,n;  
for(m=0;m<10;m++)  
for(n=0;n<10;n++)  
ghose[m][n]=0;  
for(m=0;m<10;m++)  
ghose[0][m]=ghose[9][m]=ghose[m][0]=ghose[m][9]=1;  
for(m=2,n=5;m<4&&n<7;m++,n++)  
ghose[m][n]=1;  
ghose[1][3]=ghose[3][3]=ghose[4][1]=ghose[5][4]=ghose[6][7]=ghose[7][5]=ghose[8][3]=1;  
ghose[4][4]=2;  
for(m=6;m<8;m++)  
ghose[m][2]=ghose[m][4]=3;  
ghose[7][3]=3;  
for(m=6;m<9;m++)  
ghose[1][m]=4;  
ghose[3][1]=ghose[8][7]=4;  
p.x=4;  p.y=4;  BOXNUM=5;  }  
DRAWMISSION(int n,int i,int j)   /*依据ghose[ i ][j]所对应的值,在相应位置画出图像*/    
{  
switch(n)  
   {  
   case 0:DRAWBACK(i,j);break;  
   case 1:DRAWWALL(i,j);break;  
   case 2:DRAWMAN(i,j);break;  
   case 3:DRAWBOX(i,j);break;  
   case 4:DRAWFLAG(i,j);break;  
   case 5:DRAWMAN1(i,j);break;  
   case 6:DRAWBOX1(i,j);break;  
   }  
}  
CHOOSEMISSION(int n)   /*根据关数去画相应的游戏界面*/       
{ switch(n)  
   {  
    case 1:MISSION1();break;  
    case 2:MISSION2();break;  
    case 3:MISSION3();break;  
   }  
}  
DRAWINTRODUCTION( )   /*画游戏界面旁边的介绍*/  
{ int n;  
  char *s[10]={"WALL","MAN","BOX","DESTINATION","MAN&&DESTINATION","BOX&&DESTINATION","P--REVERSELYMOVE","ENTER--Nextmission","ESC--Exit","R--Replay"};  
  settextstyle(1,0,2);  
  outtextxy(430,40,"INTRODUCTION");  
  settextstyle(0,0,1);  
  for(n=0;n<6;n++)  
  outtextxy(500,100+n*50,s[n]);  
DRAWWALL1(455,82);  
DRAWMAN2(473,151);  
DRAWBOX2(455,182);  
DRAWFLAG1(467,220);  
DRAWMAN3(473,301);  
DRAWBOX3(455,335); 
  setcolor(RED); 
  for(n=6;n<10;n++) 
  outtextxy(455,370+(n-5)*20,s[n]); 
  }  
 
void main()            /*主函数*/  
{  
Init();   
setbkcolor(BLACK);  
cleardevice();  
ABOVEALL();  
setbkcolor(BLUE);  
cleardevice();   
setbkcolor(BKCOLOR);  
cleardevice();  
GAME();  
getch();  
closegraph();  
}