用VS开发一款“飞机大战“单机游戏<C++>

news/2024/4/28 2:00:32/文章来源:https://blog.csdn.net/Lukegood/article/details/128140242

显示界面如上图所示

自己找的背景和飞机素材,先将素材奉上.

 

接下来我先简单分析一下这个单机游戏的运行逻辑:

就像显示界面所显示的那样,我们想要实现的是自己的飞机在发射子弹(子弹在上图没显示),然后当子弹射到敌方飞机,这里设置了两种类型的飞机,如果读者想定义更多类型的,直接添加属性就可以.当子弹射到飞机的时候,飞机的血量减少,就像CS一样,并不一定是一发子弹就死亡,读者可以根据自己喜欢去设置,博主这里设置大飞机的血量是3发子弹,而小飞机的血量是1发子弹,也就是说,当有3发子弹射到大飞机的时候,大飞机就消失,一发子弹小飞机消失.至于其他的动态效果,博主这里暂时不做介绍.具体往下看:

面向对象开发,每一个对象我们都需要给他设置相对应的对象属性,在语言当中,我们将其设置成结构体就可以:

enum My
{WIDTH = 500,HIGHT = 700,BULLET_NUM = 100,//玩家子弹数量ENEMY_NUM = 10,//敌机的数量BIG,SMALL,
};
struct Plane
{int x;int y;bool live;//是否存活int width;int hight;int hp;int type;//敌机类型  big small}player,bull[BULLET_NUM],enemy[ENEMY_NUM];

首先设定了一个联合,用于设置弹出窗口的基本参数和其他属性. 

上面是不是把敌方飞机,自己飞机和自己发射的子弹都定义成了一个结构体.下面我们就可以直接用了.

(x,y)代表的是对象在窗口当中的坐标,width和hight是对象自身的尺寸,而hp是血量,type是博主自己定义了两种敌机类型.布尔类型live判断飞机是否存活状态.

第一步我们应该是要先创建图形窗口

	/*测试
circle(50, 50, 50);//画空心圆
setfillcolor(GREEN);//圆的颜色
fillcircle(100, 100, 50);///实心⚪*///创建图形窗口initgraph(WIDTH, HIGHT,SHOWCONSOLE);//宽长

initgraph()函数直接用

第二步加载窗口里面使用到的图片   //无论什么时候用,我们都要进行图片加载的,因此此处我们将其设定到一个函数下,方便之后也可以随时添加和删除.

//把图片加载进程序
IMAGE bk;//背景图
//保存玩家图片
IMAGE img_role;
//保存子弹
IMAGE img_bull;
//
IMAGE img_enemy[4];
void loadImg()
{//加载图片loadimage(&bk, "D:/program/飞机大战/images/bk.png");//加载玩家图片loadimage(&img_role, "D:/program/飞机大战/images/fly.png");//加载子弹图片loadimage(&img_bull, "D:/program/飞机大战/images/子弹.jpg");//加载敌机的图片loadimage(&img_enemy[0], "D:/program/飞机大战/images/enemy1.png");loadimage(&img_enemy[1], "D:/program/飞机大战/images/enemy2.png");//loadimage(&img_enemy[2], "D:/program/飞机大战/images/enemy3.jpg");//loadimage(&img_enemy[3], "D:/program/飞机大战/images/enemy4.jpg");
}

IMAGE 是easyx里面的一个参数,直接用

此案例当中,需要我们加载的图片有背景图,自己飞机图,子弹图,敌方飞机1和敌方飞机2,如果读者也自己添加第三台和第四台敌机,也可以直接添加,不过要注意,当一种对象,存在多个类型的时候,要采用数组将其存储,方便之后进行使用.

第三步,要干嘛?设置好窗口了,加载完图片了,是不是要把图片添加进去了?

那图片添加到哪里去?怎么添加?哪一种图片应该添加在哪里呢?

这里我们是不是首先要初始化一下图片的基本属性?of course,买衣服我总的知道我适合穿多大尺码的衣服吧?

void gameinit()//初始化数据
{player.x = WIDTH / 2;player.y = HIGHT - 120;player.live = true;//初始化子弹for (int i = 0; i < BULLET_NUM; i++){bull[i].x = 0;bull[i].y = 0;bull[i].live = false;}//初始化敌机for (int i = 0; i < ENEMY_NUM; i++){enemy[i].live = false;enemyHP(i);}
}

想想我们一共有几个对象,去除背景图片不需要我们在这里初始化之外,另外就是自己飞机,敌方飞机和子弹三个对象.那么我们就定义一个函数,用于初始化这些对象的第一属性.

在初始化敌方飞机的时候,博主之前把敌方飞机设置有两种类型,那么这两种类型飞机的基本属性一定有一些是不一样的呀,要不然怎么叫做2呢?

博主这里主要用飞机的大小和血量来区分这两种飞机.具体看enemyHP()函数

void enemyHP(int i)
{int flag = rand() % 10;if (flag>=0 && flag<=2)//0-9{enemy[i].type = BIG;enemy[i].hp = 3;enemy[i].width = 100;enemy[i].hight = 100;}else{enemy[i].type = SMALL;enemy[i].hp = 1;enemy[i].width = 50;enemy[i].hight = 50;}}

在这个函数当中,我们要注意,大飞机和小飞机出现的次数是不是正常情况下是不一样的?比如小飞机出现了5次,而大飞机才出现一次这样,当然敌飞机出现肯定不是我们可以控制的,它肯定是随机出现的,所以这里我们采用一个随机范围,如果在0-2之间就出现大飞机,3-9之间小飞机,这样是不是小飞机的概率要高于大飞机.其余的进入条件之内直接初始化就可以了.

第四步,上面我们把全部图片都加载好,然后对象都进行了初始化,接下来我们要干嘛?

那肯定是要将这些图片绘制到对应的窗口坐标上了!!!!!!!

void gameDraw()
{loadImg();//把背景贴在窗口上putimage(0, 0, &bk);putimage(player.x, player.y, &img_role,SRCINVERT);for (int i = 0; i < BULLET_NUM; i++){if (bull[i].live){putimage(bull[i].x, bull[i].y, &img_bull, SRCINVERT);}}//绘制敌机for (int i = 0; i < ENEMY_NUM; i++){if (enemy[i].live){if(enemy[i].type==SMALL)putimage(enemy[i].x, enemy[i].y, &img_enemy[0], SRCINVERT);//x和y是飞机在窗口中的坐标elseputimage(enemy[i].x, enemy[i].y, &img_enemy[1], SRCINVERT);}}}

绘制背景,绘制自己飞机,绘制子弹,绘制敌方飞机都采用putimage()函数就可以了

需要注意的有可能就是对于敌方飞机和子弹只有live是true的时候才绘制,而对于敌方飞机还区分了两种类型的飞机,加一个if-else输出对应的敌方飞机就可以了;

第五步,第四步我们绘制的图片是个啥,是初始化的位置,是一个静态的图,我们要实现的动态图,那接下来我们应该干嘛????????

当然是让子弹,自己飞机和敌方飞机都动起来了,也就是创建动画

首先让自己飞机动起来

void playermove(int speed)
{
#if 0if (_kbhit) {//有两种方式//1,getch()  阻塞函数,和scanf一样,如果没有输入,就会卡住程序,一直等待输入,//这个函数不是c语言标准函数,需要头文件<conio.h>char key = _getch();switch (key){case 'w':case 'W':player.y -= speed;break;case 's':case 'S':player.y += speed;break;case 'a':case 'A':player.x -= speed;break;case 'd':case 'D':player.x += speed;break;default:break;}}
}
#elif 1//2.使用Windows函数获取键盘输入//非阻塞函数,特别流畅//如果用字母,必须要用大写,大写可以识别大小写if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W')){if(player.y > 0)player.y -= speed;}if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S')){if (player.y < HIGHT-78)//78是飞机的高度player.y += speed;}if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A')){if(player.x+59>0)// 119/2  = 59是控制飞机子弹在左右边界的时候可以打到敌机player.x -= speed;}if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D')){if (player.x-59 < WIDTH-119)//119是飞机的宽度player.x += speed;}
#endif // 0if (GetAsyncKeyState(VK_SPACE) && Timer(100,1))//{//创建一个子弹createBullet();}}

这里尝试了两种让自己飞机动起来的方法,第一种是_kbhit,如果按下键盘,判断按下的是什么键,如果wsad当中的一个则执行对应的操作,但是这种方法运行之后,你会发现很卡,就是一个帧当中只能运行一个动作,不能运行右上这样的操作,关键是很卡

所以我们用了第二种方案非阻塞函数GetAsyncKeyState(),分别对键盘当中的上下左右和英文字符当中的wasd进行case分析,其他不变,此处要注意的有可能就是要控制自己的飞机运行,只能在窗口范围内运行,为其设定边界就可以.

最后还加了一个和子弹相关的函数,如果说按下空格键了,就要发射子弹了,同时这里结合了一个定时器的函数,用于控制子弹发射的速度100ms,不要再100ms内发射两颗子弹,防止出现子弹重叠的现象.

bool Timer(int ms, int id)//定时器
{static DWORD t[10];if (clock() - t[id] > ms){t[id] = clock();return true;}return false;
}

定义了一个无符号长整形的时间数组,是因为本案例当中有多个函数都用到了定时器函数.

自己飞机动起来,接下来就很明显了,让子弹跟着发射,对不对????也就是进入createBullet()函数

void createBullet()
{for (int i = 0; i < BULLET_NUM; i++){if (!bull[i].live){bull[i].x = player.x+59;bull[i].y = player.y;bull[i].live = true;break;}}
}

 刚开始子弹都是的状态都是false,然后条件正确后,初始化了子弹的第一个位置发射出来,然后将子弹的状态改为true.跳出这一个,执行下一个,要注意此时只是静态化绘制了子弹,还没有动起来,那么接下来就让子弹垂直向上运行就好.

void Bullmove(int speed)
{for (int i = 0; i < BULLET_NUM; i++){if (bull[i].live){bull[i].y -=speed;if (bull[i].y < 0){bull[i].live = false;}}}
}

如果子弹到了最上方了,改变子弹的状态为false,继续循环

自己飞机和子弹都结束了,接下来就是敌方飞机了

//产生敌机
void createenemy()
{for (int i = 0; i < ENEMY_NUM; i++){if (!enemy[i].live){enemy[i].live = true;enemy[i].x = rand()%(WIDTH-75);enemy[i].y = 0;enemyHP(i);printf("pos(%d,%d) %d %d\n", enemy[i].x, enemy[i].y, enemy[i].live, enemy[i].hp);break;}}
}

在窗口的最上面随机产生敌机,敌机也要动的.是不是参考子弹的就可以了,如下

//敌机的移动
void enemymove(int speed)
{for (int i = 0; i < ENEMY_NUM; i++){if (enemy[i].live){enemy[i].y += speed;if (enemy[i].y > HIGHT){enemy[i].live = false;}}}
}

 最后就是打飞机,当子弹到了敌方飞机的范围内是,敌方飞机就消失

//开始打飞机
void playplane()
{for (int i = 0; i < ENEMY_NUM; i++){if (!enemy[i].live)continue;for (int k = 0; k < BULLET_NUM; k++){if (!bull[k].live)continue;if (bull[k].x > enemy[i].x && bull[k].x<enemy[i].x + enemy[i].width&& bull[k].y>enemy[i].y && bull[k].y < enemy[i].y + enemy[i].hight)//子弹在飞机的界面内//则代表子弹打住了飞机{bull[k].live = false;enemy[i].hp--;}}if (enemy[i].hp == 0){enemy[i].live = false;}}
}

			if (bull[k].x > enemy[i].x && bull[k].x<enemy[i].x + enemy[i].width&& bull[k].y>enemy[i].y && bull[k].y < enemy[i].y + enemy[i].hight)//子弹在飞机的界面内//则代表子弹打住了飞机

这是个啥?意思是当子弹到了敌方飞机那个矩形图之内,条件就正确

 这里要注意大飞机血量是3,小飞机血量是1,一颗子弹一格血量.当血量为0,则飞机死亡

最后一步,上主函数

int main()
{/*测试
circle(50, 50, 50);//画空心圆
setfillcolor(GREEN);//圆的颜色
fillcircle(100, 100, 50);///实心⚪*///创建图形窗口initgraph(WIDTH, HIGHT,SHOWCONSOLE);//宽长gameinit();//双缓冲绘图BeginBatchDraw();while (1){gameDraw();FlushBatchDraw();playermove(5);Bullmove(5);//防止飞机全部一起出来if (Timer(500,0)){//创建一个飞机createenemy();}if (Timer(20, 2)){enemymove(1);}playplane();}EndBatchDraw();return 0;
}

注意这里的

//双缓冲绘图BeginBatchDraw();EndBatchDraw();

是easyx插件里面的一个双缓冲绘图,防止图片在窗口当中出现闪屏

总代码:

#include<stdio.h>
//图形库,帮助我们新手,快速入门图形编程easyx
#include<graphics.h>
#include<conio.h>
#include<time.h>
enum My
{WIDTH = 500,HIGHT = 700,BULLET_NUM = 100,//玩家子弹数量ENEMY_NUM = 10,//敌机的数量BIG,SMALL,
};
struct Plane
{int x;int y;bool live;//是否存活int width;int hight;int hp;int type;//敌机类型  big small}player,bull[BULLET_NUM],enemy[ENEMY_NUM];//把图片加载进程序
IMAGE bk;//背景图
//保存玩家图片
IMAGE img_role;
//保存子弹
IMAGE img_bull;
//
IMAGE img_enemy[4];void loadImg()
{//加载图片loadimage(&bk, "D:/program/飞机大战/images/bk.png");//加载玩家图片loadimage(&img_role, "D:/program/飞机大战/images/fly.png");//加载子弹图片loadimage(&img_bull, "D:/program/飞机大战/images/子弹.jpg");//加载敌机的图片loadimage(&img_enemy[0], "D:/program/飞机大战/images/enemy1.png");loadimage(&img_enemy[1], "D:/program/飞机大战/images/enemy2.png");//loadimage(&img_enemy[2], "D:/program/飞机大战/images/enemy3.jpg");//loadimage(&img_enemy[3], "D:/program/飞机大战/images/enemy4.jpg");
}
bool Timer(int ms, int id)//定时器
{static DWORD t[10];if (clock() - t[id] > ms){t[id] = clock();return true;}return false;
}
void enemyHP(int i)
{int flag = rand() % 10;if (flag>=0 && flag<=2)//0-9{enemy[i].type = BIG;enemy[i].hp = 3;enemy[i].width = 100;enemy[i].hight = 100;}else{enemy[i].type = SMALL;enemy[i].hp = 1;enemy[i].width = 50;enemy[i].hight = 50;}}void gameinit()//初始化数据
{player.x = WIDTH / 2;player.y = HIGHT - 120;player.live = true;//初始化子弹for (int i = 0; i < BULLET_NUM; i++){bull[i].x = 0;bull[i].y = 0;bull[i].live = false;}//初始化敌机for (int i = 0; i < ENEMY_NUM; i++){enemy[i].live = false;enemyHP(i);}
}
//游戏绘制函数
void gameDraw()
{loadImg();//把背景贴在窗口上putimage(0, 0, &bk);putimage(player.x, player.y, &img_role,SRCINVERT);for (int i = 0; i < BULLET_NUM; i++){if (bull[i].live){putimage(bull[i].x, bull[i].y, &img_bull, SRCINVERT);}}//绘制敌机for (int i = 0; i < ENEMY_NUM; i++){if (enemy[i].live){if(enemy[i].type==SMALL)putimage(enemy[i].x, enemy[i].y, &img_enemy[0], SRCINVERT);//x和y是飞机在窗口中的坐标elseputimage(enemy[i].x, enemy[i].y, &img_enemy[1], SRCINVERT);}}}void createBullet()
{for (int i = 0; i < BULLET_NUM; i++){if (!bull[i].live){bull[i].x = player.x+59;bull[i].y = player.y;bull[i].live = true;break;}}
}
void Bullmove(int speed)
{for (int i = 0; i < BULLET_NUM; i++){if (bull[i].live){bull[i].y -=speed;if (bull[i].y < 0){bull[i].live = false;}}}
}//角色移动,获取键盘信息,上下左右
void playermove(int speed)
{
#if 0if (_kbhit) {//有两种方式//1,getch()  阻塞函数,和scanf一样,如果没有输入,就会卡住程序,一直等待输入,//这个函数不是c语言标准函数,需要头文件<conio.h>char key = _getch();switch (key){case 'w':case 'W':player.y -= speed;break;case 's':case 'S':player.y += speed;break;case 'a':case 'A':player.x -= speed;break;case 'd':case 'D':player.x += speed;break;default:break;}}
}
#elif 1//2.使用Windows函数获取键盘输入//非阻塞函数,特别流畅//如果用字母,必须要用大写,大写可以识别大小写if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W')){if(player.y > 0)player.y -= speed;}if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S')){if (player.y < HIGHT-78)//78是飞机的高度player.y += speed;}if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A')){if(player.x+59>0)// 119/2  = 59是控制飞机子弹在左右边界的时候可以打到敌机player.x -= speed;}if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D')){if (player.x-59 < WIDTH-119)//119是飞机的宽度player.x += speed;}
#endif // 0if (GetAsyncKeyState(VK_SPACE) && Timer(100,1))//{//创建一个子弹createBullet();}}
//产生敌机
void createenemy()
{for (int i = 0; i < ENEMY_NUM; i++){if (!enemy[i].live){enemy[i].live = true;enemy[i].x = rand()%(WIDTH-75);enemy[i].y = 0;enemyHP(i);printf("pos(%d,%d) %d %d\n", enemy[i].x, enemy[i].y, enemy[i].live, enemy[i].hp);break;}}
}//敌机的移动
void enemymove(int speed)
{for (int i = 0; i < ENEMY_NUM; i++){if (enemy[i].live){enemy[i].y += speed;if (enemy[i].y > HIGHT){enemy[i].live = false;}}}
}//开始打飞机
void playplane()
{for (int i = 0; i < ENEMY_NUM; i++){if (!enemy[i].live)continue;for (int k = 0; k < BULLET_NUM; k++){if (!bull[k].live)continue;if (bull[k].x > enemy[i].x && bull[k].x<enemy[i].x + enemy[i].width&& bull[k].y>enemy[i].y && bull[k].y < enemy[i].y + enemy[i].hight)//子弹在飞机的界面内//则代表子弹打住了飞机{bull[k].live = false;enemy[i].hp--;}}if (enemy[i].hp == 0){enemy[i].live = false;}}
}void showenemy()//测试飞机能不能一直往下面落
{for (int i = 0; i < ENEMY_NUM; i++){printf("pos(%d,%d) %d %d\n", enemy[i].x, enemy[i].y,enemy[i].live, enemy[i].hp);}
}int main()
{/*测试
circle(50, 50, 50);//画空心圆
setfillcolor(GREEN);//圆的颜色
fillcircle(100, 100, 50);///实心⚪*///创建图形窗口initgraph(WIDTH, HIGHT,SHOWCONSOLE);//宽长gameinit();//双缓冲绘图BeginBatchDraw();while (1){gameDraw();FlushBatchDraw();playermove(5);Bullmove(5);//防止飞机全部一起出来if (Timer(500,0)){//创建一个飞机createenemy();}if (Timer(20, 2)){enemymove(1);}playplane();}EndBatchDraw();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_228938.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot摄影跟拍预定管理系统设计与实现的源码+文档

摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。…

kubernetes 实战学习

文章目录kubernetes 实战学习1. 资源创建方式2. Namespace3. Pod3.1 使用命令行创建一个 Pod3.2 使用 YAML 文件创建一个 pod3.3 查看 pod 日志3.4 查看 pod IP3.5 进入 pod 查看信息3.6 一个 pod 里同时运行多个容器3.7 pod 和宿主机之间文件拷贝4. Deployment4.1 deployment …

【OpenFOAM】-olaFlow-算例1- baseWaveFlume

算例路径&#xff1a; olaFlow\tutorials\baseWaveFlume 算例描述&#xff1a; 一个基础的二维波浪水槽 算例快照&#xff1a; 图1 波浪模拟结果图2 算例网格文件结构&#xff1a; ├── 0.org │ ├── U │ ├── alpha.water │ ├── alpha.water.org │ └─…

一种多引擎可视化数据流实现方案

企业大数据处理的挑战 随着大数据时代的到来&#xff0c;数据量迅猛增长&#xff0c;给传统的分析技术带来了巨大的冲击和挑战&#xff0c;企业面临着大数据处理的巨大挑战。将复杂的大数据处理问题进行简化&#xff0c;以便企业有更多人能够进行大数据处理&#xff0c;进而整…

C_C++文件,字符串和控制台格式化处理总结

在实际业务开发中经常会用到文件&#xff0c;字符串和控制台格式化操作&#xff0c;格式化操作无非就是将数据转成指定格式存储在文件或者字符串&#xff0c;或者显示在控制台上&#xff0c;或者反过来。本篇结合实际工作将C/C语言中常用的文件&#xff0c;字符串和控制台常用格…

8、python中的模块和包

文章目录模块模块导入的方式直接导入部分导入import module 和from module import *的区别模块的其他信息_ _ name _ _ 的特殊使用模块的分类包从包中导入模块的方式模块 模块就是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块 模块是非常简单的Python文…

小学生python游戏编程arcade----灯光示例

小学生python游戏编程arcade----灯光示例前言灯光阴影效果1、灯光效果1.1 玩家灯光效果1.2 代码2、灯光效果2.1 软效果2.2码实现3、硬效果3.1 灯光硬效果3.2代码实现4、灯光开关4.1 灯光开关4.2 代码实现灯光示例代码源码获取前言 接上篇文章继续解绍arcade游戏编程的基本知识…

凌玮科技IPO注册生效:曾踩雷理财损失2000万元,胡颖妮为董事长

11月30日&#xff0c;广州凌玮科技股份有限公司&#xff08;下称“凌玮科技”&#xff09;在深圳证券交易所创业板递交招股书&#xff08;注册稿&#xff09;。相较于此前招股书&#xff0c;凌玮科技补充披露了截至2022年9月30日的财务数据等信息&#xff0c;并对2022年度的业绩…

算法设计与分析 SCAU19180 集合划分问题

19180 集合划分问题 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description 教材课后习题2-8 n个元素的集合{1,2,…,n}可以划分若干个非空子集。例如&#xff0c;当n4时&#xff0c;集合{1,2,3,4}可以划分为15个不同的非…

信贷风控NCL净损失率的指标实现与应用

在金融信贷业务的风险控制过程中&#xff0c;有一项财务指标发挥着比较重要的信息参考价值&#xff0c;可以有效衡量某个月份放款金额在形成呆账后的资金损失情况&#xff0c;其中呆账指的是信贷逾期180天以上&#xff0c;这个指标便是NCL&#xff08;Net Credit Loss&#xff…

22.12.1打卡 漫步校园 记忆化搜索

题目里很显然只走最短路, 直接用bfs从终点到起点搜一遍将每一步到终点所需要的最短的时间存在一个dis数组中, 然后你就会发现原来的地图变成了这样 上面是地图下面是dis数组, 再看看经典记忆化搜索模板题滑雪的地图 对的, 非常地相似, 接下来的操作和滑雪基本一样, 只不过起点是…

轨迹预测——day 57 基于车道交叉和考虑驾驶方式的终点生成模型的前目标车辆轨迹预测

Trajectory Prediction of Preceding Target Vehicles Based on Lane Crossing and Final Points Generation Model Considering Driving Styles导读II.问题表述与系统架构A. Trajectory Prediction for PTVs&#xff08;preceding target vehicles&#xff09;B. Position and…

realme手机配什么蓝牙耳机?realme蓝牙耳机推荐

蓝牙耳机作为人手必备的单品&#xff0c;不同厂商的产品更是多种多样&#xff0c;用户可以有更多的选择&#xff0c;选购蓝牙耳机的时候&#xff0c;除了看重佩戴舒适度、发声单元人们更加追求最新研发的技术。realme是为年轻人而来的科技潮牌。秉持“敢越级”品牌理念&#xf…

Spring基础篇:注入

第一章&#xff1a;注入 一&#xff1a;什么是注入 &#xff08;Injection&#xff09;注入就是通过Spring的工厂类和spring的配置文件&#xff0c;对spring所创建的对象进行赋值&#xff0c;为成员变量进行赋值 二&#xff1a;为什么注入 为什么需要Spring工厂创建对象的时…

荟味齐鲁鲁菜网站/美食网站/菜谱网站

摘要 菜谱信息是餐厅必不可少的一个部分。在餐厅发展的整个过程中&#xff0c;菜谱信息管理担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类管理系统程序也在不断改进。本课题所设计的荟味齐鲁鲁菜网站&#xff0c;使用SSM框架&#xff0c;Mysql数据库&…

智能聊天机器人如何帮助独立站运营提高工作效率?

关键词&#xff1a;智能聊天机器人、独立站运营 独立站运营变得越来越受欢迎&#xff0c;独立站可以用来建立在线商店并推动您的电子商务业务取得成功。它具有大量以业务为中心的功能&#xff0c;也许这就是为什么许多公司相信它会发展其在线业务的轨迹。 添加聊天机器人可以进…

基于51单片机电子微波炉控制系统(源程序+仿真+原理图+全套资料)

资料编号&#xff1a;203 功能介绍&#xff1a; 该电子微波炉采用51单片机制作&#xff0c;有基本的加热、冷却、启动、停止等功能&#xff0c;并通过MCU 控制其加热、冷却时间&#xff0c;LED 数码管显示时间。程序采用C语言编写&#xff0c;仿真使用Proteus&#xff0c;程序…

mysql与磁盘的关系

1.如今一直在说mysql存储方式和磁盘的关系&#xff0c;但是现在都是硬盘存储啊 磁盘分为硬盘和软盘 硬盘结构&#xff08;机械硬盘和固态硬盘&#xff09;详解 硬盘的大小是使用"磁头数 x 柱面数 x 扇区数 x 每个扇区的大小 如下&#xff1a; 每个扇区的大小是固定的…

Allegro添加渐近线操作指导

Allegro添加渐近线操作指导 Allegro支持添加渐近线,让线宽变化的地方进行圆环的过渡,对于射频信号优化有很大帮助,类似下图 具体操作如下 首先设置参数,route-Gloss-Parameters 点击Fillet and Taper Trace前面的方框 勾选Allowed DRC, Unused Nets 勾选Tapered Trac…

【毕业设计】大数据心血管疾病数据分析(医学大数据分析)

文章目录0 前言1 课题背景2 数据处理3 数据可视化4 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学校对毕设的要求越来越高&#xff0c…