飞机大战(融入数据结构-技能树弗洛伊德算法)
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以上是关于飞机大战(融入数据结构-技能树弗洛伊德算法)的主要内容,如果未能解决你的问题,请参考以下文章