box.c

来自「redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是B」· C语言 代码 · 共 597 行 · 第 1/3 页

C
597
字号
         *xp=x;
         *yp=y;
         return box_push;
      }
      if (box[y+yd][x+xd]==box_dd)//将箱子移到一个放置点
      {
         box[y+yd][x+xd]=box_b2;
         box[y][x]=box_db;//置为空地
         box_show_map(box[y+yd][x+xd],x+xd,y+yd);
         box_show_map(box[y][x],x,y);
         *xp=x;
         *yp=y;
         return box_push_in;
      }
      return 0;
   }
   return 0;
}
void box_back(box_sav *save,u32 *sp,u8 *xp,u8 *yp,u8 box[10][15],u8 *cnt)//悔棋
{
   u8 temp;
   int x=*xp,y=*yp;
   int xd=0,yd=0;
   if (*sp==0) {arlt("系统提示:","您已经后退到初始状态!");return;}//没有历史记录
   *sp=*sp-1;
   switch(save[*sp].dre)
   {
      case box_up:
         yd=-1;
         break;
      case box_down:
         yd=1;
         break;
      case box_left:
         xd=-1;
         break;
      case box_right:
         xd=1;
         break;
      default:
         return;
   }
   box_show_map(box[*yp][*xp],*xp,*yp);
   *yp-=yd;
   *xp-=xd;
   box_show_map(save[*sp].dre,*xp,*yp);
   switch(save[*sp].act)
   {
      case box_move:
         break;
      case box_push:
         temp=box[y+yd][x+xd];
         box[y+yd][x+xd]=box[y][x];
         box[y][x]=temp;
         box_show_map(box[y][x],x,y);
         box_show_map(box[y+yd][x+xd],x+xd,y+yd);
         break;
      case box_push_in:
         box[y][x]=box_b1;
         box[y+yd][x+xd]=box_dd;
         box_show_map(box[y][x],x,y);
         box_show_map(box[y+yd][x+xd],x+xd,y+yd);
         *cnt+=1;
         break;
      case box_push_out:
         box[y+yd][x+xd]=box_dd;
         box[y][x]=box_b1;
         box_show_map(box[y][x],x,y);
         box_show_map(box[y+yd][x+xd],x+xd,y+yd);
         *cnt-=1;
         break;
   }
}
void box_save_step(box_sav *save,u32 *sp,u8 act,u8 dre)
{
   int i;
   if (*sp<1023)
   {
      save[*sp].act=act;
      save[*sp].dre=dre;
      *sp=(*sp)+1;
      return;
   }
   else
   {
      for (i=0;i<1024;i++) save[i]=save[i+1];
      save[1023].dre=dre;
      save[1023].act=act;
   }
}

void box_game()
{
   u8 id=0;
   u8 done=0;
   u8 box[10][15];
   u8 xp,yp,xsp=0,ysp=0;
   u8 cnt;
   int start=1;
   u8 dre=box_up;//方向
   u32 time=TM_CN;
   u32 sp=0;
   box_sav save[1024];
   cnt=load_box_data(id,box,&xp,&yp);
   xsp=xp;
   ysp=yp;
   show_box_data(box);
   while (1)//开始游戏
   {
      readkey();
      if (CS_IsKeyDown(KEY_LEFT))//
      {
         dre=box_left;//改变工人方向
         done=box_check_do(box,&xp,&yp,dre);
      }
      else if(CS_IsKeyDown(KEY_RIGHT))
      {
         dre=box_right;
         done=box_check_do(box,&xp,&yp,dre);
      }
      else if(CS_IsKeyDown(KEY_UP))
      {
         dre=box_up;
         done=box_check_do(box,&xp,&yp,dre);
      }
      else if(CS_IsKeyDown(KEY_DOWN))
      {
         dre=box_down;
         done=box_check_do(box,&xp,&yp,dre);
      }
      else if(CS_IsKeyDown(KEY_START))//设置当前关卡为原始状态
      {
         cnt=load_box_data(id,box,&xp,&yp);
         xsp=xp;
         ysp=yp;
         show_box_data(box);
         sp=0;
      }
      else if(CS_IsKeyDown(KEY_R) && id<bcnt)
      {
         id++;
         cnt=load_box_data(id,box,&xp,&yp);
         xsp=xp;
         ysp=yp;
         show_box_data(box);
         sp=0;
      }
      else if(CS_IsKeyDown(KEY_L) && id)
      {
         id--;
         cnt=load_box_data(id,box,&xp,&yp);
         xsp=xp;
         ysp=yp;
         show_box_data(box);
         sp=0;
      }
      else if(CS_IsKeyDown(KEY_B))//悔棋
      {
         box_back(save,&sp,&xp,&yp,box,&cnt);
         xsp=xp;
         ysp=yp;
      }
      else if(CS_IsKeyDown(KEY_SELECT))
      {
         if (arlt("结束游戏:","您真的要退出推箱子游戏吗?\n   [A:YES]  [B:NO]")) return;
      }
      if (done)
      {
         box_save_step(save,&sp,done,dre);
         if (done==box_push_in)
         {
            cnt--;
            if (cnt==0)
            {
               arlt("恭喜通关:","您已经顺利通过当前关卡。来迎接新一轮的挑战吧.");
               id++;
               if (id>bcnt) id=0;
               cnt=load_box_data(id,box,&xp,&yp);
               xsp=xp;
               ysp=yp;
               show_box_data(box);
               sp=0;
            }
         }
         else if(done==box_push_out) cnt++;
         box_show_map(box[ysp][xsp],xsp,ysp);
         box_show_map(dre,xp,yp);
         xsp=xp;ysp=yp;
         done=0;
      }
      if (time!=TM_CN)//闪烁显示搬运工人
      {
         time=TM_CN;
         if (time&1) box_show_map(dre,xp,yp);
         else box_show_map(box[yp][xp],xp,yp);
      }
   }
}

⌨️ 快捷键说明

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