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 + -
显示快捷键?