飞机大战(融入数据结构-技能树弗洛伊德算法)

Posted Icy Hunter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了飞机大战(融入数据结构-技能树弗洛伊德算法)相关的知识,希望对你有一定的参考价值。

飞机大战融入数据结构
有点生硬但是非常简单

简单介绍一下:
#wsad为上下左右,u为升级,空格为发射子弹
#飞机移动需要消耗行动点,发射子弹需要消耗弹药
#敌机数量和速度都会随着分数而变多变快
#敌机多了会产生重叠,便间接形成了敌机血量的增加的功能
#敌机被打掉会掉落道具点(A、B、C、D、E最多5个)由于移动需要行动点,便设置了用floyd寻找最短路径的功能,用起来也比较简单。
#技能点可以用于升级,一次可以用2或者4升级,4升级有更强的属性加成例如召唤友军或者增加子弹的宽度
#友军在耗费4点技能点升级有概率产生,其攻击是当主机按空格时有概率发射子弹,但是每个友军的发射概率是互不影响的
#友军会在遭遇敌机时灭亡

下面配上一张运行图
在这里插入图片描述
没有用ege画图,非常的简陋,赶工赶出来的emmmm

#include<windows.h>
#include<conio.h>
#include<bits/stdc++.h>
using namespace std;
#define high 25
#define width 25 					//定义边界  
//#define enemynumber 10
#define allynumber 5
#define toolnumber 5 
int life;	//飞机状态,判断是否存活 
int ally;  //友军4
int nowallynumber; 
int bulletwidth; //子弹宽度
int bulletnumber;//子弹数量 
int skillpoint;//技能点数 
int action;//行动值 
int grade;//飞机等级 
int nowtoolnumber;//当前工具数 
int enemymovespeed=40;//敌机速度 
int enemynumber=10;//敌机数量 
int canvas[high][width] = {0}; //画布 
int position_x,position_y;//飞机位置 
int mapp[high][width];//用于储存工具之间及与飞机的距离 
struct enemy//敌机 
{
	int x;
	int y;
}enemy[10000];
int score;
struct tool//敌机掉落的工具 
{
	int x;
	int y;
	int flag;
	int tag;
}tool[toolnumber];
typedef struct node//技能树定义 
{
	int data;
	struct node *left;
	struct node *right;
}node,*tree;
int s = 0;
int a[15]={0,1,3,-1,-1,4,-1,-1,2,5,-1,-1,6,-1,-1};//先序排列 -1为叶子节点 
struct path//最短路径储存 
{
	int flag;
	int dis;
}p[50];
void readme()
{
	printf("飞机大战-极限生存\\n");
	printf("乐趣是刷数据吧\\n");
	printf("为避免影响游戏体验,\\n我将介绍一下游戏规则:\\n");
	printf("1.移动、子弹是消耗品\\n");
	printf("2.飞机生命值为0,直接结束\\n");
	printf("3.字母为技能点达2点可升级\\n");
	printf("4.飞机移动:wasd,\\n攻击:空格,升级:u(小写\\n");
	printf("5.杀敌得2颗子弹1点行动值\\n");
	printf("6.可以升级召唤友军!\\n"); 
	printf("7.按回车开始,生存下去!\\n");

	getchar(); 

} 
int cmpp(path a,path b) 
{
	return a.dis<b.dis; 
}
void floyd() 
{
	for(int i=0;i<high;i++)
	{
		for(int j=0;j<width;j++)
		{
			mapp[i][j]=8888888;//初始化 
		}
	}
	for(int i=0;i<toolnumber+1;i++)
	{
		for(int j=i+1;j<toolnumber+1;j++)
		{
			if(tool[i].flag==1&&tool[j].flag==1)
			{
				int d=abs(tool[i].x-tool[j].x)+abs(tool[i].y-tool[j].y);
				int x = tool[i].tag;
				int y = tool[j].tag;
				mapp[x][y]=d;
				mapp[y][x]=d;//建图赋值 
			} 
		} 
	}
	for(int k=0;k<high;k++)//floyd算法 
	{
		for(int i=0;i<high;i++)
		{
			for(int j=0;j<high;j++)
			{
				if(k!=i&&k!=j&&i!=j&&(mapp[i][j]>mapp[i][k]+mapp[k][j]))
				mapp[i][j]=mapp[i][k]+mapp[k][j];
			}
		}
	}
	int num=0;
	for(int i=10;i<=14;i++)//求距离飞机位置最近的点 
	{
		if(mapp[15][i]<8888888)
		{
		p[num].dis=mapp[15][i];
		p[num].flag=i;
		num++;			
		}
	}
	sort(p,p+num,cmpp);
	printf("目前最近点为:%c  距离为%d  ",p[0].flag+55,p[0].dis);
}

tree skilltree;
tree creat()
{
	int ch = a[s];
	s++;
	if(ch==-1)return NULL;
	
	tree root = new node();
	root->data = ch;
	root->left = creat();
	root->right = creat();
	
	return root;
}
int getskill(tree skilltree)//技能树,通过随机走入左右子树获取相应飞机属性标签 
{
	while(skilltree->left!=NULL&&skillpoint>=2)
	{
		if(skillpoint <= 0)break;
		if(rand()%2==1)
		{
		 skilltree=skilltree->left;
		 skillpoint-=2;
		 grade++;	
		}
		else 
		{
		 skilltree=skilltree->right;
		 skillpoint-=2;
		 grade++;	
		}
	}
	return skilltree->data;
}
void gotoxy(int x,int y)  			//光标移动到(x,y)位置
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle,pos);
}
void HideCursor() // 用于隐藏光标
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};  // 第二个值为 0表示隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void init()						//数据初始化 
{
	grade=1;
	nowallynumber=0;
	bulletnumber=100000;
	skillpoint=100000;
	action = 500000;
	life=1000000;
	bulletwidth=0;
	ally=0;
	position_x=high-3;			
	position_y=width/2;
	
	nowallynumber=0;
	bulletnumber=100;
	skillpoint=0;
	action = 100;
	life=3;

								//飞机完好 
	canvas[position_x][position_y] = 1;
	tool[5].tag=15;
	tool[5].flag=1;
	for(int i=0;i<toolnumber;i++)
	{
		tool[i].flag=0;
		tool[i].tag=10+i;
	}
    for(int k=0;k<enemynumber;k++)
	{
		enemy[k].x = rand()%3;
		enemy[k].y = rand()%width;
		canvas[enemy[k].x][enemy[k].y]=3;
	}
	score=0;
	HideCursor();
}
void show()							//显示界面 
{
	int i,j;
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			if(life==0)break;
			else if(canvas[i][j]==1)printf("*");
			else if(canvas[i][j]==2)printf("o");
			else if(canvas[i][j]==3)printf("v");
			else if(canvas[i][j]==4)printf("#");
			else if(canvas[i][j]==10)printf("A");
			else if(canvas[i][j]==11)printf("B");
			else if(canvas[i][j]==12)printf("C");
			else if(canvas[i][j]==13)printf("D");
			else if(canvas[i][j]==14)printf("E");									
			else printf(" ");
		}
		printf("\\n"); 
	}
	printf("\\n");
	printf("生命:%d 行动力:%d 弹药:%d 技能点:%d \\n弹道数:%d 等级:%d 敌机:%d 敌机速度:%d\\n",life,action,bulletnumber,skillpoint,bulletwidth*2+1,grade,enemynumber,40-enemymovespeed);
	for(int k=0;k<enemynumber;k++)
	{
		if((position_x==enemy[k].x)&&(position_y==enemy[k].y))
		{
			enemy[k].x = rand()%2;
			enemy[k].y = rand()%width;
			life--;							//飞机撞毁 游戏结束 
			if(life==0)
			{
			printf("游戏结束                \\n");	
			break;
			}
			
		}
	}
	
	for(i=0;i<toolnumber;i++)//遇到道具技能点加1道具消失 
	{
		if(tool[i].flag==1)
		{
			canvas[tool[i].x][tool[i].y]=tool[i].tag;
			if(position_x==tool[i].x&&position_y==tool[i].y)
			{
				skillpoint++;
				tool[i].flag=0;
				nowtoolnumber--; 
			}
		}
	}
}
void withoutInpute(tree skilltree)						//与用户输入无关
{
    int i,j,k;
    for(int i=0;i<high;i++)
	{
		for(int j=0;j<width;j++)
		{
					
			int bulletflag=0;
			if(canvas[i][j]==2)
			{
				for(k=0;k<enemynumber;k++)
				{
					if(i==enemy[k].x&&j==enemy[k].y)
					{
						score++;
						bulletnumber+=2;
						action++;
						
						int possible1 = rand()%2; 
						int possible2 = rand()%2;
						if(possible1==1&&possible2==1)
						{
							for(int p=0;p<toolnumber;p++)
							{
								if(tool[p].flag==0&&canvas[enemy[k].x][enemy[k].y]!=5)
								{
								  tool[p].x=enemy[k].x;
								  tool[p].y=enemy[k].y;
								  tool[p].flag=1;
								  nowtoolnumber++; 
								  break;									
								}
							}
						}
						
						if(score%10==0&&enemymovespeed>2)enemymovespeed--;
						if(score%20==0)enemynumber++; 
						canvas[enemy[k].x][enemy[k].y]=0;
						enemy[k].x = rand()%2;
						enemy[k].y = rand()%width;
						canvas[enemy[k].x][enemy[k].y]=3;
						canvas[i][j]=0;
						bulletflag=1; 
					}
				}
				canvas[i][j]=0;
				if(i>0&&bulletflag!=1)canvas[i-1][j] = 2; 
			}
		}
	}
	printf("得分:%d  ",score); 
	int t=0;
	for以上是关于飞机大战(融入数据结构-技能树弗洛伊德算法)的主要内容,如果未能解决你的问题,请参考以下文章

Python小游戏飞机大战源码

前端技能树,面试复习第 56 天—— LeetCode 算法常考题型 | 百题大战

JAVA 实现《飞机大战-III》游戏

经典实验--飞机大战小游戏

数据结构学习笔记——图的应用1(最小生成树最短路径)

飞机大战原生代码版