逐步实现一个简易的飞机大战(c++)

用easy图形库做一个简单的c++小游戏—简单版飞机大战

某大一学生,无奈在家上网课,慌得无聊。无意间认识了easyx图形库,便有了新的想法,搞一个飞机大战。当时每天写一点,日积月累,也就完成了。

以下为某大一学生,学习了半年c++以及一些课外知识所实现的:(其实课上学不了多少东西,很多知识都要课外自学的)

开发环境:visual c++6.0
库:easyx图形库 下载地址>>> (https://easyx.cn/downloads/)

我当初分成6步实现(瞎设计的,其实就是想到啥写啥):
在这里插入图片描述

下面附上每一段实现的图片效果以及源代码。

1.首先实现人物的移动:

人物的移动很简单,加个“conio.h”头文件,根据ascii码判断就得了。
在这里插入图片描述
这段代码很简单:

#include <iostream>
#include <graphics.h>
#include <conio.h>
using namespace std;

int main(){
	int x=20;
	int y=20;
	int s[50][50];
	for(int i=0;i<50;i++){
		for(int j=0;j<50;j++){
			s[i][j]=0;
		}
	}
	initgraph(500,500);
	BeginBatchDraw();
	while(1){
		s[x][y]=1;
		Sleep(50);
		setfillcolor(WHITE);
		solidrectangle(0,0,500,500);
		if(GetKeyState(65)<0&&x>1)x--;//a,向左
		if(GetKeyState(68)<0&&x<49)x++;//d,向右
		if(GetKeyState(83)<0&&y<49)y++;//s,向下
		if(GetKeyState(87)<0&&y>1)y--;//w,向上
		for(i=0;i<50;i++){
			for(int j=0;j<50;j++){
				if(s[i][j]==1){
					s[i][j]=0;
					setfillcolor(GREEN);
					solidrectangle((i-1)*10,(j-1)*10,i*10,j*10);
				}//if
			}//for
		}//for
		FlushBatchDraw();
	}//while
}//main

2.其次就是增加子弹的发射

加个数组来整子弹的数据
在这里插入图片描述
这段代码可还行:(改变不大)

#include <iostream>
#include <graphics.h>
#include <conio.h>
using namespace std;

int main(){
	int bid(0),btim(0);
	int mbx[500];
	int mby[500];
	int x=20;
	int y=20;
	int s[50][50];
	for(int i=0;i<50;i++){
		for(int j=0;j<50;j++){
			s[i][j]=0;
		}
	}
	initgraph(500,500);
	BeginBatchDraw();
	while(1){
		btim++;
		s[x][y]=1;
		Sleep(50);
		setfillcolor(WHITE);
		solidrectangle(0,0,500,500);
		if(GetKeyState(65)<0&&x>1)x--;//a,向左
		if(GetKeyState(68)<0&&x<49)x++;//d,向右
		if(GetKeyState(83)<0&&y<49)y++;//s,向下
		if(GetKeyState(87)<0&&y>1)y--;//w,向上
		if(GetKeyState(74)<0&&btim>3){//攻击
			btim=0;
			mbx[bid]=x;
			mby[bid]=y-1;
			bid++;
		}
		for(i=0;i<bid;i++){
			mby[i]--;
			setfillcolor(RED);
			solidcircle(mbx[i]*10-5,mby[i]*10,2);
			if(mby[i]==0)mbx[i]=-999;
		}//if
		for(i=0;i<50;i++){
			for(int j=0;j<50;j++){
				if(s[i][j]==1){
					s[i][j]=0;
					setfillcolor(GREEN);
					solidrectangle((i-1)*10,(j-1)*10,i*10,j*10);
				}//if
			}//for
		}//for
		FlushBatchDraw();
	}//while
}//main

3.再其次就是先增加一个boss,加上武器的伤害设置和血量设置,同时新含增加了一个武器(激光)

设一个随机移动的物体,另外加点判断
在这里插入图片描述
附上代码:

#include <iostream>
#include <graphics.h>
#include <conio.h>
#include <time.h>
using namespace std;

int main(){
	srand((int)time(0));
	int bid(0),btim(0),mlx(0),mly(0),bossmove(0),bosstim(0),bosshp(200),mhp(20);
	int mbx[50],mby[50];
	int x=20,y=40;
	int bossx=30,bossy=5;
	char c[10];
	int s[50][50];
	for(int i=0;i<50;i++){
		for(int j=0;j<50;j++){
			s[i][j]=0;
		}
	}
	initgraph(500,500);
	BeginBatchDraw();
	while(1){
		btim++;
		bosstim++;
		s[x][y]=1;
		s[bossx][bossy]=-1;
		Sleep(50);
		setfillcolor(WHITE);
		solidrectangle(0,0,500,500);
		if(bosstim>5){
			bosstim=0;
			bossmove=-1+rand()%3;
			if(bossmove==-1&&bossx>2)bossx-=1;
			if(bossmove==1&&bossx<48)bossx+=1;
		}//if
		if(GetKeyState(75)<0){//激光攻击
			mlx=x;
			mly=y-1;
			setfillcolor(LIGHTGRAY);
			solidrectangle((mlx-1)*10,10,mlx*10,mly*10);
			if(mlx==bossx||mlx==bossx+1){
				settextcolor(RED);
				settextstyle(15,0,"宋体");
				setbkmode(TRANSPARENT);
				outtextxy((bossx-3)*10,(bossy-1)*10,"-1");
				bosshp-=1;
			}//if
		}//if
		if(GetKeyState(65)<0&&x>1)x--;//a,向左
		if(GetKeyState(68)<0&&x<49)x++;//d,向右
		if(GetKeyState(83)<0&&y<49)y++;//s,向下
		if(GetKeyState(87)<0&&y>1)y--;//w,向上
		if(GetKeyState(74)<0&&btim>3){//子弹攻击
			btim=0;
			mbx[bid]=x;
			mby[bid]=y-1;
			bid++;
			if(bid>=50)bid=0;
		}
		for(i=0;i<50;i++){//子弹攻击
			mby[i]--;
			setfillcolor(RED);
			solidcircle(mbx[i]*10-5,mby[i]*10,2);
			if(mby[i]==0)mbx[i]=-999;
			if(mbx[i]==bossx&&mby[i]==bossy){
				mbx[i]=-999;
				settextcolor(RED);
				settextstyle(15,0,"宋体");
				setbkmode(TRANSPARENT);
				outtextxy((bossx-4)*10,(bossy-1)*10,"-4");
				bosshp-=4;
			}//if
			if(mbx[i]==bossx+1&&mby[i]==bossy){
				mbx[i]=-999;
				settextcolor(RED);
				settextstyle(15,0,"宋体");
				setbkmode(TRANSPARENT);
				outtextxy((bossx-4)*10,(bossy-1)*10,"-4");
				bosshp-=4;
			}//if
		}//for	
		for(i=0;i<50;i++){//物质描绘
			for(int j=0;j<50;j++){
				if(s[i][j]==1){
					s[i][j]=0;
					setfillcolor(GREEN);
					solidrectangle((i-1)*10,(j-1)*10,i*10,j*10);
				}//if
				if(s[i][j]==-1){
					s[i][j]=0;
					setfillcolor(BLACK);
					solidrectangle((i-1)*10,(j-1)*10,(i+1)*10,(j+1)*10);
				}//if
			}//for
		}//for
		settextcolor(RED);//boss血量的描绘
		settextstyle(15,0,"宋体");
		setbkmode(TRANSPARENT);
		itoa(bosshp,c,10);
		outtextxy((bossx-1)*10,(bossy-3)*10,c);
		itoa(mhp,c,10);
		outtextxy((x-1)*10,(y-3)*10,c);
		FlushBatchDraw();
		if(bosshp<=0)break;
	}//while
	return 0;
}//main

4.一个boss肯定不够打的嘛,再外加两个炮台,增加上敌方的子弹设置(随机发射)

外设两个不动的物体。再来加数组来整敌方的子弹。(重点加上数学函数,实现子弹的随机)
在这里插入图片描述
附上代码:

#include <iostream>
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <math.h>
using namespace std;

float cot(float angle){//定义cot函数
	return 1/tan(angle*1.0/180*3.1415926);//弧度=角度*1/180*pi
}
float *rexy(float angle){//角度判断
	static float re[2];
	if(angle>360)angle-=360;
	if(angle<0)angle+=360;
	float co,xa,ya;
	if(angle==0){
		xa=0;
		ya=-5;
	}
	if(angle<90){
		co=cot(90-angle);
		ya=-1*sqrt(25*1.0/(1+co*co));
		xa=-1*co*ya;//co=xa/ya
	}
	if(angle==90){
		ya=0;
		xa=5;
	}
	if(angle>90&&angle<180){
		co=cot(angle-90);
		ya=sqrt(25*1.0/(1+co*co));
		xa=co*ya;
	}
	if(angle==180){
		xa=0;
		ya=5;
	}
	if(angle>180&&angle<270){
		co=cot(270-angle);
		ya=sqrt(25*1.0/(1+co*co));
		xa=-1*co*ya;	
	}
	if(angle==270){
		xa=-5;
		ya=0;
	}
	if(angle>270&&angle<360){
		co=cot(angle-270);
		ya=-1*sqrt(25*1.0/(1+co*co));
		xa=co*ya;
	}
	if(angle==360){
		xa=0;
		ya=-5;
	}
	re[0]=xa;
	re[1]=ya;
	return re;
}


int main(){//主函数,战斗界面
	srand((int)time(0));
	int bid(0),btim(0),mlx(0),mly(0),bossmove(0),bosstim(0),bosshp(200),bossbid(0),mhp(20);
	int smallforthp1(100),smallforthp2(100),smallfortbid1(0),smallfortbid2(0);
	int mbx[50],mby[50];//人物子弹变量
	int bossbx[100],bossby[100],bossbxa[100],bossbya[100];//boss子弹变量
	int smallfortbx1[100],smallfortby1[100],smallfortbxa1[100],smallfortbya1[100];//左炮塔子弹变量
	int	smallfortbx2[100],smallfortby2[100],smallfortbxa2[100],smallfortbya2[100];//右炮塔子弹变量
	int x=20,y=40;//人物初始坐标
	int bossx=25,bossy=5;//boss初始坐标
	int smallfortx1=8,smallforty1=8;//左炮塔初始坐标
	int smallfortx2=42,smallforty2=8;//右炮塔初始坐标
	bool a1=true,a2=true,a3=true;
	char c[10];
	int s[50][50];
	bool weapon=true;
	for(int i=0;i<50;i++){
		for(int j=0;j<50;j++){
			s[i][j]=0;
		}//for
	}//for
	initgraph(500,500);
	BeginBatchDraw();
	while(1){
		btim++;
		bosstim++;
		s[x][y]=1;
		s[bossx][bossy]=-1;
		Sleep(50);
		setfillcolor(WHITE);
		solidrectangle(0,0,500,500);
		if(bosstim>5){//boss移动
			bosstim=0;
			bossmove=-1+rand()%3;
			if(bossmove==-1&&bossx>2)bossx-=1;
			if(bossmove==1&&bossx<48)bossx+=1;
		}//if
		if(GetKeyState(75)<0){//激光攻击
			mlx=x;
			mly=y-1;
			setfillcolor(LIGHTGRAY);
			solidrectangle((mlx-1)*10,10,mlx*10,mly*10);
			settextcolor(RED);
			settextstyle(15,0,"宋体");
			setbkmode(TRANSPARENT);
			if(mlx==bossx&&mly>=bossy-1&&a3==true||mlx==bossx+1&&mly>=bossy-1&&a3==true){//激光打boss的伤害				
				outtextxy((bossx-3)*10,(bossy-1)*10,"-1");
				bosshp-=1;
			}//if
			if(mlx==smallfortx1+1&&mly>=smallforty1&&a1==true){
				outtextxy((smallfortx1-2)*10,smallforty1*10,"-1");//激光打左炮塔的伤害
				smallforthp1-=1;
			}//if
			if(mlx==smallfortx2+1&&mly>=smallforty2&&a2==true){
				outtextxy((smallfortx2-2)*10,smallforty2*10,"-1");//激光打左炮塔的伤害
				smallforthp2-=1;
			}//if
		}//if
		if(GetKeyState(65)<0&&x>1)x--;//a,向左
		if(GetKeyState(68)<0&&x<49)x++;//d,向右
		if(GetKeyState(83)<0&&y<49)y++;//s,向下
		if(GetKeyState(87)<0&&y>1)y--;//w,向上
		if(GetKeyState(74)<0&&btim>3){//子弹攻击
			btim=0;
			mbx[bid]=x;
			mby[bid]=y-1;
			bid++;
			if(bid>=50)bid=0;
		}
		for(i=0;i<50;i++){//子弹攻击
			mby[i]--;
			setfillcolor(RED);
			solidcircle(mbx[i]*10-5,mby[i]*10,2);
			if(mby[i]==0)mbx[i]=-999;
			if(mbx[i]==bossx&&mby[i]==bossy&&a3==true||mbx[i]==bossx+1&&mby[i]==bossy&&a3==true){//子弹打boss的伤害
				mbx[i]=-999;
				settextcolor(RED);
				settextstyle(15,0,"宋体");
				setbkmode(TRANSPARENT);
				outtextxy((bossx-4)*10,(bossy-1)*10,"-4");
				bosshp-=4;
			}//if
			 if(mbx[i]==smallfortx1+1&&mby[i]==smallforty1&&a1==true){//子弹打左炮塔的伤害
				mbx[i]=-999;
				settextcolor(RED);
				settextstyle(15,0,"宋体");
				setbkmode(TRANSPARENT);
				outtextxy((smallfortx1-2)*10,smallforty1*10,"-4");
				smallforthp1-=4;
			}//if
			 if(mbx[i]==smallfortx2+1&&mby[i]==smallforty2&&a2==true){//子弹打右炮塔的伤害
				mbx[i]=-999;
				settextcolor(RED);
				settextstyle(15,0,"宋体");
				setbkmode(TRANSPARENT);
				outtextxy((smallfortx2-2)*10,smallforty2*10,"-4");
				smallforthp2-=4;
			}//if
		}//for	
		for(i=0;i<50;i++){//物质描绘
			for(int j=0;j<50;j++){//人物描绘
				if(s[i][j]==1){
					s[i][j]=0;
					setfillcolor(GREEN);
					solidrectangle((i-1)*10,(j-1)*10,i*10,j*10);
				}//if
				if(s[i][j]==-1&&a3==true){//boss的描绘
					s[i][j]=0;
					setfillcolor(BLACK);
					solidrectangle((i-1)*10,(j-1)*10,(i+1)*10,(j+1)*10);
				}//if
			}//for
		}//for
		int r=rand()%360;//方向随机
		if(a3==true){//boss子弹设置
			float *bossrexy;
			bossbid+=1;
		    bossbx[bossbid]=bossx*10;
		    bossby[bossbid]=bossy*10;
			bossrexy=rexy(r);
		    bossbxa[bossbid]=*bossrexy;
		    bossbya[bossbid]=*(bossrexy+1);
		}//if
		if(bossbid>=100)bossbid=0;
		for(i=0;i<100;i++){
			 bossbx[i]=bossbx[i]+bossbxa[i];
			 bossby[i]=bossby[i]+bossbya[i];
			 setfillcolor(BLACK);
			 solidcircle(bossbx[i],bossby[i],2);
			 if(bossbx[i]<=0||bossbx[i]>=500||bossby[i]<=0||bossby[i]>=500)bossbx[i]=-999;
			 if(bossbx[i]>=(x-1)*10&&bossbx[i]<=x*10&&bossby[i]>=(y-1)*10&&bossby[i]<=y*10){
				 bossbx[i]=-999;
				 mhp-=1;
			}//if
		}//for
		if(a1==true){//左炮塔子弹设置
			float *smallfortbid1rexy;
			smallfortbid1+=1;
			smallfortbx1[smallfortbid1]=smallfortx1*10;
			smallfortby1[smallfortbid1]=smallforty1*10;
			smallfortbid1rexy=rexy(r);
			smallfortbxa1[smallfortbid1]=*smallfortbid1rexy;
			smallfortbya1[smallfortbid1]=*(smallfortbid1rexy+1);
		}//if
		if(smallfortbid1>=100)smallfortbid1=0;
		for(i=0;i<100;i++){
			smallfortbx1[i]=smallfortbx1[i]+smallfortbxa1[i];
			smallfortby1[i]=smallfortby1[i]+smallfortbya1[i];
			setfillcolor(BLACK);
			solidcircle(smallfortbx1[i],smallfortby1[i],2);
			if(smallfortbx1[i]<=0||smallfortbx1[i]>=500||smallfortby1[i]<=0||smallfortby1[i]>=500)smallfortbx1[i]=-999;
			if(smallfortbx1[i]>=(x-1)*10&&smallfortbx1[i]<=x*10&&smallfortby1[i]>=(y-1)*10&&smallfortby1[i]<=y*10){
				 smallfortbx1[i]=-999;
				 mhp-=1;
			}//if
		}//for
		if(a2==true){//右炮塔子弹设置
			float *smallfortbid2rexy;
			smallfortbid2+=1;
			smallfortbx2[smallfortbid2]=smallfortx2*10;
			smallfortby2[smallfortbid2]=smallforty2*10;
			smallfortbid2rexy=rexy(r);
			smallfortbxa2[smallfortbid2]=*smallfortbid2rexy;
			smallfortbya2[smallfortbid2]=*(smallfortbid2rexy+1);
		}//if
		if(smallfortbid2>=100)smallfortbid2=0;
		for(i=0;i<100;i++){
			smallfortbx2[i]=smallfortbx2[i]+smallfortbxa2[i];
			smallfortby2[i]=smallfortby2[i]+smallfortbya2[i];
			setfillcolor(BLACK);
			solidcircle(smallfortbx2[i],smallfortby2[i],2);
			if(smallfortbx2[i]<=0||smallfortbx2[i]>=500||smallfortby2[i]<=0||smallfortby2[i]>=500)smallfortbx2[i]=-999;
			if(smallfortbx2[i]>=(x-1)*10&&smallfortbx2[i]<=x*10&&smallfortby2[i]>=(y-1)*10&&smallfortby2[i]<=y*10){
				 smallfortbx2[i]=-999;
				 mhp-=1;
			}//if
		}//for
		setfillcolor(BLACK);
		settextstyle(15,0,"宋体");
		setbkmode(TRANSPARENT);
		if(a1==true){//左炮塔描绘	
		    solidrectangle(smallfortx1*10,smallforty1*10,(smallfortx1+1)*10,(smallforty1+1)*10);
		    itoa(smallforthp1,c,10);
		    outtextxy(smallfortx1*10-5,(smallforty1-2)*10,c);	    
		}//if
		if(a2==true){//右炮塔描绘
			solidrectangle(smallfortx2*10,smallforty2*10,(smallfortx2+1)*10,(smallforty2+1)*10);
		    itoa(smallforthp2,c,10);
		    outtextxy(smallfortx2*10-5,(smallforty2-2)*10,c);    
		}//if
		settextcolor(RED);
		if(a3==true){
			itoa(bosshp,c,10);//boss血量的描绘
			outtextxy((bossx-1)*10,(bossy-3)*10,c);
		}//if
		itoa(mhp,c,10);//人物血量描绘
		outtextxy((x-1)*10,(y-3)*10,c);
		FlushBatchDraw();
		if(smallforthp1<=0)a1=false;//左炮塔血量小于0时损坏
		if(smallforthp2<=0)a2=false;//右炮塔血量小于0时损坏
		if(bosshp<=0)a3=false;//boss血量小于0时死亡
		if(a1==false&&a2==false&&a3==false)break;//所有敌人消灭后胜利
		if(mhp<=0)break;//我的血量小于0时退出
	}//while
	return 0;
}//main

完成到这里也就差不多了,再美化一下就可以了

5.增加图片,再把开始界面,死亡界面,胜利界面整一下

把函数整理一下,加上点图片(乱搜的)
在这里插入图片描述
在这里插入图片描述
这时候一个简易版的飞机大战就完成啦!!!(原本还想增加敌方飞机的更新出现,但是就没有然后了)。

附上最后实现的代码:

#include <iostream>
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <math.h>
using namespace std;
int hphp=0;
MOUSEMSG m;
bool a1=true,a2=true,a3=true;//a1是左炮塔,a2是右炮塔,a3是boss

float cot(float angle){//定义cot函数
	return 1/tan(angle*1.0/180*3.1415926);//弧度=角度*1/180*pi
}
float *rexy(float angle){//角度判断,随机子弹
	static float re[2];
	if(angle>360)angle-=360;
	if(angle<0)angle+=360;
	float co,xa,ya;
	if(angle==0){
		xa=0;
		ya=-5;
	}
	if(angle<90){
		co=cot(90-angle);
		ya=-1*sqrt(25*1.0/(1+co*co));
		xa=-1*co*ya;//co=xa/ya
	}
	if(angle==90){
		ya=0;
		xa=5;
	}
	if(angle>90&&angle<180){
		co=cot(angle-90);
		ya=sqrt(25*1.0/(1+co*co));
		xa=co*ya;
	}
	if(angle==180){
		xa=0;
		ya=5;
	}
	if(angle>180&&angle<270){
		co=cot(270-angle);
		ya=sqrt(25*1.0/(1+co*co));
		xa=-1*co*ya;	
	}
	if(angle==270){
		xa=-5;
		ya=0;
	}
	if(angle>270&&angle<360){
		co=cot(angle-270);
		ya=-1*sqrt(25*1.0/(1+co*co));
		xa=co*ya;
	}
	if(angle==360){
		xa=0;
		ya=-5;
	}
	re[0]=xa;
	re[1]=ya;
	return re;
}


void initial_interface(){//初始界面
	initgraph(500,500);
	BeginBatchDraw();
	do{
		setfillcolor(WHITE);
	    solidrectangle(0,0,500,500);
	    settextcolor(BLUE);
	    settextstyle(50,0,"宋体");
	    setbkmode(TRANSPARENT);
	    outtextxy(140,100,"飞机大战");
	    settextstyle(20,0,"宋体");
	    outtextxy(200,150,"biubiubiu");
		setfillcolor(LIGHTGRAY);
		solidrectangle(190,200,300,230);
		solidrectangle(190,250,300,280);
		settextcolor(BLUE);
		settextstyle(20,0,"宋体");
		outtextxy(205,205,"极限模式");
		outtextxy(205,255,"普通模式");
		m = GetMouseMsg();
		if(m.x>=190&&m.x<=300&&m.y>=200&&m.y<=230){
			setfillcolor(DARKGRAY);
			solidrectangle(190,200,300,230);
			outtextxy(205,205,"极限模式");
			}
		if(m.mkLButton==true&&m.x>=190&&m.x<=300&&m.y>=200&&m.y<=230){
			hphp=1;
			break;
		}
		if(m.x>=190&&m.x<=300&&m.y>=250&&m.y<=280){
			setfillcolor(DARKGRAY);
			solidrectangle(190,250,300,280);
			outtextxy(205,255,"普通模式");
			}
		if(m.mkLButton==true&&m.x>=190&&m.x<=300&&m.y>=250&&m.y<=280){
			hphp=20;
			break;
		}
		FlushBatchDraw();
	}while(1);
}

void win_interface(){//胜利界面
	initgraph(500,500);
	BeginBatchDraw();
	setfillcolor(WHITE);
	solidrectangle(0,0,500,500);
	settextcolor(BLUE);
	settextstyle(40,0,"宋体");
	setbkmode(TRANSPARENT);
	outtextxy(100,100,"恭喜你获得胜利");
	FlushBatchDraw();
	Sleep(3000);
}

void lose_interface(){//失败界面
	initgraph(500,500);
	BeginBatchDraw();
	setfillcolor(WHITE);
	solidrectangle(0,0,500,500);
	settextcolor(BLUE);
	settextstyle(40,0,"宋体");
	setbkmode(TRANSPARENT);
	outtextxy(80,100,"很遗憾,再接再厉");
	FlushBatchDraw();
	Sleep(3000);
}

void fighting_interface(){//战斗界面
	srand((int)time(0));
	IMAGE img1,img2,img3;
	int bid(0),btim(0),mlx(0),mly(0),bossmove(0),bosstim(0),bosshp(200),bossbid(0),mhp(hphp);
	int smallforthp1(100),smallforthp2(100),smallfortbid1(0),smallfortbid2(0);
	int mbx[50],mby[50];//人物子弹变量
	int bossbx[100],bossby[100],bossbxa[100],bossbya[100];//boss子弹变量
	int smallfortbx1[100],smallfortby1[100],smallfortbxa1[100],smallfortbya1[100];//左炮塔子弹变量
	int	smallfortbx2[100],smallfortby2[100],smallfortbxa2[100],smallfortbya2[100];//右炮塔子弹变量
	int x=20,y=40;//人物初始坐标
	int bossx=25,bossy=5;//boss初始坐标
	int smallfortx1=8,smallforty1=8;//左炮塔初始坐标
	int smallfortx2=42,smallforty2=8;//右炮塔初始坐标
	char c[10];
	int s[50][50];
	bool weapon=true;
	for(int i=0;i<50;i++){
		for(int j=0;j<50;j++){
			s[i][j]=0;
		}//for
	}//for
	BeginBatchDraw();
	while(1){
		btim++;
		bosstim++;
		s[x][y]=1;
		s[bossx][bossy]=-1;
		Sleep(50);
		setfillcolor(WHITE);
		solidrectangle(0,0,500,500);
		if(bosstim>5){//boss移动
			bosstim=0;
			bossmove=-1+rand()%3;
			if(bossmove==-1&&bossx>2)bossx-=1;
			if(bossmove==1&&bossx<48)bossx+=1;
		}//if
		if(GetKeyState(75)<0){//激光攻击
			mlx=x;
			mly=y-1;
			setfillcolor(LIGHTBLUE);
			solidrectangle((mlx-1)*10+3,10,mlx*10-3,mly*10);
			settextcolor(RED);
			settextstyle(15,0,"宋体");
			setbkmode(TRANSPARENT);
			if(mlx==bossx&&mly>=bossy-1&&a3==true||mlx==bossx+1&&mly>=bossy-1&&a3==true){//激光打boss的伤害				
				outtextxy((bossx-3)*10,(bossy-1)*10,"-1");
				bosshp-=1;
			}//if
			if(mlx==smallfortx1+1&&mly>=smallforty1&&a1==true){
				outtextxy((smallfortx1-2)*10,smallforty1*10,"-1");//激光打左炮塔的伤害
				smallforthp1-=1;
			}//if
			if(mlx==smallfortx2+1&&mly>=smallforty2&&a2==true){
				outtextxy((smallfortx2-2)*10,smallforty2*10,"-1");//激光打左炮塔的伤害
				smallforthp2-=1;
			}//if
		}//if
		if(GetKeyState(65)<0&&x>1)x--;//a,向左
		if(GetKeyState(68)<0&&x<49)x++;//d,向右
		if(GetKeyState(83)<0&&y<49)y++;//s,向下
		if(GetKeyState(87)<0&&y>1)y--;//w,向上
		if(GetKeyState(74)<0&&btim>3){//子弹攻击
			btim=0;
			mbx[bid]=x;
			mby[bid]=y-1;
			bid++;
			if(bid>=50)bid=0;
		}
		for(i=0;i<50;i++){//子弹攻击
			mby[i]--;
			setfillcolor(RED);
			solidcircle(mbx[i]*10-5,mby[i]*10,2);
			if(mby[i]==0)mbx[i]=-999;
			if(mbx[i]==bossx&&mby[i]==bossy&&a3==true||mbx[i]==bossx+1&&mby[i]==bossy&&a3==true){//子弹打boss的伤害
				mbx[i]=-999;
				settextcolor(RED);
				settextstyle(15,0,"宋体");
				setbkmode(TRANSPARENT);
				outtextxy((bossx-4)*10,(bossy-1)*10,"-4");
				bosshp-=4;
			}//if
			 if(mbx[i]==smallfortx1+1&&mby[i]==smallforty1&&a1==true){//子弹打左炮塔的伤害
				mbx[i]=-999;
				settextcolor(RED);
				settextstyle(15,0,"宋体");
				setbkmode(TRANSPARENT);
				outtextxy((smallfortx1-2)*10,smallforty1*10,"-4");
				smallforthp1-=4;
			}//if
			 if(mbx[i]==smallfortx2+1&&mby[i]==smallforty2&&a2==true){//子弹打右炮塔的伤害
				mbx[i]=-999;
				settextcolor(RED);
				settextstyle(15,0,"宋体");
				setbkmode(TRANSPARENT);
				outtextxy((smallfortx2-2)*10,smallforty2*10,"-4");
				smallforthp2-=4;
			}//if
		}//for	
		for(i=0;i<50;i++){//物质描绘
			for(int j=0;j<50;j++){//人物描绘
				if(s[i][j]==1){
					s[i][j]=0;
					loadimage(&img1,".\\飞机.jpg",10,10);
					putimage((i-1)*10,(j-1)*10,&img1);
				}//if
				if(s[i][j]==-1&&a3==true){//boss的描绘
					s[i][j]=0;
					loadimage(&img2,".\\敌机1.jpg",20,20);
					putimage((i-1)*10,(j-1)*10,&img2);
				}//if
			}//for
		}//for
		int r=rand()%360;//方向随机
		if(a3==true){//boss子弹设置
			float *bossrexy;
			bossbid+=1;
		    bossbx[bossbid]=bossx*10;
		    bossby[bossbid]=bossy*10;
			bossrexy=rexy(r);
		    bossbxa[bossbid]=*bossrexy;
		    bossbya[bossbid]=*(bossrexy+1);
		}//if
		if(bossbid>=100)bossbid=0;
		for(i=0;i<100;i++){
			 bossbx[i]=bossbx[i]+bossbxa[i];
			 bossby[i]=bossby[i]+bossbya[i];
			 setfillcolor(BLACK);
			 solidcircle(bossbx[i],bossby[i],2);
			 if(bossbx[i]<=0||bossbx[i]>=500||bossby[i]<=0||bossby[i]>=500)bossbx[i]=-999;
			 if(bossbx[i]>=(x-1)*10&&bossbx[i]<=x*10&&bossby[i]>=(y-1)*10&&bossby[i]<=y*10){
				 bossbx[i]=-999;
				 mhp-=1;
			}//if
		}//for
		if(a1==true){//左炮塔子弹设置
			float *smallfortbid1rexy;
			smallfortbid1+=1;
			smallfortbx1[smallfortbid1]=smallfortx1*10;
			smallfortby1[smallfortbid1]=smallforty1*10;
			smallfortbid1rexy=rexy(r);
			smallfortbxa1[smallfortbid1]=*smallfortbid1rexy;
			smallfortbya1[smallfortbid1]=*(smallfortbid1rexy+1);
		}//if
		if(smallfortbid1>=100)smallfortbid1=0;
		for(i=0;i<100;i++){
			smallfortbx1[i]=smallfortbx1[i]+smallfortbxa1[i];
			smallfortby1[i]=smallfortby1[i]+smallfortbya1[i];
			setfillcolor(BLACK);
			solidcircle(smallfortbx1[i],smallfortby1[i],2);
			if(smallfortbx1[i]<=0||smallfortbx1[i]>=500||smallfortby1[i]<=0||smallfortby1[i]>=500)smallfortbx1[i]=-999;
			if(smallfortbx1[i]>=(x-1)*10&&smallfortbx1[i]<=x*10&&smallfortby1[i]>=(y-1)*10&&smallfortby1[i]<=y*10){
				 smallfortbx1[i]=-999;
				 mhp-=1;
			}//if
		}//for
		if(a2==true){//右炮塔子弹设置
			float *smallfortbid2rexy;
			smallfortbid2+=1;
			smallfortbx2[smallfortbid2]=smallfortx2*10;
			smallfortby2[smallfortbid2]=smallforty2*10;
			smallfortbid2rexy=rexy(r);
			smallfortbxa2[smallfortbid2]=*smallfortbid2rexy;
			smallfortbya2[smallfortbid2]=*(smallfortbid2rexy+1);
		}//if
		if(smallfortbid2>=100)smallfortbid2=0;
		for(i=0;i<100;i++){
			smallfortbx2[i]=smallfortbx2[i]+smallfortbxa2[i];
			smallfortby2[i]=smallfortby2[i]+smallfortbya2[i];
			setfillcolor(BLACK);
			solidcircle(smallfortbx2[i],smallfortby2[i],2);
			if(smallfortbx2[i]<=0||smallfortbx2[i]>=500||smallfortby2[i]<=0||smallfortby2[i]>=500)smallfortbx2[i]=-999;
			if(smallfortbx2[i]>=(x-1)*10&&smallfortbx2[i]<=x*10&&smallfortby2[i]>=(y-1)*10&&smallfortby2[i]<=y*10){
				 smallfortbx2[i]=-999;
				 mhp-=1;
			}//if
		}//for
		settextstyle(15,0,"宋体");
		setbkmode(TRANSPARENT);
		if(a1==true){//左炮塔描绘
			loadimage(&img3,".\\炮塔.jpg",10,10);
			putimage(smallfortx1*10,smallforty1*10,&img3);
		    itoa(smallforthp1,c,10);
		    outtextxy(smallfortx1*10-5,(smallforty1-2)*10,c);	    
		}//if
		if(a2==true){//右炮塔描绘
			loadimage(&img3,".\\炮塔.jpg",10,10);
			putimage(smallfortx2*10,smallforty2*10,&img3);
		    itoa(smallforthp2,c,10);
		    outtextxy(smallfortx2*10-5,(smallforty2-2)*10,c);    
		}//if
		settextcolor(RED);
		if(a3==true){
			itoa(bosshp,c,10);//boss血量的描绘
			outtextxy((bossx-1)*10,(bossy-3)*10,c);
		}//if
		itoa(mhp,c,10);//人物血量描绘
		outtextxy((x-1)*10,(y-3)*10,c);
		FlushBatchDraw();
		if(smallforthp1<=0)a1=false;//左炮塔血量小于0时损坏
		if(smallforthp2<=0)a2=false;//右炮塔血量小于0时损坏
		if(bosshp<=0)a3=false;//boss血量小于0时死亡
		if(a1==false&&a2==false&&a3==false){//所有敌人消灭后胜利
			win_interface();
			break;
		}
		if(mhp<=0){//我的血量小于0时失败
			lose_interface();
			break;
		}
	}//while
}

int main(){
	cout<<"操作介绍:a左w上s下d右  j子弹攻击  k激光攻击"<<endl;
	cout<<"-----------------------按任意键进入游戏------------------------";
	getch();
	initial_interface();
	fighting_interface();
	return 0;
}//main

有人可能会问:为什么不用类与对象去实现呢?还不是当时学类与对象的时候基础不扎实,用不习惯。我是直到后来学了数据结构与算法后才对类与对象有了新的了解。(这个小游戏是我大一寒假的时候整的,实现不好的话还往多多指教!)

这就是我在easyx图形库和c++学习过程中制作的小游戏,在此记录!

猜你喜欢

转载自blog.csdn.net/weixin_46791942/article/details/106948138