当前位置: 首页 > news >正文

【c语言】飞机大战2

1.优化边界问题

之前视频中当使用drawAlpha函数时,是为了去除飞机后面变透明,当时当飞机到达边界的时候,会出现异常退出,这是因为drawAlpha函数不稳定,昨天试过制作掩码图,下载了一个ps,改的话,图片大小又变了,最后采用的方式是当飞机在窗口内的时候使用drawAlpha函数贴图,当飞机要出边缘的时候,使用putimage贴图,防止出现闪退,优化后飞机到边界的时候会出现黑框.

边界优化

对应的代码实现

void draw()
{putimage(0, 0, &img_bk);if (plane.x > -1 && plane.x < WIDTH && plane.y>-1 && plane.y + 48< HEIGHT){drawAlpha(&img_plane, plane.x, plane.y);}else{putimage(plane.x, plane.y, &img_plane);}if (a.x > -1 && a.x < WIDTH && a.y>0&& a.y + 98 < HEIGHT){drawAlpha(&img_a, a.x, a.y);}else{putimage(a.x, a.y, &img_a);}if (b.x > -1 && b.x < WIDTH && b.y>-1 && b.y +120 < HEIGHT){drawAlpha(&img_b, b.x, b.y);}else{putimage(b.x, b.y, &img_b);}if (c.x > -1 && c.x < WIDTH && c.y>-1 && c.y + 120 < HEIGHT){drawAlpha(&img_c, c.x, c.y);}else{putimage(c.x, c.y, &img_c);}}

2.我方战机发射子弹

如果我们用数组存储子弹的信息的话,在不断发射子弹的过程中,不断的创建数组元素,会导致栈溢出,所以我们使用链表存储每个子弹的信息,当打出一个子弹时,会创建一个新的结点,并且尾插到头结点上去,当子弹出屏幕,或者隔一段时间,删除出屏幕的子弹,用到单链表节点的删除.

1.首先创建一个子弹的结构体,并创建我方飞机子弹的头节点

typedef struct bullet
{float x, y;float vx, vy;int  isexist;struct bullet* next;}list;
list* planebullet = NULL;

2.创建新结点

list* BuyplanebulletNode(float vx, float vy)
{list* newnode = (list*)malloc(sizeof(list));//空间申请assert(newnode);//断言,新结点是否申请到了newnode->vx = vx;//数据赋值newnode->vy = vy;//数据赋值newnode->x = plane.x + plane.width / 2+17;newnode->y = plane.y;//让子弹的出生坐标在飞机中间newnode->isexist = 1;newnode->next = NULL;//指向的地址赋值return newnode;//将申请好的空间首地址返回回去}

3 尾插新结点.

void pushback1(list** pphead,float vx,float vy)//尾插
{list* newnode = BuyplanebulletNode(vx, vy);if (*pphead == NULL)//链表无结点{*pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址}else{list* tail = *pphead;//定义一个指针,先指向头结点的地址while (tail->next != NULL)//循环遍历找尾结点{tail = tail->next;//指针指向下一个结点}tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址}}

4.结点的删除

void removebullet(list** pplist)
{if (*pplist == NULL)return;list* cur = *pplist;list* prev = NULL;while (cur != NULL){if (cur->isexist == 0){if (*pplist == cur){*pplist = cur->next;free(cur);cur = *pplist;}else{prev->next = cur->next;free(cur);cur = prev;}}else{prev = cur;cur = cur->next;}}}

5.子弹位置改变参数设置

void listchangexy(list** pplist)
{if (*pplist == NULL)return;list* cur = *pplist;while (cur != NULL){cur->x += cur->vx;cur->y += cur->vy;if ((cur->y<0 )|| (cur->y>HEIGHT) || (cur->x >0) || (cur->x <WIDTH))cur->isexist = 0;cur = cur->next;}}

遍历子弹链表,使得每个子弹的位置属性发生变化,当子弹出屏幕时,将当前cur指向的子弹的exist==0,表示子弹消失,cur指向下一个子弹,改变子弹的位置坐标属性.
上面创建的链表存下了每个子弹的属性,然后我们遍历子弹链表,贴子弹上去。

6.贴子弹上去

void showbullet()
{static int count1 = 0;listchangexy(&planebullet);for (list* cur = planebullet; cur!= NULL; cur = cur ->next){putimage(cur->x,cur->y, &img_planebullet);}if (++count1 == 100){removebullet(&planebullet);}if (count1 > 99999){count1 = 0;}}}

这里定时清理一下出屏幕的子弹,要不然太占内存了.如果直接使用removebullet会出现错误
当然在player_move函数里面加

	if (GetAsyncKeyState(VK_SPACE))// && Timer(300, 1)){pushback1(&planebullet, 0, -20);}

我们可以使用空格开火,当空格按下一次,就尾插子弹信息到对应子弹的结点上去
总结
在这里插入图片描述

子弹发射

7.解决子弹太密集问题

使用定时器函数,隔一段时间才能发射子弹

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

这个先记住就行,不用理解,参数第一个是定时时间,单位是ms,第二个我也不太清楚,传个1就行.

	if ((GetAsyncKeyState(VK_SPACE))&& Timer(300, 1)){pushback1(&planebullet, 0, -20);//pushback1(&planebullet, -10, -17.32);//pushback1(&planebullet, 10, -17.32);}

8.子弹升级

子弹升级

	if ((GetAsyncKeyState(VK_SPACE))&& Timer(300, 1)){pushback1(&planebullet, 0, -20);pushback1(&planebullet, -10, -17.32);pushback1(&planebullet, 10, -17.32);}

3.敌方的子弹发射

当我们会处理我方的子弹发射之后,敌方子弹的发射也是同样的道理

敌机a子弹的发射

敌机a子弹发射(步骤和我方战机相同)

list* abullet = NULL;
void pushback2(list** pphead, float vx, float vy);
list* BuyabulletNode(float vx, float vy)
{list* newnode = (list*)malloc(sizeof(list));//空间申请assert(newnode);//断言,新结点是否申请到了newnode->vx = vx;//数据赋值newnode->vy = vy;//数据赋值newnode->x = a.x + a.width / 2-10;newnode->y = a.y+80;newnode->isexist = 1;newnode->next = NULL;//指向的地址赋值return newnode;//将申请好的空间首地址返回回去}
void pushback2(list** pphead, float vx, float vy)//尾插
{list* newnode = BuyabulletNode(vx, vy);if (*pphead == NULL)//链表无结点{*pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址}else{list* tail = *pphead;//定义一个指针,先指向头结点的地址while (tail->next != NULL)//循环遍历找尾结点{tail = tail->next;//指针指向下一个结点}tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址}}
void removebullet(list** pplist)
{if (*pplist == NULL)return;list* cur = *pplist;list* prev = NULL;while (cur != NULL){if (cur->isexist == 0){if (*pplist == cur){*pplist = cur->next;free(cur);cur = *pplist;}else{prev->next = cur->next;free(cur);cur = prev;}}else{prev = cur;cur = cur->next;}}}
void listchangexy(list** pplist)
{if (*pplist == NULL)return;list* cur = *pplist;while (cur != NULL){cur->x += cur->vx;cur->y += cur->vy;if ((cur->y<0 )|| (cur->y>HEIGHT) || (cur->x >0) || (cur->x <WIDTH))cur->isexist = 0;cur = cur->next;}}void showbullet()
{static int count1 = 0;listchangexy(&planebullet);if (++count1 == 100){removebullet(&planebullet);removebullet(&abullet);removebullet(&bbullet);}if (count1 > 99999){count1 = 0;}for (list* cur = planebullet; cur!= NULL; cur = cur ->next){putimage(cur->x,cur->y, &img_planebullet);}listchangexy(&abullet);for (list* cur = abullet; cur != NULL; cur = cur->next){//putimage(cur->x - 10, cur->y - 10, &img_planebullet);putimage(cur->x , cur->y, &img_abullet);}//listchangexy(&bbullet);////for (list* cur = bbullet; cur != NULL; cur = cur->next)//{//	//putimage(cur->x - 10, cur->y - 10, &img_planebullet);//	putimage(cur->x, cur->y, &img_bbullet);//}}

因为敌机a在移动中发射子弹,所以将puchback2放在ufoamove函数里面

void ufoamove()
{static int dir1 = 1;static int cnt = 0;if (a.bornflag == 1){a.bornflag = 0;a.x = rand() % (WIDTH - a.width);a.y = -50;}if (a.y > 200){dir1 = 0;}else if (a.y < -150){dir1 = 1;a.bornflag = 1;}if (1 == dir1){a.y += a.speed;}else{a.y -= a.speed;}if (++cnt % 50 == 0){pushback2(&abullet, 0, 10);}if (cnt > 99999){cnt = 0;}}

设置一个静态变量cnt,当cnt%50取余==0时,发射子弹,这样也解决了子弹太密集(50可以修改,就相当于间隔),cnt为int,可能会溢出,所以>99999,将cnt=0;

敌机b子弹的发射

同理
在这里插入图片描述
包含头文件#include<math.h>

4.程序源码

#include<stdio.h>
#include <graphics.h>
#include <assert.h>
#include <stdlib.h>
#include<conio.h>//_getch();
#include <time.h>
#include <math.h>
#define PI 3.1415926
#define HEIGHT  503
#define WIDTH 700IMAGE img_bk, img_plane, img_a, img_b, img_c, img_abullet, img_bbullet, img_cbullet, img_planebullet,img_tmp;
typedef struct bullet
{float x, y;float vx, vy;int  isexist;struct bullet* next;}list;
list* planebullet = NULL;
list* abullet = NULL;
list* bbullet = NULL;
void pushback2(list** pphead, float vx, float vy);
void pushback3(list** pphead, float vx, float vy);
void pushback(list** pphead, list* newnode);//尾插;
struct aircraft
{int x, y;int width;int height;int speed;int bornflag;};
aircraft plane, a, b, c;
void datainit()
{plane = { 150,150 };//a = { 0,0 };/*b = { 300,0 };*//*c = { 450,0 };*/a.speed = 1;a.bornflag = 1;b.bornflag = 1;c.bornflag = 1;a.width = 100;a.height = 100;b.speed = 1;b.width = 80;b.height = 100;c.height = 70;c.width = 70;c.speed = 3;}
list* BuyabulletNode(float vx, float vy)
{list* newnode = (list*)malloc(sizeof(list));//空间申请assert(newnode);//断言,新结点是否申请到了newnode->vx = vx;//数据赋值newnode->vy = vy;//数据赋值newnode->x = a.x + a.width / 2-10;newnode->y = a.y+80;newnode->isexist = 1;newnode->next = NULL;//指向的地址赋值return newnode;//将申请好的空间首地址返回回去}
list* BuybbulletNode(float vx, float vy)
{list* newnode = (list*)malloc(sizeof(list));//空间申请assert(newnode);//断言,新结点是否申请到了newnode->vx = vx;//数据赋值newnode->vy = vy;//数据赋值newnode->x = b.x + b.width / 2 - 10;newnode->y = b.y + 80;newnode->isexist = 1;newnode->next = NULL;//指向的地址赋值return newnode;//将申请好的空间首地址返回回去}
list* BuyplanebulletNode(float vx, float vy)
{list* newnode = (list*)malloc(sizeof(list));//空间申请assert(newnode);//断言,新结点是否申请到了newnode->vx = vx;//数据赋值newnode->vy = vy;//数据赋值newnode->x = plane.x + plane.width / 2+17;newnode->y = plane.y;newnode->isexist = 1;newnode->next = NULL;//指向的地址赋值return newnode;//将申请好的空间首地址返回回去}
void drawAlpha(IMAGE* picture, int  picture_x, int picture_y) //x为载入图片的X坐标,y为Y坐标
{// 变量初始化DWORD* dst = GetImageBuffer();    // GetImageBuffer()函数,用于获取绘图设备的显存指针,EASYX自带DWORD* draw = GetImageBuffer();DWORD* src = GetImageBuffer(picture); //获取picture的显存指针int picture_width = picture->getwidth(); //获取picture的宽度,EASYX自带int picture_height = picture->getheight(); //获取picture的高度,EASYX自带int graphWidth = getwidth();       //获取绘图区的宽度,EASYX自带int graphHeight = getheight();     //获取绘图区的高度,EASYX自带int dstX = 0;    //在显存里像素的角标// 实现透明贴图 公式: Cp=αp*FP+(1-αp)*BP , 贝叶斯定理来进行点颜色的概率计算for (int iy = 0; iy < picture_height; iy++){for (int ix = 0; ix < picture_width; ix++){int srcX = ix + iy * picture_width; //在显存里像素的角标int sa = ((src[srcX] & 0xff000000) >> 24); //0xAArrggbb;AA是透明度int sr = ((src[srcX] & 0xff0000) >> 16); //获取RGB里的Rint sg = ((src[srcX] & 0xff00) >> 8);   //Gint sb = src[srcX] & 0xff;              //Bif (ix >= 0 && ix <= graphWidth && iy >= 0 && iy <= graphHeight && dstX <= graphWidth * graphHeight){if ((ix + picture_x) >= 0 && (ix + picture_x) <= graphWidth)	//防止出边界后循环显示{dstX = (ix + picture_x) + (iy + picture_y) * graphWidth; //在显存里像素的角标int dr = ((dst[dstX] & 0xff0000) >> 16);int dg = ((dst[dstX] & 0xff00) >> 8);int db = dst[dstX] & 0xff;draw[dstX] = ((sr * sa / 255 + dr * (255 - sa) / 255) << 16)  //公式: Cp=αp*FP+(1-αp)*BP  ; αp=sa/255 , FP=sr , BP=dr| ((sg * sa / 255 + dg * (255 - sa) / 255) << 8)         //αp=sa/255 , FP=sg , BP=dg| (sb * sa / 255 + db * (255 - sa) / 255);              //αp=sa/255 , FP=sb , BP=db}}}}
}void load()
{loadimage(&img_bk, "./back.png");loadimage(&img_plane, "./1.png");loadimage(&img_a, "./2.png");loadimage(&img_b, "./3.png");loadimage(&img_c, "./4.png");loadimage(&img_abullet, "./5.png");loadimage(&img_bbullet, "./6.png");loadimage(&img_cbullet, "./7.png");loadimage(&img_planebullet, "./8.png");}
void draw()
{putimage(0, 0, &img_bk);if (plane.x > -1 && plane.x < WIDTH && plane.y>-1 && plane.y + 48< HEIGHT){drawAlpha(&img_plane, plane.x, plane.y);}else{putimage(plane.x, plane.y, &img_plane);}if (a.x > -1 && a.x < WIDTH && a.y>0&& a.y + 98 < HEIGHT){drawAlpha(&img_a, a.x, a.y);}else{putimage(a.x, a.y, &img_a);}if (b.x > -1 && b.x < WIDTH && b.y>-1 && b.y +120 < HEIGHT){drawAlpha(&img_b, b.x, b.y);}else{putimage(b.x, b.y, &img_b);}if (c.x > -1 && c.x < WIDTH && c.y>-1 && c.y + 120 < HEIGHT){drawAlpha(&img_c, c.x, c.y);}else{putimage(c.x, c.y, &img_c);}/*drawAlpha(&img_a, a.x, a.y);drawAlpha(&img_b, b.x, b.y);drawAlpha(&img_c, c.x, c.y);drawAlpha(&img_abullet, 400, 0);drawAlpha(&img_bbullet, 400, 50);drawAlpha(&img_cbullet, 400, 100);drawAlpha(&img_planebullet, 400, 150);*//*       putimage(plane.x, plane.y, &img_plane); putimage(a.x, a.y ,&img_a);putimage(b.x, b.y ,&img_b );putimage(c.x, c.y, &img_c );putimage(400, 50 ,&img_bbullet);putimage(400, 100 ,&img_cbullet );*/}void ufoamove()
{static int dir1 = 1;static int cnt = 0;if (a.bornflag == 1){a.bornflag = 0;a.x = rand() % (WIDTH - a.width);a.y = -50;}if (a.y > 200){dir1 = 0;}else if (a.y < -150){dir1 = 1;a.bornflag = 1;}if (1 == dir1){a.y += a.speed;}else{a.y -= a.speed;}if (++cnt % 50 == 0){pushback2(&abullet, 0, 10);}if (cnt > 99999){cnt = 0;}}
void ufobmove()
{static int num = 0;static int step = b.speed;if (b.bornflag == 1){b.bornflag = 0;b.x = rand() % (WIDTH - b.width);b.y = -b.height;}if (b.x <= 0 || b.x + b.width >= WIDTH){step = -step;}b.x += step;b.y++;if (b.y >= HEIGHT){b.bornflag = 1;}if (++num % 200 == 0){for (int i = 0; i < 10; i++){float angle = i * 2 * PI / 10;float vx = 1* sin(angle);float vy = 1 * cos(angle);pushback3(&bbullet, vx, vy);}}if (num > 99999){num = 0;}}void pushback1(list** pphead,float vx,float vy)//尾插
{list* newnode = BuyplanebulletNode(vx, vy);if (*pphead == NULL)//链表无结点{*pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址}else{list* tail = *pphead;//定义一个指针,先指向头结点的地址while (tail->next != NULL)//循环遍历找尾结点{tail = tail->next;//指针指向下一个结点}tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址}}
void pushback2(list** pphead, float vx, float vy)//尾插
{list* newnode = BuyabulletNode(vx, vy);if (*pphead == NULL)//链表无结点{*pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址}else{list* tail = *pphead;//定义一个指针,先指向头结点的地址while (tail->next != NULL)//循环遍历找尾结点{tail = tail->next;//指针指向下一个结点}tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址}}
void pushback3(list** pphead, float vx, float vy)//尾插
{list* newnode = BuybbulletNode(vx, vy);if (*pphead == NULL)//链表无结点{*pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址}else{list* tail = *pphead;//定义一个指针,先指向头结点的地址while (tail->next != NULL)//循环遍历找尾结点{tail = tail->next;//指针指向下一个结点}tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址}}
void removebullet(list** pplist)
{if (*pplist == NULL)return;list* cur = *pplist;list* prev = NULL;while (cur != NULL){if (cur->isexist == 0){if (*pplist == cur){*pplist = cur->next;free(cur);cur = *pplist;}else{prev->next = cur->next;free(cur);cur = prev;}}else{prev = cur;cur = cur->next;}}}
void listchangexy(list** pplist)
{if (*pplist == NULL)return;list* cur = *pplist;while (cur != NULL){cur->x += cur->vx;cur->y += cur->vy;if ((cur->y<0 )|| (cur->y>HEIGHT) || (cur->x >0) || (cur->x <WIDTH))cur->isexist = 0;cur = cur->next;}}
void showbullet()
{static int count1 = 0;listchangexy(&planebullet);if (++count1 == 100){removebullet(&planebullet);removebullet(&abullet);removebullet(&bbullet);}if (count1 > 99999){count1 = 0;}for (list* cur = planebullet; cur!= NULL; cur = cur ->next){putimage(cur->x,cur->y, &img_planebullet);}listchangexy(&abullet);for (list* cur = abullet; cur != NULL; cur = cur->next){//putimage(cur->x - 10, cur->y - 10, &img_planebullet);putimage(cur->x , cur->y, &img_abullet);}listchangexy(&bbullet);for (list* cur = bbullet; cur != NULL; cur = cur->next){//putimage(cur->x - 10, cur->y - 10, &img_planebullet);putimage(cur->x, cur->y, &img_bbullet);}}void ufocmove()
{static float disx = 0, disy = 0;static float tmpx = 0, tmpy = 0;static float vx = 0, vy = 0;float step = 1000 / c.speed;if (1 == c.bornflag){c.bornflag = 0;tmpx = rand() % (WIDTH - c.width);tmpy = -c.height;disx = plane.x - tmpx;disy = plane.y - tmpy;vx = disx / step;vy = disy / step;}tmpx += vx;tmpy += vy;c.x = (int)(tmpx + 0.5);c.y = (int)(tmpy + 0.5);if (c.x < -c.width){c.bornflag = 1;}else if (c.x > WIDTH){c.bornflag = 1;}if (c.y > HEIGHT){c.bornflag = 1;}}
bool Timer(int ms, int id)
{static DWORD t[10];if (clock() - t[id] > ms){t[id] = clock();return true;}return false;
}
void player_move(int speed) //处理飞机移动
{int reload_time = 100;static int fire_start = 0;int tmp = clock();if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W')){if (plane.y > 0)plane.y -= speed;}if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S')){if (plane.y + 51 < HEIGHT)plane.y += speed;}if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A')){if (plane.x > 0)plane.x -= speed;}if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D')){if (plane.x + 51 < WIDTH)plane.x += speed;}if ((GetAsyncKeyState(VK_SPACE))&& Timer(300, 1)){pushback1(&planebullet, 0, -20);pushback1(&planebullet, -10, -17.32);pushback1(&planebullet, 10, -17.32);}}int main(){initgraph(WIDTH, HEIGHT,CONSOLE_FULLSCREEN);BeginBatchDraw();datainit();while (1){load();draw();ufoamove();ufobmove();ufocmove();player_move(5);showbullet();FlushBatchDraw();}EndBatchDraw();getchar();}

5.剩下的发在下篇

6.效果演示

效果演示

相关文章:

【c语言】飞机大战2

1.优化边界问题 之前视频中当使用drawAlpha函数时&#xff0c;是为了去除飞机后面变透明&#xff0c;当时当飞机到达边界的时候&#xff0c;会出现异常退出&#xff0c;这是因为drawAlpha函数不稳定&#xff0c;昨天试过制作掩码图&#xff0c;下载了一个ps,改的话&#xff0c…...

海康visionmaster-渲染控件:渲染控件加载本地图像的方法

描述 环境&#xff1a;VM4.0.0 VS2015 及以上 现象&#xff1a;渲染控件如何显示本地图像&#xff1f; 解答 思路&#xff1a;在 2.3.1 中&#xff0c;可以通过绑定流程或者模块来显示图像和渲染效果。因此&#xff0c;第一步&#xff0c; 可以使用在 VM 软件平台中给图像源模…...

【SD】一致性角色 - 同一人物 不同姿势 - 2

首先生成4张不同姿势的图片 masterpiece,high quality,(white background:1.6),(simple background:1.4),1gril,solo,black footwear,black hair,brown eyes,closed mouth,full body,glasses,jacket,long hair,long sleeves,lookig at viewer,plaid,plaid skirt,pleated shirt,…...

摩尔线程S80对于软件的支持

摩尔线程对软件的支持 时间&#xff1a;2024年1月1日 显卡型号&#xff1a;MTT S80 主板型号&#xff1a;七彩虹 igame z590 火神 V20 CPU&#xff1a; intel core i5 10400f 内存&#xff1a; 海盗船3600 16*2 存储&#xff1a; 致态1Tb nvme 显卡的驱动是最新的。 游戏 S…...

基数排序 RadixSort

基数排序是一种非比较型整数排序算法&#xff0c;其原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。由于整数也可以表达字符串&#xff08;比如名字或日期&#xff09;和特定格式的浮点数&#xff0c;所以基数排序也不是只能使用于整数 . 动态演示 :…...

Maven下载和安装的详细教程

文章目录 一、Maven下载和安装1.1 下载 Maven1.2 配置环境变量 参考资料 一、Maven下载和安装 1.1 下载 Maven 打开 Maven 的官方网站Maven – Download Apache Maven&#xff0c;下载最新版本的 Maven 在可选择的版本中&#xff0c;不同版本的区别在于: binary是已经编译过的…...

申请虚拟VISA卡Fomepay教程

fomepay 用下面的注册链接直达 https://gpt.fomepay.com/#/pages/login/index?dS21BA1 或者扫描下面图片的二维码直达注册 注册后尽量随用随充值不建议放大量现金在里面。...

java常见面试题:什么是装箱和拆箱?装箱和拆箱有哪些应用场景

装箱和拆箱是计算机科学中常用的术语&#xff0c;主要用于描述将数据从一种类型转换为另一种类型的操作。 装箱是将值类型转换为引用类型的过程。在装箱时&#xff0c;需要了解编译器内部的操作。首先&#xff0c;在托管堆中分配好内存&#xff0c;分配的内存量是值类型的各个…...

【map】【滑动窗口】【字典树】C++算法:最长合法子字符串的长度

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本文涉及的基础知识点 C算法&#xff1a;滑动窗口总结 字典树 map 离线查询 map map可以分成有序(单调)map和无序(哈希)map。还可分成单键map和多键map&#xff08;允许重复的键&#xff09;。本文用…...

机器学习部分相关概念

数据集(Data Set)即数据的集合&#xff0c;每一条单独的数据被称为样本(Sample)。 对于每个样本&#xff0c;它通常具有一些属性(Attribute)或者特征(Feature)&#xff0c; 特征所具体取得值被称为特征值(Feature Value)。 西瓜数据集 色泽根蒂纹理青绿稍蜷模糊乌黑蜷缩清晰 …...

Apache DolphinScheduler 3.1.9 版本发布:提升系统的稳定性和性能

&#x1f680;我们很高兴宣布&#xff0c;Apache DolphinScheduler 的最新版本 3.1.9 已正式发布&#xff01;此版本在 3.1.8 的基础上进行了关键的 bug 修复和文档更新&#xff0c;共计修复了 14 个 bug 和改进了 3 个文档。 主要更新亮点 本次更新重点解决了以下几个关键问题…...

go-carbon v2.3.1 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库&#xff0c;支持链式调用。 目前已被 awesome-go 收录&#xff0c;如果您觉得不错&#xff0c;请给个 star 吧 github.com/golang-module/carbon gitee.com/golang-module/carbon 安装使用 Golang 版本大于…...

R_handbook_作图专题

ggplot基本作图 1 条形图 library(ggplot2) ggplot(biopics) geom_histogram(aes(x year_release),binwidth1,fill"gray") 2 堆砌柱状图 ggplot(biopics, aes(xyear_release)) geom_bar(aes(fillsubject_sex)) 3 堆砌比例柱状图 ggplot(biopics, aes(xyear_rele…...

关于Python里xlwings库对Excel表格的操作(二十五)

这篇小笔记主要记录如何【如何使用xlwings库的“Chart”类创建一个新图表】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2…...

2024 年软件工程将如何发展

软件开发目前正在经历一场深刻的变革&#xff0c;其特点是先进自动化的悄然但显着的激增。这一即将发生的转变有望以前所未有的规模简化高质量应用程序的创建和部署。 它不是单一技术引领这一演变&#xff0c;而是创新的融合。从人工智能(AI) 和数字孪生技术&#xff0c;到植根…...

【Git】git基础

Git 命令 git config --globle user.name ""git config --globle user.email ""git config -lgit config --globle --unset []git add []git commit -m ""]git log//当行且美观 git log --prettyoneline//以图形化和简短的方式 git log --grap…...

Linux中账号和权限管理

目录 一.用户账号和组账号&#xff1a; 1.用户账号类型&#xff1a; 2.组账号类型&#xff1a; 3.系统区别用户的方法 &#xff1a; 4.用户账号文件&#xff1a; 二.Linux中账户相关命令&#xff1a; 1.useradd&#xff1a; 2.passwd&#xff1a; 3.usermod&#xff1a…...

Resnet BatchNormalization 迁移学习

时间&#xff1a;2015 网络中的亮点&#xff1a; 超深的网络结构&#xff08;突破1000层&#xff09;提出residual模块使用Batch Normalization加速训练&#xff08;丢弃dropout&#xff09; 层数越深效果越好&#xff1f; 是什么样的原因导致更深的网络导致的训练效果更差呢…...

Unity检测地面坡度丨人物上坡检测

Unity检测地面坡度 前言使用 代码 前言 此功能为&#xff0c;人物在爬坡等功能时可以检测地面坡度从而完成向某个方向给力或者完成其他操作 使用 其中我们创建了脚本GradeCalculation&#xff0c;把脚本挂载到人物上即可&#xff0c;或者有其他的使用方式&#xff0c;可自行…...

SASS循环

<template><div><button class"btn type-1">默认按钮</button><button class"type-2">主要按钮</button><button class"type-3">成功按钮</button><button class"type-4">信息…...

Java超高精度无线定位技术--UWB (超宽带)人员定位系统源码

UWB室内定位技术是一种全新的、与传统通信技术有极大差异的通信新技术。它不需要使用传统通信体制中的载波&#xff0c;而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据&#xff0c;从而具有GHz量级的带宽。 UWB&#xff08;超宽带&#xff09;高精度定位系统是一…...

系列十一、解压文件到指定目录

一、解压文件到指定目录 1.1、需求 Linux的/opt目录有一个文件zookeeper-3.4.11.tar.gz&#xff0c;我现在想把该文件解压至/usr/local/目录&#xff0c;那么应该怎么做呢&#xff1f; 语法&#xff1a;tar -zxvf xxx -C /usr/local/ tar -zxvf zookeeper-3.4.11.tar.gz -C /u…...

PHP Swoole Client

PHP常用socket创建TCP连接&#xff0c;使用CURL创建HTTP连接&#xff0c;为了简化操作&#xff0c;Swoole提供了Client类用于实现客户端功能&#xff0c;并增加了异步非阻塞模式&#xff0c;让用户在客户端也能使用事件循环。 作为客户端使用&#xff0c;Swoole Client可以在F…...

《QDebug 2023年12月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.Q_REVISION 标记的信号槽或者 REVISION 标记的属性&#xff0c;在子类中访问 Q_REVISION 是 Qt 用来做版本控制的一个宏。以 QQuickWindow 为例&#xff0c;继承后去访问 REVISION 标记的 opacity 属性或者 Q_REVISION…...

sklearn 中matplotlib编制图表

代码 # 导入pandas库&#xff0c;并为其设置别名pd import pandas as pd import matplotlib.pyplot as plt# 使用pandas的read_csv函数读取名为iris.csv的文件&#xff0c;将数据存储在iris_data变量中 iris_data pd.read_csv(data/iris.txt,sep\t)# 使用groupby方法按照&quo…...

【Docker-Dev】Mac M2 搭建docker的redis环境

Redis的dev环境docker搭建 1、前言2、官方文档重点信息提取2.1、创建redis实例2.2、使用自己的redis.conf文件。 3、单机版redis搭建4、redis集群版4.1、一些验证4.2、一些问题 结语 1、前言 本文主要针对M2下&#xff0c;相应进行开发环境搭建&#xff0c;然后做一个文档记录…...

docker +gitee+ jenkins +maven项目 (一)

jenkins环境和插件配置 文章目录 jenkins环境和插件配置前言一、环境版本二、jenkins插件三、环境安装总结 前言 现在基本都是走自动化运维&#xff0c;想到用docker 来部署jenkins &#xff0c;然后jenkins来部署java代码&#xff0c;做到了开箱即用&#xff0c;自动发布代码…...

IDEA 开发中常用的快捷键

目录 Ctrl 的快捷键 Alt 的快捷键 Shift 的快捷键 Ctrl Alt 的快捷键 Ctrl Shift 的快捷键 其他的快捷键 Ctrl 的快捷键 Ctrl F 在当前文件进行文本查找 &#xff08;必备&#xff09; Ctrl R 在当前文件进行文本替换 &#xff08;必备&#xff09; Ctrl Z 撤…...

Ubuntu Desktop 死机处理

Ubuntu Desktop 死机处理 当 Ubuntu Desktop 死机时&#xff0c;除了长按电源键重启&#xff0c;还可以使用如下两种方式处理。 方式1&#xff1a;ctrlaltFn 使用 ctrl alt F3~F6: 切换到其他 tty 命令行。 执行 top 命令查看资源占用最多的进程&#xff0c;然后使用 kill…...

Hermite矩阵

Hermite矩阵 文章目录 Hermite矩阵一、正规矩阵【定义】A^H^矩阵【定理】 A^H^的运算性质【定义】正规矩阵、特殊的正规矩阵【定理】与正规矩阵酉相似的矩阵也是正规矩阵【定理】正规的上(下)三角矩阵必为对角矩阵【定义】复向量的内积【定理】Schmitt正交化 二、酉矩阵&#x…...

HTML 实操试题(二)

创建一个简单的HTML文档&#xff1a; 包含<!DOCTYPE html>声明。包含<html>标签&#xff0c;并设置lang属性为英语。包含<head>标签&#xff0c;其中包含<meta charset"UTF-8">和一个自定义的页面标题。包含<body>标签&#xff0c;其…...

MongoDB 面试题

MongoDB 面试题 1. 什么是MongoDB&#xff1f; MongoDB是一种非关系型数据库&#xff0c;被广泛用于大型数据存储和分布式系统的构建。MongoDB支持的数据模型比传统的关系型数据库更加灵活&#xff0c;支持动态查询和索引&#xff0c;也支持BSON格式的数据存储&#xff0c;这…...

LeetCode 1154. 一年中的第几天:2023年最后一道每日一题

【LetMeFly】1154.一年中的第几天&#xff1a;2023年最后一道每日一题 力扣题目链接&#xff1a;https://leetcode.cn/problems/day-of-the-year/ 给你一个字符串 date &#xff0c;按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 示例 1&…...

《深入理解JAVA虚拟机笔记》OutOfMemoryError 异常

在《Java 虚拟机规范》的规定里&#xff0c;除了程序计数器外&#xff0c;虚拟机内存的其他几个运行时区域都有发生 OutOfMemoryError &#xff08;下文称 OOM&#xff09;异常的可能。 Java堆溢出 Java 堆用于储存对象实例&#xff0c;我们只要不断地创建对象&#xff0c;并…...

R306指纹识别模块指令系统

一&#xff1a;指令集 1. GR_GetImage 指令代码&#xff1a;01H 功能&#xff1a;从传感器上读入图像存于图像缓冲区 2. GR_GenChar 指令代码&#xff1a;02H 功能&#xff1a;根据原始图像生成指纹特征存于 CharBuffer1 或 CharBuffer2 3. GR_Match 指令代码&#xff…...

redis的搭建及应用(三)-Redis主从配置

Redis主从配置 为提升Redis的高可用性&#xff0c;需要搭建多个Redis集群以保证高可用性。常见搭建方式有&#xff1a;主从&#xff0c;哨兵集群等&#xff0c;本节我们搭建一主二从的多Redis架构。 redis主从安装1主2从的方式配置&#xff0c;以端口号为redis的主从文件夹。 主…...

Java学习,一文掌握Java之SpringBoot框架学习文集(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…...

javaWeb学生信息管理系统2

一、学生信息管理系统SIMS 一款基于纯Servlet技术开发的学生信息管理系统&#xff08;SIMS&#xff09;&#xff0c;在设计中没有采用SpringMVC和Spring Boot等框架。系统完全依赖于Servlet来处理HTTP请求和管理学生信息&#xff0c;实现了信息的有效存储、检索和更新&#xf…...

Linux Shell 019-文本行处理工具sed

Linux Shell 019-文本行处理工具sed 本节关键字&#xff1a;Linux、Bash Shell、文本行处理工具 相关指令&#xff1a;sed、 sed介绍 sed是Stream Editor&#xff08;流编辑器&#xff09;的缩写&#xff0c;简称流编辑器&#xff1b;用来处理文件的。sed是一行一行读取文件…...

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷 一&#xff1a;fdisk磁盘分区并挂载1.查看磁盘分区信息2.分区3.强制系统重新读取分区(避免重启系统)4.格式化分区5.创建挂载目录6.设置开机自动挂载&#xff1a;7.验证并自动挂载(执行了该命令不需要重启系统)8.查看挂载007.异常情况处…...

【leetcode】栈与队列总结

本文内容来自于代码随想录 栈 用栈实现队列 两个栈实现队列。思路&#xff1a;两个栈分别表示入栈和出栈。 入队&#xff1a;直接入栈出队&#xff1a; a. 出栈为空&#xff0c;先把入栈中的元素全部放到出栈中&#xff08;相当于反过来&#xff0c;这样在出栈的时候先进的元…...

[EFI]HP Spectre 13 v102nl电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 HP Spectre 13 v102nl 处理器Intel Core i7-7500U (7th gen - Kaby Lake)已驱动内存8 GB LPDDR3-1866 SDRAM已驱动硬盘512 GB Toshiba NVMe™ M.2 SSD已驱动显卡Intel HD Graphics 620已驱动声卡Conexant CX8200 (0x2008)已驱动网卡I1211 Gigabit Etherne…...

【Pytorch】学习记录分享8——PyTorch自然语言处理基础-词向量模型Word2Vec

【Pytorch】学习记录分享7——PyTorch自然语言处理基础-词向量模型Word2Vec 1. 词向量模型Word2Vec)1. 如何度量这个单词的&#xff1f;2.词向量是什么样子&#xff1f;3.词向量对应的热力图&#xff1a;4.词向量模型的输入与输出![在这里插入图片描述](https://img-blog.csdni…...

【Kotlin 】协程

Kotlin协程 背景定义实践GlobalScope.launchrunBlocking业务实践 背景 在项目实践过程中&#xff0c;笔者发现很多异步或者耗时的操作&#xff0c;都使用了Kotlin中的协程&#xff0c;所以特地研究了一番。 定义 关于协程&#xff08;Coroutine&#xff09;&#xff0c;其实…...

用Xshell连接虚拟机的Ubuntu20.04系统记录。虚拟机Ubuntu无法上网。本机能ping通虚拟机,反之不能。互ping不通

先别急着操作&#xff0c;看完再试。 如果是&#xff1a;本机能ping通虚拟机&#xff0c;反之不能。慢慢看到第8条。 如果是&#xff1a;虚拟机不能上网&#xff08;互ping不通&#xff09;&#xff0c;往下一直看。 系统是刚装的&#xff0c;安装步骤&#xff1a;VMware虚拟机…...

人机对话--关于意识机器

人机对话–关于意识机器 这段内容是我和《通义千问》的对话。这本身展示的是人工智能的效果&#xff0c;同时这里面的内容也有人工智能相关&#xff0c;与各位分享。 我&#xff1a;阿尼尔赛斯 《意识机器》这本书写的是什么&#xff1f; 通义千问&#xff1a; 阿尼尔赛斯教…...

八股文打卡day16——计算机网络(16)

面试题&#xff1a;TCP连接是如何确保可靠性的&#xff1f; 我的回答&#xff1a; 1.数据分块控制。应用数据被分成被认为最适合传输的数据块大小&#xff0c;再发送到传输层&#xff0c;数据块被称为数据报文段或数据段。 2.序列号和确认应答。TCP为每一个数据包分配了一个序…...

Java Object浅克隆深克隆

对象克隆 把A对象的属性值完全拷贝给B对象&#xff0c;也叫对象拷贝&#xff0c;对象复制。 实现Cloneable接口&#xff0c;表示当前类的对象就可以被克隆&#xff0c;反之&#xff0c;表示当前类的对象就不能克隆。 如果一个接口里面没有抽象方法&#xff0c;表示当前的接口…...

概率的 50 个具有挑战性的问题 [8/50]:完美的桥牌

一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒&#xff08;Frederick Mosteller&#xff09;的《概率论中的五十个具有挑战性的问题与解决方案》&#xff09;一书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇…...

自动驾驶学习笔记(二十四)——车辆控制开发

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 控制算法 控制标定 控制协议…...