该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
/* 在屏幕上放一个炸弹,位置为放弹人的位置 */
putimage(ball[i].x*30,ball[i].y*30,tu[1],0);
map[ball[i].x][ball[i].y]=20+i;
}
/***********************
产生炸弹的动态显示
*************************/
DrawZaDan()
{int i;
for (i=0;i<10;i++)
{if (ball[i].used==0)continue;/* 如果炸弹末使用继续循环*/
if (ball[i].page<4)/* 如果炸弹帧数<4,帧数加1,直接在炸弹位置放下一帧*/
{ball[i].page++;
putimage(ball[i].x*30,ball[i].y*30,tu[ball[i].page],0);
}
else/* 把帧数置为1,清去原图,绘第一帧*/
{ball[i].page=1;
putimage(ball[i].x*30,ball[i].y*30,tu[0],0);
putimage(ball[i].x*30,ball[i].y*30,tu[1],0);
}
}
}
/*****************************
检查是否有该炸的炸弹
如果有则引爆它
****************************/
CheckZaDan()
{
int i,t;
struct time t1;
gettime(&t1);
t=t1.ti_sec;
for (i=0;i<10;i++)
if (ball[i].used==1&&(t+60-ball[i].time)%60>=2&&man[ball[i].man].definetime==0) BaoZa(i);
}
/***********************
定时器引爆炸弹
参数为引爆人的编号
*************************/
DefineZa(int n)
{
int i;
if (man[n].definetime==0) return 0;
for (i=0;i<10;i++)
if (ball[i].used==1&&ball[i].man==n)BaoZa(i);
}
/***************************
产生人的移动效果
其中包括吃东西,推箱子等功能
参数x1,y1为移动的方向
和zaline()相同
mann为要移动人的编号
****************************/
move(int x1 ,int y1,int mann )
{
int fx ,fy,x,y;/*x,y 为现在的位置,fx,fy,存放要移动到的位置*/
x=man[mann].x;/*取要移动人的位置*/
y=man[mann].y;
fx=x+x1;/*要移动到 的位置为*/
fy=y+y1;
if ((fx>=0&&fx=0&&fy
{switch(map[fx][fy])
{ case 0:/*如果要移动到的位置为空*/
putimage(x*BOXLONG,y*BOXLONG,tu[0],0);
putimage(fx*BOXLONG,fy*BOXLONG,tu[11+mann],0);
break;
case 5:/*如果要移动到的位置为定时器*/
putimage(x*BOXLONG,y*BOXLONG,tu[0],0);
putimage(fx*BOXLONG,fy*BOXLONG,tu[11+mann],0);
man[mann].definetime=1;
break;
case 6:/*如果要移动到的位置为爆出的炸弹*/
putimage(x*BOXLONG,y*BOXLONG,tu[0],0);
putimage(fx*BOXLONG,fy*BOXLONG,tu[11+mann],0);
man[mann].maxball++;
break;
case 7:/*如果要移动到的位置为闪电,则*/
putimage(x*BOXLONG,y*BOXLONG,tu[0],0);
putimage(fx*BOXLONG,fy*BOXLONG,tu[11+mann],0);
man[mann].power++;
break;
case 9:/*如果要移动到的位置为可推的箱子,产生推箱效果*/
if(x+x1*2>=0&&x+x1*2=0&&y+y1*2
{putimage((x+x1*2)*BOXLONG,(y+y1*2)*BOXLONG,tu[9],0);
putimage((fx)*BOXLONG,(fy)*BOXLONG,tu[0],0);
putimage((fx)*BOXLONG,(fy)*BOXLONG,tu[mann+11],0);
putimage(x*30,y*30,tu[0],0);
map[x+x1*2][y+y1*2]=9;
map[fx][fy]=mann+11;
map[x][y]=0;
break;}
default:return 0;
}/* end of switch*/
/*移动完毕,修改屏幕数组信息*/
map[x][y]=0;
map[fx][fy]=11+mann;
/*修改移动人的信息*/
man[mann].x=fx;
man[mann].y=fy;
}/*end of if 范围*/
}/* end of funtion*/
GameOver()
{ int i;
/*释放内存空间*/
for(i=0;i<13;i++) if (i!=6) free(tu[i]);
/*关闭图形显示模式*/
closegraph();
/*结束程序*/
exit(1);
}
main()
{
int key=0,oldtime=0;/*K用来保存按键值,oldtime用来计时*/
struct time t1;/*定义一个时间型结构体*/
initgra();/*屏幕初始化*/
draw();/*绘图并保存图像*/
initgame();/*游戏初始化*/
while(1)
{if (bioskey(1)==0)/*没有按键*/
{/*每90百分秒,检测一次炸弹是否到爆炸时间,并重绘一次炸弹,产生动态效果*/
gettime(&t1);
if(t1.ti_hund+100-oldtime>90)
{
CheckZaDan();
DrawZaDan();
}
}else{
/*根据按键值,执行相应功能数*/
key=bioskey(0);
switch(key)
{case UP1: move(0,-1,0);break;
case DOWN1: move(0,1,0);break;
case LEFT1: move(-1,0,0);break;
case RIGHT1:move(1,0,0);break;
case UP2:move(0,-1,1);break;
case DOWN2:move(0,1,1);break;
case LEFT2:move(-1,0,1);break;
case RIGHT2:move(1,0,1);break;
case ENTER:PutZaDan(1);break;
case SPACE:PutZaDan(0);break;
case Z:DefineZa(0);break;
case DEL:DefineZa(1);break;
case ESC: GameOver();break;
}
}
}
}