c++ ege 坦克大战

直接上代码:

#include "pch.h"
#include <iostream>
#include "graphics.h"
#include <math.h>
#include <time.h>
#include <thread>
#include <cstdio>
#include <cstdlib>
#include <mmsystem.h>
using namespace std;

/*
	全局变量定义
*/

PIMAGE img;
mouse_msg msg;
int score1 = 0,score2 = 0,over=0;//得分1,得分2,结束标志
int width = 900,height = 700,Left=0,Up=1,Right=2,Down=3;//游戏界面宽,高,由于子弹发射出去是一个独立的模块,所以要给每个子弹配备上方向,用0,1,2,3分别代表左,上,右,下
int lenT=0,lenG=0,lenW=0,lenF=0,lenR=0,lenS=0,lenBT=0;//坦克的数量,普通棕色墙的个数,白色墙的个数,草坪的个数,水潭的个数,小墙的个数,子弹的个数
int td1=0,td2=0;//方向
int model=0;//游戏模式标志,单人还是双人
clock_t ts1,te1,ts2,te2;//定义时间变量,防止子弹发射过快,用于计算时间间隔,时间太短就不发射子弹

struct Tank {//保存机器人坦克的信息
    int x,y,direction,preTime;//(x,y)坦克的位置,坦克的方向,上一次自动换方向的时刻
} tank[100];

struct myTank {//游戏玩家的坦克
	int x, y, direction;//位置和方向
}t1, t2;

struct Bullet {//子弹
    int x,y,direction,w;//子弹的位置,方向,w用于记录谁打出的子弹,1,2,3分别表示玩家1,玩家2,机器人
} bullet[1000];

struct General_wall {//棕色的大墙(可打破)(大小:60*60)
    int x,y;//位置
} gw[50];

struct White_wall {//白色的墙(不可打破)60*60
    int x,y;//位置
} ww[50];

struct Forest {//草丛60*60
    int x,y;//位置
} ft[50];

struct Water {//水块60*60
    int x,y;//位置
} wr[50];

struct samllBlocks {//小墙30*30
    int x,y;
} sb[50];

void startUI() {//初始化工作
    ts1= ts2 = clock();
    initgraph(width,height);//游戏界面大小
    setcaption("Tank");//设置游戏窗框标题
    img = newimage();
}

void playTank() {//绘制玩家坦克
    getimage(img,"D:/tank/p2tankU.gif",0,0);
    if(!model) {//模式1,单人
        t1.x=420,t1.y=550;//保存玩家坦克的初始化位置
		t1.direction = 1;//玩家坦克的方向
        putimage(420,550,img);//绘制玩家坦克
    } else {//双人
        t1.x=330,t1.y=640;//保存玩家坦克的初始化位置
        t2.x=510,t2.y=640;//保存玩家坦克的初始化位置
		t1.direction = 1;//玩家坦克的方向
		t2.direction = 1;//玩家坦克的方向
        putimage(330,640,img);//绘制玩家坦克
        putimage(510,640,img);//绘制玩家坦克
    }
}

void ranXY(int &x,int &y) {//随机位置,&x,&y相当于指针,直接改变调用函数时传入参数的值
    x = random(15)*60;
    y = random(11)*60+40;//40偏移,用于得分显示,不被游戏影响
}

int isRepeat(int x,int y) {//避免初始化物块重叠
    for(int i=0; i<lenT; i++) {//检测传入的(x,y)坐标是否与所有的坦克位置重复
        if(tank[i].x==x&&tank[i].y==y||y>550)
            return false;
    }
    for(int i=0; i<lenG; i++) {//检测传入的(x,y)坐标是否与所有的大棕墙位置重复
        if(gw[i].x==x&&gw[i].y==y)
            return false;
    }
    for(int i=0; i<lenW; i++) {//检测传入的(x,y)坐标是否与所有的大白墙位置重复
        if(ww[i].x==x&&ww[i].y==y)
            return false;
    }
    for(int i=0; i<lenF; i++) {//检测传入的(x,y)坐标是否与所有的草块位置重复
        if(ft[i].x==x&&ft[i].y==y)
            return false;
    }
    for(int i=0; i<lenR; i++) {//检测传入的(x,y)坐标是否与所有的水块位置重复
        if(wr[i].x==x&&wr[i].y==y)
            return false;
    }
    return true;
}

void produceTank() {//增加机器人坦克,用于补充坦克数量
	int temp = random(4) + 1;//增加的坦克个数
	int x, y;
	while (lenT < temp) {
		ranXY(x, y);
		if (isRepeat(x, y)) {//检测ranXY()产生的(x,y)坐标是否与其他物块重叠,重叠返回false
			//保存随机生成的坦克信息
			tank[lenT].x = x;
			tank[lenT].y = y;
			tank[lenT].direction = rand() % 4;
			tank[lenT++].preTime = 0;
		}
	}
}

void roadblocksXY() {//初始化所有的障碍物的数量及其位置
    int x,y,cnt=0,temp;
	//小墙块的信息
	int xx = 390, yy = 610;
	for (int i = 0; i < 3; i++) {//左边三个
		sb[lenS].x = xx;
		sb[lenS++].y = yy + 30 * i;
	}
	for (int i = 0; i < 3; i++) {//上边三个
		sb[lenS].x = xx + 30 * i;
		sb[lenS++].y = yy;
	}
	xx = 480;
	for (int i = 0; i < 3; i++) {//右边三个
		sb[lenS].x = xx;
		sb[lenS++].y = yy + 30 * i;
	}
	//机器人坦克
    temp = random(4)+3;//坦克数量
    while(lenT<temp) {
        ranXY(x,y);//产生随机位置函数
        if(isRepeat(x,y)) {
			//保存
            tank[lenT].x=x;
            tank[lenT].y=y;
			tank[lenT].direction = rand() % 4;//初始化方向
			tank[lenT++].preTime = 0;
        }
    }
	//草块
    temp = random(5)+1;//加1防止产生0个草块
    while(lenF<temp) {
        ranXY(x,y);
        if(isRepeat(x,y)) {
			//保存
            ft[lenF].x=x;
            ft[lenF++].y=y;
        }
    }
	//大棕墙
    temp = random(20)+2;
    while(lenG<temp) {
        ranXY(x,y);
        if(isRepeat(x,y)) {
			//保存
            gw[lenG].x=x;
            gw[lenG++].y=y;
        }
    }
	//大白墙
    temp = random(8)+2;
    while(lenW<temp) {
        ranXY(x,y);
        if(isRepeat(x,y)) {
			//保存
            ww[lenW].x=x;
            ww[lenW++].y=y;
        }
    }
	//水块
    temp = random(8)+1;
    while(lenR<temp) {
        ranXY(x,y);
        if(isRepeat(x,y)) {
			//保存
            wr[lenR].x=x;
            wr[lenR++].y=y;
        }
    }
}

void paintW() {//绘制所有的水块
    getimage(img,"D:/tank/water.gif",0,0);
    for(int i=0; i<lenR; i++) {
        putimage(wr[i].x,wr[i].y,img);
    }
}

void paintG() {//绘制所有的草块
    getimage(img,"D:/tank/grass.png",0,0);
    for(int i=0; i<lenF; i++) {
        putimage(ft[i].x,ft[i].y,img);
    }
}

void Paintcave() {//绘制大本营
	getimage(img, "D:/tank/star.gif", 0, 0);
	putimage(430, 650, img);//星星图
	getimage(img, "D:/tank/wallBig.gif", 0, 0);
	for (int i = 0; i < lenS; i++) {
		putimage(sb[i].x, sb[i].y, img);//小墙块
	}
}

void paintRoadblocks() {
	//模式一
	if (t1.direction == 0) {//绘制坦克1
		getimage(img, "D:/tank/p2tankL.gif", 0, 0);//左,不同的反向绘制的图片不一样,四张图片选择
		putimage(t1.x, t1.y, img);
	}
	else if (t1.direction == 1) {
		getimage(img, "D:/tank/p2tankU.gif", 0, 0);//上
		putimage(t1.x, t1.y, img);
	}
	else if (t1.direction == 2) {
		getimage(img, "D:/tank/p2tankR.gif", 0, 0);//右
		putimage(t1.x, t1.y, img);
	}
	else {
		getimage(img, "D:/tank/p2tankD.gif", 0, 0);//下
		putimage(t1.x, t1.y, img);
	}
	if (model) {//如果是模式二,就执行if语句,绘制坦克2,否则就不绘制
		if (t2.direction == 0) {
			getimage(img, "D:/tank/p2tankL.gif", 0, 0);//左
			putimage(t2.x, t2.y, img);
		}
		else if (t2.direction == 1) {
			getimage(img, "D:/tank/p2tankU.gif", 0, 0);//上
			putimage(t2.x, t2.y, img);
		}
		else if (t2.direction == 2) {
			getimage(img, "D:/tank/p2tankR.gif", 0, 0);//右
			putimage(t2.x, t2.y, img);
		}
		else {
			getimage(img, "D:/tank/p2tankD.gif", 0, 0);//下
			putimage(t2.x, t2.y, img);
		}
	}
	//机器人坦克
    getimage(img,"D:/tank/p1tankU.gif",0,0);
    for(int i=0; i<lenT; i++) {
        putimage(tank[i].x,tank[i].y,img);
    }
	//大白墙
    getimage(img,"D:/tank/steels.gif",0,0);
    for(int i=0; i<lenW; i++) {
        putimage(ww[i].x,ww[i].y,img);
    }
	//大棕墙
    getimage(img,"D:/tank/walls.gif",0,0);
    for(int i=0; i<lenG; i++) {
        putimage(gw[i].x,gw[i].y,img);
    }
	//以下几个物块的绘制提取成函数,是因为其他地方要单独绘制,方便使用
    paintW();//水块
    paintG();//草块
	Paintcave();//大本营
}


int crashCheck(int x,int y) {//坦克的碰撞检测
    if(x<0||x>width-60||y<40||y>height-60)//是否越界,跑到游戏界面外
        return false;
    for(int i=0; i<lenS; i++) {//与所有的小墙是否相撞
        if(sb[i].x-x>=60||x-sb[i].x>=30||sb[i].y-y>=60||y-sb[i].y>=30)
            continue;
        return false;
    }
    for(int i=0; i<lenG; i++) {//与所有的大棕墙是否相撞
        if(abs(gw[i].x-x)>=60||abs(gw[i].y-y)>=60)
            continue;
        return false;
    }
    for(int i=0; i<lenT; i++) {//与所有的机器人坦克是否相撞
        if(abs(tank[i].x-x)>=60||abs(tank[i].y-y)>=60)
            continue;
        return false;
    }
    for(int i=0; i<lenW; i++) {//与所有的大白墙是否相撞
        if(abs(ww[i].x-x)>=60||abs(ww[i].y-y)>=60)
            continue;
        return false;
    }
    return true;
}

void leftMove(myTank &t) {//玩家坦克左移
    if(crashCheck(t.x-5,t.y)) {//碰撞检测
        getimage(img,"D:/tank/back.png",0,0);
        putimage(t.x,t.y,img);//用黑块覆盖原来的坦克
        t.x-=5;
        paintW();
        getimage(img,"D:/tank/p2tankL.gif",0,0);
        putimage(t.x,t.y,img);//在新的位置绘制坦克
        paintG();
    }
}

void upMove(myTank &t) {//玩家坦克上移
    if(crashCheck(t.x,t.y-5)) {
        getimage(img,"D:/tank/back.png",0,0);
        putimage(t.x,t.y,img);
        t.y-=5;
        paintW();
        getimage(img,"D:/tank/p2tankU.gif",0,0);
        putimage(t.x,t.y,img);
        paintG();
    }
}

void downMove(myTank &t) {//玩家坦克下移
    if(crashCheck(t.x,t.y+5)) {
        getimage(img,"D:/tank/back.png",0,0);
        putimage(t.x,t.y,img);
        t.y+=5;
        paintW();
        getimage(img,"D:/tank/p2tankD.gif",0,0);
        putimage(t.x,t.y,img);
        paintG();
    }
}

void rightMove(myTank &t) {//玩家坦克右移
    if(crashCheck(t.x+5,t.y)) {
        getimage(img,"D:/tank/back.png",0,0);
        putimage(t.x,t.y,img);
        t.x+=5;
        paintW();
        getimage(img,"D:/tank/p2tankR.gif",0,0);
        putimage(t.x,t.y,img);
        paintG();
    }
}

void sExplode(const int xx,const int yy) {//小方块的爆炸效果显示
    int x = xx,y = yy;
    x-=53,y-=38;
	PlaySound(TEXT("D:/tank/blast.wav"), NULL, SND_FILENAME | SND_ASYNC);//爆炸音效播放
    getimage(img,"D:/tank/blast3.gif",0,0);//爆炸图片1
    putimage(x,y,img);
    delay_fps(300);//延时
    getimage(img,"D:/tank/blast4.gif",0,0);//爆炸图片2
    putimage(x,y,img);
    delay_fps(300);//延时
    getimage(img,"D:/tank/bback.png",0,0);//黑块覆盖爆炸图片
    putimage(x,y,img);
	paintRoadblocks();
	PlaySound(TEXT("D:/tank/tank.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//继续播放背景音乐
}

void explode(const int xx,const int yy) {//大方块的爆炸显示
    int x = xx,y = yy;
    x-=38,y-=24;
	PlaySound(TEXT("D:/tank/blast.wav"), NULL, SND_FILENAME | SND_ASYNC);//爆炸音效播放
    getimage(img,"D:/tank/blast3.gif",0,0);//爆炸图片1
    putimage(x,y,img);
    delay_fps(300);
    getimage(img,"D:/tank/blast4.gif",0,0);//爆炸图片2
    putimage(x,y,img);
    delay_fps(300);
    getimage(img,"D:/tank/blast5.gif",0,0);//爆炸图片3
    putimage(x,y,img);
    delay_fps(300);
    getimage(img,"D:/tank/blast6.gif",0,0);//爆炸图片4
    putimage(x,y,img);
    delay_fps(300);
    getimage(img,"D:/tank/blast7.gif",0,0);//爆炸图片5
    putimage(x,y,img);
    delay_fps(300);
    getimage(img,"D:/tank/blast8.gif",0,0);//爆炸图片6
    putimage(x,y,img);
    delay_fps(300);
    getimage(img,"D:/tank/bback.png",0,0);//黑块覆盖爆炸图片
    putimage(x,y,img);
	paintRoadblocks();
	PlaySound(TEXT("D:/tank/tank.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//继续播放背景音乐
}

void paintBullet() {//绘制子弹移动
    int x,y,flag,cx,cy;
    for(int j=0; j<lenBT; j++) {
		//计算移动后的位置
        if(bullet[j].direction==0) {
            x = bullet[j].x-5;
            y = bullet[j].y;
        } else if(bullet[j].direction==1) {
            x = bullet[j].x;
            y = bullet[j].y-5;
        } else if(bullet[j].direction==2) {
            x = bullet[j].x+5;
            y = bullet[j].y;
        } else {
            x = bullet[j].x;
            y = bullet[j].y+5;

        }
        flag=false;
        for(int i=0; i<lenS; i++) {//是否与所有的小墙相撞
            if(sb[i].x-x>=17||x-sb[i].x>=30||sb[i].y-y>=17||y-sb[i].y>=30)
                continue;
			cx = sb[i].x, cy = sb[i].y;
			//如果相撞,则从小墙结构体数组移除
            for(int k=i+1; k<lenS; k++)
                sb[k-1]=sb[k];
            lenS--;
			//相撞后,开启一个线程,调用爆炸效果播放,由于爆炸有一定的时间,如果不用线程,主函数会等待爆炸效果的执行,从而坦克失去控制
			thread thread1(sExplode,cx,cy);
			thread1.join();
            flag=true;
            break;
        }
        for(int i=0; i<lenG; i++) {//是否与所有的大棕墙相撞
            if(gw[i].x-x>=17||x-gw[i].x>=60||gw[i].y-y>=17||y-gw[i].y>=60)
                continue;
			cx = gw[i].x, cy = gw[i].y;
			//如果相撞,则从结构体数组移除
            for(int k=i+1; k<lenG; k++)
                gw[k-1]=gw[k];
            lenG--;
			//相撞后,开启一个线程,调用爆炸效果播放
			thread thread2(explode, cx, cy);
			thread2.join();
            flag=true;
            break;
        }
        for(int i=0; i<lenT; i++) {//是否与所有的机器坦克相撞
            if(tank[i].x-x>=17||x-tank[i].x>=60||tank[i].y-y>=17||y-tank[i].y>=60)
                continue;
			//判断是哪一个玩家击中机器人坦克
			if (bullet[j].w == 1) {
				score1 += 1;
			}
			else if(bullet[j].w == 2){
				score2 += 1;
			}
			//玩家1
			//将得分转化成数组,因为outtextxy()只能接受数组打印
			char c[5];
			c[2] = score1%10 + '0';//个位
			c[1] = score1%100/10 + '0';//十位
			c[0] = score1/100 + '0';//百位
			c[3] = 0;//数组结束标志
			getimage(img, "D:/tank/sblack.png", 0, 0);
			putimage(50, 10, img);
			outtextxy(50, 10, c);//得分输出到屏幕
			//玩家2
			c[2] = score2 % 10 + '0';
			c[1] = score2 % 100 / 10 + '0';
			c[0] = score2 / 100 + '0';
			c[3] = 0;
			getimage(img, "D:/tank/sblack.png", 0, 0);
			putimage(450, 10, img);
			outtextxy(450, 10, c);//得分输出到屏幕
			//如果相撞,则从结构体数组移除
			cx = tank[i].x, cy = tank[i].y;
            for(int k=i+1; k<lenT; k++)
                tank[k-1]=tank[k];
            lenT--;
			//相撞后,开启一个线程,调用爆炸效果播放
			thread thread3(explode, cx, cy);
			thread3.join();
            flag=true;
            break;
        }
        for(int i=0; i<lenW; i++) {//是否与所有的大白墙相撞
            if(ww[i].x-x>=17||x-ww[i].x>=60||ww[i].y-y>=17||y-ww[i].y>=60)
                continue;
            flag=true;
            break;
        }
        if(x<-17||x>=width+17||y>height+17|| y < 40)//子弹是否超出游戏边界
            flag=true;
		
        if(flag) {//如果flag为true,则子弹应该被销毁
			getimage(img, "D:/tank/sblack.png", 0, 0);
			putimage(bullet[j].x, bullet[j].y, img);//覆盖子弹
            for(int k=j+1; k<lenBT; k++)//从子弹结构体移除
                bullet[k-1]=bullet[k];
            lenBT--;
            j--;
			
        } else {//移向下一个位置
			if (!(430 - x >= 17 || x - 430 >= 40 || 650 - y >= 17 || y - 650 >= 40)) {
				over = true;
				return;
			}
            getimage(img,"D:/tank/sblack.png",0,0);//覆盖原来的子弹
            putimage(bullet[j].x,bullet[j].y,img);
            getimage(img,"D:/tank/tankmissile.gif",0,0);//绘制新的子弹
            putimage(x,y,img);
            bullet[j].x=x;//保存子弹的新位置
            bullet[j].y=y;
//            getch();
        }
    }
}

void produce(myTank t,int v,int w) {//产生子弹,参数分别为:哪一个坦克,方向,谁发射的子弹
	PlaySound(TEXT("D:/tank/blast.wav"), NULL, SND_FILENAME | SND_ASYNC);//发弹音效
	bullet[lenBT].w = w;
	//计算子弹的位置,并保存到结构体数组
    if(v==0) {
        bullet[lenBT].direction=0;
        bullet[lenBT].x=t.x-20;
        bullet[lenBT++].y=t.y+21;
    } else if(v==1) {
        bullet[lenBT].direction=1;
        bullet[lenBT].x=t.x+21;
        bullet[lenBT++].y=t.y-20;
    } else if(v==2) {
        bullet[lenBT].direction=2;
        bullet[lenBT].x=t.x+65;
        bullet[lenBT++].y=t.y+21;
    } else {
        bullet[lenBT].direction=3;
        bullet[lenBT].x=t.x+21;
        bullet[lenBT++].y=t.y+65;
    }
	delay_fps(60);
	PlaySound(TEXT("D:/tank/tank.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//继续主题音乐
}

void keyListener() {//键盘按键的监听
	//每一个键盘按钮都有一个虚拟的键值,可以查表
    if(kbmsg()) {
        if(keystate(0x25)) { //left
			t1.direction = 0;
            leftMove(t1);//左移函数
            td1 = Left;//修改玩家坦克的方向
        }
        if(keystate(0x26)) { //up
			t1.direction = 1;
            upMove(t1);
            td1 = Up;
        }
        if(keystate(0x27)) { //right
			t1.direction = 2;
            rightMove(t1);
            td1 = Right;
        }
        if(keystate(0x28)) { //down
			t1.direction = 3;
            downMove(t1);
            td1 = Down;
        }
        if(keystate('O')) { //发弹,字符o
            te1 = clock();
            if(te1-ts1>=200)
                produce(t1,td1,1);
            ts1 = te1;
        }
		if (model) {//如果是模式二,则监听玩家二的游戏按键
			if (keystate('W')) {
				t2.direction = 0;
				upMove(t2);
				td2 = Up;
			}
			if (keystate('A')) {
				t2.direction = 1;
				leftMove(t2);
				td2 = Left;
			}
			if (keystate('D')) {
				t2.direction = 2;
				rightMove(t2);
				td2 = Right;
			}
			if (keystate('S')) {
				t2.direction = 3;
				downMove(t2);
				td2 = Down;
			}
			if (keystate(0x20)) { //space 空格
				te2 = clock();
				if (te2 - ts2 >= 200)
					produce(t2, td2,2);
				ts2 = te2;
			}
		}
    }
}


int machinecrashCheck(int x, int y) {//机器人运动检测碰撞
	if (x<0 || x>width - 60 || y<40 || y>height - 60)
		return false;
	if (!(abs(t1.x - x) >= 60 || abs(t1.y - y) >= 60))//是否与玩家1碰撞
		return false;
	if (!(abs(t2.x - x) >= 60 || abs(t2.y - y) >= 60))//是否与玩家2碰撞
		return false;
	for (int i = 0; i < lenS; i++) {//是否与所有小墙碰撞
		if (sb[i].x - x >= 60 || x - sb[i].x >= 30 || sb[i].y - y >= 60 || y - sb[i].y >= 30)
			continue;
		return false;
	}
	for (int i = 0; i < lenG; i++) {//是否与所有大棕墙碰撞
		if (abs(gw[i].x - x) >= 60 || abs(gw[i].y - y) >= 60)
			continue;
		return false;
	}
	for (int i = 0; i < lenW; i++) {//是否与所有大白墙碰撞
		if (abs(ww[i].x - x) >= 60 || abs(ww[i].y - y) >= 60)
			continue;
		return false;
	}
	return true;
}

void machineleftMove(Tank &t) {//机器人左移
	if (machinecrashCheck(t.x - 5, t.y)) {//位置检测,是否能够左移
		getimage(img, "D:/tank/back.png", 0, 0);//覆盖原来的位置
		putimage(t.x, t.y, img);
		t.x -= 5;
		paintW();
		getimage(img, "D:/tank/p1tankL.gif", 0, 0);//新位置绘制
		putimage(t.x, t.y, img);
		paintG();
	}
}

void machineupMove(Tank &t) {//机器人上移
	if (machinecrashCheck(t.x, t.y - 5)) {
		getimage(img, "D:/tank/back.png", 0, 0);
		putimage(t.x, t.y, img);
		t.y -= 5;
		paintW();
		getimage(img, "D:/tank/p1tankU.gif", 0, 0);
		putimage(t.x, t.y, img);
		paintG();
	}
}

void machinedownMove(Tank &t) {//机器人下移
	if (machinecrashCheck(t.x, t.y + 5)) {
		getimage(img, "D:/tank/back.png", 0, 0);
		putimage(t.x, t.y, img);
		t.y += 5;
		paintW();
		getimage(img, "D:/tank/p1tankD.gif", 0, 0);
		putimage(t.x, t.y, img);
		paintG();
	}
}

void machinerightMove(Tank &t) {//机器人右移
	if (machinecrashCheck(t.x + 5, t.y)) {
		getimage(img, "D:/tank/back.png", 0, 0);
		putimage(t.x, t.y, img);
		t.x += 5;
		paintW();
		getimage(img, "D:/tank/p1tankR.gif", 0, 0);
		putimage(t.x, t.y, img);
		paintG();
	}
}

void machineAttack() {//坦克移动
	
	for (int i = 0; i < lenT; i++) {
		clock_t now = clock();
		if (now - tank[i].preTime > 1000) {//定时改变方向
			tank[i].direction=rand()%4;//随机生成方向
			tank[i].preTime = now;
		}
		int d = tank[i].direction;
		//移动
		if (d == 0) {
			machineleftMove(tank[i]);
		}
		else if (d == 1) {
			machinerightMove(tank[i]);
		}
		else if (d == 2) {
			machineupMove(tank[i]);
		}
		else {
			machinedownMove(tank[i]);
		}
	}
}

void machineAtackBullet() {//机器人发射子弹
	if (lenT) {
		int i = rand() % lenT;//随机选取一个机器人坦克
		myTank mt;
		mt.x = tank[i].x;
		mt.y = tank[i].y;
		mt.direction = tank[i].direction;
		produce(mt, tank[i].direction,3);
	}
}


void select() {
	getimage(img, "D:/tank/startui.jpg", 0, 0);//开始界面
	putimage(0, 0, img);
	PlaySound(TEXT("D:/tank/start.wav"),NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//开始音乐
	delay_fps(60);
	mouse_msg msg;
	while (true) {//死循环,等待鼠标或者键盘事件
		if (mousemsg()) {//是否有鼠标事件
			msg = getmouse();//得到鼠标事件结构体
			//判断鼠标是否是左键,是否按下,点击位置是否在图片开始按钮的位置范围内
			if (msg.is_left() && msg.is_down() && msg.x >= 306 && msg.x <= 502 && msg.y >= 440 && msg.y <= 625) {
				break;//满足条件的话,跳出开始等待界面
			}
		}
		if (keystate(0x0d)){ //enter是否按下enter键
			break;//跳出开始等待界面
		}
		if (keystate(0x1b) ){//esc是否按下esc键
			over=1;//游戏结束标记
			return ;
		}
	}
	setfillcolor(EGERGB(0x0, 0x0, 0x0));
	bar(0, 0, width, height);//游戏界面恢复成黑色
	PlaySound(NULL, NULL, SND_FILENAME);//停止播放开始音乐
	delay_fps(60);
}



int main() {
	model = 1;
    startUI();//初始化界面
	select();//等待用户选择界面
	outtextxy(10, 10, "score1:");
	outtextxy(400, 10, "score2:");
	roadblocksXY();//初始化随机生成障碍物位置
    playTank();//绘制玩家坦克
    paintRoadblocks();//绘制所有的障碍物
	PlaySound(TEXT("D:/tank/tank.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//播放背景音乐
	int mark = 0,e=50;
    while(true) {//死循环
		if (over) {//游戏是否结束
			PlaySound(TEXT("D:/tank/add.wav"), NULL, SND_FILENAME | SND_ASYNC);//播放结束音乐
			break;
		}
        keyListener();//键盘按键监听
        paintBullet();//子弹运动
		machineAttack();//机器人坦克移动
		if (mark>e) {//机器人开火间隔,死循环多少次发射一次子弹
			machineAtackBullet();
			mark = 0;
			e = rand() % 100 + 30;//随机生成死循环次数
		}
		mark++;
		if (lenT <= 2) {//机器人坦克的数量少于等于两个,添加机器人坦克
			produceTank();
		}
		delay_fps(60);//延时60fps
    }
	getimage(img, "D:/tank/over.jpg", 0, 0);//结束界面图片
	putimage(0, 0, img);
    getch();
	delay_fps(2000);//延时
	getch();
    closegraph();//关闭游戏界面
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38865022/article/details/82466208