⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c-box.c

📁 这是一款经典的小游戏
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<stdio.h> 
#include<dos.h> 
#include<string.h> 
#include<stdlib.h> 
#include<bios.h> 
#include<graphics.h> 
#include<conio.h> 
#include <alloc.h> 
#include<time.h> 
#include <math.h> 
#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;i<STEPMAX;i++) 
   STEP[i]=BOXMOVE[i]=0; 
   STEPNUM=0;} 
REGISTERSTEP()            /*登记步子*/ 
{ int i; 
  STEPNUM++; 
  i=(STEPNUM-1)%STEPMAX; 
  STEP[ i ]=DIRECTIONKEY;} 
int JUDGEWIN()         /*人每走一步,就判断赢了没有*/ 
  {int n=0,i,j; 
   for(i=0;i<10;i++) 
   for(j=0;j<10;j++) 
    if(ghose[i][j]==6)  n++; 
   if(n==BOXNUM)    return 1; 
   else return  0;} 
MOVE(ADD a)     /*依据人的下一位置的状态来控制人的行走*/ 
{ int flag; 
   int i=STEPNUM%STEPMAX; 
   switch(ghose[p.x+a.x][p.y+a.y]) /*下一位置的判断*/
{ case  0:{if(ghose[p.x][p.y]==5)  /*当前位置是否为目的地,且下一位置是空地*/
           {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=4;} 
           if(ghose[p.x][p.y]==2) /*判断当前位置是否为起点*/
           {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=0;} 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           p.x=p.x+a.x;p.y=p.y+a.y; 
           ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=2; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           flag=1;break;} 
   case  3:{if(ghose[p.x+2*a.x][p.y+2*a.y]==0||ghose[p.x+2*a.x][p.y+2*a.y]==4) /*下一位置是箱子*/
              {if(ghose[p.x+2*a.x][p.y+2*a.y]==0) 
                {if(ghose[p.x][p.y]==5) 
                   {ghose[p.x][p.y]=0; 
                    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                    ghose[p.x][p.y]=4;} 
                 if(ghose[p.x][p.y]==2) 
                    {ghose[p.x][p.y]=0; 
                     DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                     ghose[p.x][p.y]=0;} 
                 DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                 ghose[p.x+a.x][p.y+a.y]=ghose[p.x+2*a.x][p.y+2*a.y]=0; 
                 DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
                 DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); 
                 ghose[p.x+a.x][p.y+a.y]=2; 
                 ghose[p.x+2*a.x][p.y+2*a.y]=3; 
                 DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
                 DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); } 
             if(ghose[p.x+2*a.x][p.y+2*a.y]==4) 
               {if(ghose[p.x][p.y]==5) 
                 {ghose[p.x][p.y]=0; 
                  DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                  ghose[p.x][p.y]=4;} 
               if(ghose[p.x][p.y]==2) 
               {ghose[p.x][p.y]=0; 
                DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                ghose[p.x][p.y]=0;} 
                DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                ghose[p.x+a.x][p.y+a.y]=ghose[p.x+2*a.x][p.y+2*a.y]=0; 
                DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
                DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); 
                ghose[p.x+a.x][p.y+a.y]=2; 
                ghose[p.x+2*a.x][p.y+2*a.y]=6; 
                DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
                DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); } 
               p.x=p.x+a.x; p.y=p.y+a.y;flag=1;BOXMOVE[ i ]=1;break;} 
            else  flag=0;break;} 
    case  1:flag=0;break; 
    case  4:{if(ghose[p.x][p.y]==5) 
             {ghose[p.x][p.y]=0; 
              DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
              ghose[p.x][p.y]=4;} 
             if(ghose[p.x][p.y]==2) 
               {ghose[p.x][p.y]=0; 
                DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                ghose[p.x][p.y]=0;} 
             DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
             p.x=p.x+a.x;p.y=p.y+a.y; 
             ghose[p.x][p.y]=0; 
             DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
             ghose[p.x][p.y]=5; 
             DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
             flag=1;break;} 
     case  6:{if(ghose[p.x+2*a.x][p.y+2*a.y]==0||ghose[p.x+2*a.x][p.y+2*a.y]==4) 
                {if(ghose[p.x+2*a.x][p.y+2*a.y]==0) 
                  {if(ghose[p.x][p.y]==5) 
                    {ghose[p.x][p.y]=0; 
                      DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                       ghose[p.x][p.y]=4;} 
                   if(ghose[p.x][p.y]==2) 
                      {ghose[p.x][p.y]=0; 
                        DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                        ghose[p.x][p.y]=0;} 
                   DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                   ghose[p.x+a.x][p.y+a.y]=ghose[p.x+2*a.x][p.y+2*a.y]=0; 
                   DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
                   DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); 
                   ghose[p.x+a.x][p.y+a.y]=5; 
                   ghose[p.x+2*a.x][p.y+2*a.y]=3; 
                   DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
                   DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); } 
                if(ghose[p.x+2*a.x][p.y+2*a.y]==4) 
                  {if(ghose[p.x][p.y]==5) 
                   {ghose[p.x][p.y]=0; 
                    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                    ghose[p.x][p.y]=4;} 
                   if(ghose[p.x][p.y]==2) 
                     {ghose[p.x][p.y]=0; 
                      DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                      ghose[p.x][p.y]=0;} 
                   DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
                   ghose[p.x+a.x][p.y+a.y]=ghose[p.x+2*a.x][p.y+2*a.y]=0; 
                   DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
                   DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); 
                   ghose[p.x+a.x][p.y+a.y]=5; 
                   ghose[p.x+2*a.x][p.y+2*a.y]=6; 
                   DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
                   DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); } 
                p.x=p.x+a.x; p.y=p.y+a.y;flag=1;BOXMOVE[ i ]=1;} 
            else  flag=0;break;}
  } 
 return  flag;  } 
 REVERSELYMOVE()            /*对悔棋的处理*/ 
{ int i; 
  ADD  a; 
  i=(STEPNUM-1)%STEPMAX; 
  if(STEP[ i ]==0)   return; 
  else{ switch(STEP[ i ]) 
   {case  Key_Up:{a.x=1;a.y=0;MOVEBACK(a);break;} 
    case  Key_Down:{a.x=-1;a.y=0;MOVEBACK(a);break;} 
    case  Key_Left:{a.x=0;a.y=1;MOVEBACK(a);break;} 
    case  Key_Right:{a.x=0;a.y=-1;MOVEBACK(a);break;} } 
    STEPNUM--;STEP[ i ]=0;BOXMOVE[ i ]=0;}} 
  MOVEBACK(ADD a)    /*分箱子没有移动和箱子移动了两种情况分别进行悔棋*/ 
  { int i=(STEPNUM-1)%STEPMAX; 
    if(BOXMOVE[ i ]==0) /*箱子没移动就退人走的步子*/
    { if(ghose[p.x+a.x][p.y+a.y]==0&&ghose[p.x][p.y]==2) 
      {ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
       DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
       DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
       ghose[p.x][p.y]=0; 
       DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
       ghose[p.x+a.x][p.y+a.y]=2; 
       DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);} 
      if(ghose[p.x+a.x][p.y+a.y]==4&&ghose[p.x][p.y]==5) 
      {ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
       DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
       DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
       ghose[p.x][p.y]=4; 
       DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
       ghose[p.x+a.x][p.y+a.y]=5; 
       DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);} 
    if(ghose[p.x+a.x][p.y+a.y]==5&&ghose[p.x][p.y]==0) 
   { ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
    ghose[p.x][p.y]=4; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    ghose[p.x+a.x][p.y+a.y]=2; 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);} 
    if(ghose[p.x+a.x][p.y+a.y]==2&&ghose[p.x][p.y]==4) 
  { ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
    ghose[p.x][p.y]=0; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    ghose[p.x+a.x][p.y+a.y]=5; 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);} 
    p.x=p.x+a.x;p.y=p.y+a.y;} 
 else if(BOXMOVE[ i ]==1) /*若箱子动了,退人也退箱子*/
     {if(ghose[p.x-a.x][p.y-a.y]==3&&ghose[p.x][p.y]==2&&ghose[p.x+a.x][a.y+p.y]==0) 
      {ghose[p.x-a.x][p.y-a.y]=ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
       DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
       DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x); 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
    ghose[p.x-a.x][p.y-a.y]=0; 
    DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x); 
    ghose[p.x][p.y]=3; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    ghose[p.x+a.x][p.y+a.y]=2; 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
   } 
    if(ghose[p.x-a.x][p.y-a.y]==3&&ghose[p.x][p.y]==5&&ghose[p.x+a.x][a.y+p.y]==0) 
   {ghose[p.x-a.x][p.y-a.y]=ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
   DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x); 
   DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
   ghose[p.x-a.x][p.y-a.y]=0; 
   DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x); 
   ghose[p.x][p.y]=6; 
   DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
   ghose[p.x+a.x][p.y+a.y]=2; 
   DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
   } 
   if(ghose[p.x-a.x][p.y-a.y]==3&&ghose[p.x][p.y]==2&&ghose[p.x+a.x][a.y+p.y]==4) 
  {ghose[p.x-a.x][p.y-a.y]=ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
   DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
   DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x); 
   DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
   ghose[p.x-a.x][p.y-a.y]=0; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -