#include<iostream.h>
#include <graphics.h>
#include <conio.h>
#include<time.h>
#include<windows.h>
#pragma comment (lib, "Winmm.lib")//导入Winmm.lib库
int N=2; ///敌方坦克数目,随着程序的运行,坦克数目会增加
int wall[26][26]; ///界面数据,二维数组,可消除墙为1,不可消除墙为 2,敌方坦克100~109,我方坦克200
struct tank_point ///坦克结构体
{
int x; //坦克左上角 数组中的列
int y; //坦克左上角 数组中的行
int f; //炮口朝向
int live; //是否或者
};
struct bullet_point ///子弹结构体
{
int x; //子弹横坐标
int y; //子弹纵坐标
int flag; //子弹是否存在
};
void wall_main(); //初始化墙的数据
void wall_rewrite(); //画墙
void menu(); //画制菜单
int bullet_action(bullet_point *,int ,tank_point *,int ,int *); //子弹移动并且判断是否击中目标
int me_over(bullet_point ,tank_point ); //判断我方坦克是否死亡
void tank_action(tank_point *,char ,int ); //敌方坦克移动
char direction(tank_point ,tank_point ); //产生敌方坦克的运动方向(攻击我方坦克)
char direction_home(tank_point ); //产生敌方坦克的运动方向(攻击老巢)
int bullet_nemey_action(tank_point ,bullet_point *,int *,int ); //敌方坦克发射子弹(包括敌方子弹运动)
void play_again();
void main()
{
initgraph(650, 650); //定义画布 650*650
menu(); //调用menu()函数,画菜单(包括游戏说明、开始按钮)
srand(time(NULL)); //随机数
wall_main(); ///调用函数,墙数据初始化
wall_rewrite(); //调用函数画墙
tank_point tank; //用坦克结构体定义我方坦克
bullet_point bullet; //用子弹结构体定义我方子弹
bullet.flag=0;
tank_point tank_nemey[10]; //敌方坦克数组
bullet_point bullet_nemey[10]; //敌方子弹
int f_f[10]; //定义数组存放敌方子弹的运动方向
for(int i=0;i<10;i++) //遍历十辆敌方坦克与子弹,进行初始化
{
bullet_nemey[i].flag=0; //等于0,表示子弹不存在
if(i%3==0) //if语句为十辆坦克分派初始位置
tank_nemey[i].x=0;
else if(i%3==1)
tank_nemey[i].x=12;
else if(i%3==2)
tank_nemey[i].x=24;
tank_nemey[i].y=0;
tank_nemey[i].live=1;
wall[tank_nemey[i].y][tank_nemey[i].x]=100+i; //将坦克的位置标记在墙的数据上
wall[tank_nemey[i].y][tank_nemey[i].x+1]=100+i;
wall[tank_nemey[i].y+1][tank_nemey[i].x]=100+i;
wall[tank_nemey[i].y+1][tank_nemey[i].x+1]=100+i;
f_f[i]=2; //坦克的初始方向 都向下
}
tank.x=8; //我方坦克初始位置
tank.y=25;
tank.f=8; //我方坦克初始化方向
wall[tank.y][tank.x]=200; //将我方坦克位置标记到墙数据上
wall[tank.y][tank.x+1]=200;
wall[tank.y+1][tank.x]=200;
wall[tank.y+1][tank.x+1]=200;
IMAGE img,img_V,img_D; //图片,坦克,胜利,失败
loadimage(&img,"坦克.jpg",49,49);
loadimage(&img_V,"胜利.jpg",500,250);
loadimage(&img_D,"失败.jpg",500,250);
//主函数上半部分为数据初始化
//主函数下半部分为动画制作
char m='w';
int f,flag=0,ch[10],win=0;
PlaySound("tank.wav", NULL, SND_FILENAME | SND_ASYNC);
while(1)
{
putimage(tank.x*25,tank.y*25,&img);
if(flag%1000==0&&N<=10) ///10000ms产生一辆新坦克
N=N+1;
for(i=0;i<N;i++) //遍历已经产生过的敌方坦克
{
if(tank_nemey[i].live==1) //判断敌方坦克是否存在
{
if((flag%50)==5*i) ///500ms,敌方坦克运动一次
tank_action(&tank_nemey[i],ch[i],i);
if(flag%200==20*i) ///2000ms,敌方坦克改变一次方向
{
if(i%2==1) //编号为单数的坦克攻击老巢
ch[i]=direction_home(tank_nemey[i]);
else //编号为双数的坦克攻击我方坦克
ch[i]=direction(tank,tank_nemey[i]);
if(bullet_nemey_action(tank_nemey[i],&bullet_nemey[i],&f_f[i],0)) //敌方子弹存在—>运动,不存在—>发射
{
putimage(100,200,&img_D); //打到老巢,游戏结束
getch();
play_again();
}
}
}
if(flag%2==0) //子弹20ms动一次
if(bullet_nemey_action(tank_nemey[i],&bullet_nemey[i],&f_f[i],1)) ///子弹若存在就运动
{
putimage(100,200,&img_D); //打到老巢,游戏结束
getch();
play_again();
}
if(me_over(bullet_nemey[i],tank)==1) //如果子弹打到我方坦克,游戏结束
{
putimage(100,200,&img_D);
getch();
play_again();
}
}
if(kbhit()) ///接收键盘输入,输入我方坦克方向
m=getch();
if(m=='p')
{
while(m!=getch());
m='1';
}
switch (m) //我方坦克移动
{
case 'w': //上
if(wall[tank.y-1][tank.x]==0&&wall[tank.y-1][tank.x+1]==0&&tank.y-1>=0) //判断是否可以向上移动
{
wall[tank.y-1][tank.x]=200; //改变墙数据
wall[tank.y-1][tank.x+1]=200;
wall[tank.y+1][tank.x]=0;
wall[tank.y+1][tank.x+1]=0;
setfillcolor(BLACK);
solidrectangle(tank.x*25,tank.y*25,tank.x*25+49,tank.y*25+49); //黑方块盖住旧坦克
tank.y=tank.y-1;
}
loadimage(&img,"坦克.jpg",49,49);
tank.f=8;
m='1';
break;
case 'a': //左
if(wall[tank.y][tank.x-1]==0&&wall[tank.y+1][tank.x-1]==0&&tank.x-1>=0)
{
wall[tank.y][tank.x-1]=200;
wall[tank.y+1][tank.x-1]=200;
wall[tank.y][tank.x+1]=0;
wall[tank.y+1][tank.x+1]=0;
setfillcolor(BLACK);
solidrectangle(tank.x*25,tank.y*25,tank.x*25+49,tank.y*25+49);
tank.x=tank.x-1;
}
loadimage(&img,"坦克4.jpg",49,49);
tank.f=4;
m='1';
break;
case 'd': //右
if(wall[tank.y][tank.x+2]==0&&wall[tank.y+1][tank.x+2]==0&&tank.x+2<=25)
{
wall[tank.y][tank.x+2]=200;
wall[tank.y+1][tank.x+2]=200;
wall[tank.y][tank.x]=0;
wall[tank.y+1][tank.x]=0;
setfillcolor(BLACK);
solidrectangle(tank.x*25,tank.y*25,tank.x*25+49,tank.y*25+49);
tank.x=tank.x+1;
}
loadimage(&img,"坦克6.jpg",49,49);
tank.f=6;
m='1';
break;
case 's': //下
if(wall[tank.y+2][tank.x]==0&&wall[tank.y+2][tank.x+1]==0&&tank.y+2<=25)
{
wall[tank.y+2][tank.x]=200;
wall[tank.y+2][tank.x+1]=200;
wall[tank.y][tank.x]=0;
wall[tank.y][tank.x+1]=0;
setfillcolor(BLACK);
solidrectangle(tank.x*25,tank.y*25,tank.x*25+49,tank.y*25+49);
tank.y=tank.y+1;
}
loadimage(&img,"坦克2.jpg",49,49);
tank.f=2;
m='1';
break;
case 'j': //发射子弹
if(bullet.flag==0) //如果子弹不存在,初始化子弹位置
{
bullet.flag=1;
if(tank.f==8) //若此时坦克方向向上,子弹方向向上
{
bullet.x=tank.x*25+23;
bullet.y=tank.y*25;
}
else if(tank.f==4) //同上
{
bullet.x=tank.x*25;
bullet.y=tank.y*25+23;
}
else if(tank.f==2) //同上
{
bullet.x=tank.x*25+23;
bullet.y=tank.y*25+40;
}
else if(tank.f==6) //同上
{
bullet.x=tank.x*25+40;
bullet.y=tank.y*25+23;
}
f=tank.f; // f 储存子弹的运动方向
}
m='1';
break;
}
if(bullet.flag==1) //我方子弹位置判断
{
if(bullet_action(&bullet,f,tank_nemey,0,&win)) //调用子弹运动函数,并判断是否打到老巢
{
putimage(100,200,&img_D);
getch();
return ;
}
}
if(win==10) //当10辆敌方坦克被击毁,游戏结束
{
putimage(100,200,&img_V);
getch();
play_again();
}
flag++; //计数器 每做一次循环flag+1
Sleep(10); //循环休眠10毫秒
}
}
//墙数据初始化
void wall_main()
{
int i,j;
for(i=0;i<26;i++) //把整个界面分成26*26个小方格,空白为0,可消墙为1,不可消墙为2
for(j=0;j<26;j++)
wall[i][j]=0;
for(i=0;i<26;i++)
{
for(j=0;j<26;j++)
{
if(i==6||i==7)
if(j==12)
{
wall[i][j]=2;
wall[i][j+1]=2;
}
if((i>=2&&i<=8)||(i>=18&&i<=20))
if(j==2||j==6||j==10||j==14||j==18||j==22)
{
wall[i][j]=1;
wall[i][j+1]=1;
}
if(i==17)
if(j==2||j==6||j==10||j==14||j==18||j==2
评论1