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

(C语言)球球大作战

  前言:

这款简易版的球球大作战是一款单人游戏,玩家需要控制一个小球在地图上移动,吞噬其他小球来增大自己的体积。本游戏使用C语言和easyx图形库编写,旨在帮助初学者了解游戏开发的基本概念和技巧。

在开始编写代码之前,我们需要先了解一下游戏的基本规则和功能:

游戏界面:游戏界面是一个矩形区域,玩家可以在这个区域内控制球的移动。

玩家小球:玩家控制的小球可以在游戏界面内自由移动,按下空格键可以加速。

其他小球:其他小球又分为食物小球,和ai控制的小球

体积:玩家每吃一个其他小球体积就会增大一点,ai小球也可以通过吃食物和玩家小球增大体积。

玩家被吃:当玩家小球被ai小球吃了,玩家小球就会回到初始点,体积也会变成初始大小。

ai小球的追击和逃跑:当玩家小球与ai小球靠近时,ai小球会根据自身体积的大小选择追击玩家小球或者逃跑。

接下来,我们将通过以下几个步骤来实现这个游戏:

初始化游戏界面和小球的信息。

处理键盘输入,实现玩家小球的移动和加速。

生成足够数量的食物小球。

生成ai小球,并控制其移动。

检测小球之间的吞噬关系,增加相应的体积。

通过学习这个游戏的开发过程,初学者将能够掌握C语言编程和easyx图形库的基本技巧。

1. 小球的要素

在此游戏中一个小球的要素无非就是小球所在的位置(坐标)、小球的半径、以及小球的颜色,这里我们可以用一个结构体数组来存放这些要素,以方便初始化小球的信息。

struct Ball
{int x;int y;float r;DWORD color;
};

2. 初始化小球的信息

将玩家小球的初始位置设置在窗口的中间,半径大小为10。食物小球和ai小球的位置则通过rand函数、srand函数和time函数生成的随机数,随机分布在地图的各个位置,食物小球半径为1-5,ai小球的半径10.其中在这里使用了RGB随机生成一个颜色,使每个食物小球的颜色都不尽相同。

RGB色彩模式是一种工业标准,它通过红(R)、绿(G)、蓝(B)三个颜色通道的组合来表示不同的颜色。每个通道通常分配一个0到255之间的数值,其中0表示该颜色通道没有亮度,255表示该颜色通道的最大亮度。通过调整这三个通道的值,可以生成几乎所有人类视觉系统能够感知的颜色。例如:

  • 橙色可以通过RGB值(255, 128, 0)来表示。
  • 黄色的RGB值为(255, 255, 0)。
  • 绿色的RGB值是(0, 255, 0)。
  • 蓝色的RGB值为(0, 0, 255)。
  • 紫色可以通过RGB值(170, 0, 255)来表示。
  • 黑色的RGB值为(0, 0, 0)。
  • 白色的RGB值为(255, 255, 255)。
  • 灰色的RGB值可以是(128, 128, 128),其中三个值相等即可,值越接近255,颜色就越接近白色,反之亦然。
void Inset()
{//玩家小球srand((unsigned)time(NULL));player.x = Wide / 2;player.y = Hight / 2;player.r = 10;//食物小球for (int i = 0; i < Food_num; i++){Food[i].x = rand() % Wide_map;Food[i].y = rand() % Hight_map;Food[i].r = rand() % 5 + 1;Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);}//ai小球for (int i = 0; i < Enemy_num; i++){Enemy[i].x = rand() % Wide_map;Enemy[i].y = rand() % Hight_map;Enemy[i].r = 10;Enemy[i].color = RGB(0,255,0);}}

3. 玩家操作小球

在这里需要用到GetAsyncKeyState(vk virtual key)函数获取异步按键状态,其中vk virtual key是虚拟键值,如果接受到这个虚拟键值,它会返回真。VK_UP、VK_DOWN、VK_LEFT、VK_RIGHT、0x20分别是上箭头键、下箭头键、左箭头键、右箭头键、空格键的虚拟键值。

void Player_move()
{if (GetAsyncKeyState(VK_UP)){if (player.y > 0){player.y -= player_sleep;}}if (GetAsyncKeyState(VK_DOWN)){if (player.y < Hight_map)player.y += player_sleep;}if (GetAsyncKeyState(VK_LEFT)){if (player.x > 0)player.x -= player_sleep;}if (GetAsyncKeyState(VK_RIGHT)){if (player.x < Wide_map)player.x += player_sleep;}if (GetAsyncKeyState(0x20)){player_sleep = l + 5;}else{player_sleep = l;}
}

4. 显示出小球

在此游戏中,小球是一个实心圆,在easyx图形库中提供了一个画实心圆的函数—solidcircle函数,通过它我们就可以在窗口中显示小球了,但显示出的小球默认颜色为白色,为了区分不同的小球,我们还需使用setfillcolor函数来改变小球的颜色。因为显示的函数、玩家操作小球的函数等函数都是放在同一个while循环重复执行的,这样就会重复显示小球,所以我们还需要用到一个清屏函数cleardevice。为了使窗口更好看可以使用setbkcolor函数修改窗口的背景颜色,以及使用line函数在窗口中画一些线,函数setlinecolor可以改变线的颜色。

void Show()
{//设置地图SetWorkingImage(&map);//清屏cleardevice();//背景颜色setbkcolor(WHITE);//划线颜色setlinecolor(RGB(230,231,239));//划线for (int i = 0; i < Wide_map; i += 10){line(i, 0, i, Hight_map);}for (int i = 0; i < Hight_map; i += 10){line(0, i, Wide_map, i);}//食物for (int i = 0; i < Food_num; i++){setfillcolor(Food[i].color);solidcircle(Food[i].x, Food[i].y, Food[i].r);}//敌人for (int i = 0; i < Enemy_num; i++){setfillcolor(Enemy[i].color);solidcircle(Enemy[i].x, Enemy[i].y, Enemy[i].r);}//玩家setfillcolor(RED);solidcircle(player.x, player.y, player.r);SetWorkingImage();int x = player.x - (Wide / 2);int y = player.y - (Hight / 2);//防止窗口越界if (x < 0){x = 0;}if (y < 0){y = 0;}if (x > Wide_map - Wide){x = Wide_map - Wide;}if (y > Hight_map - Hight){y = Hight_map - Hight;}//把map输出到窗口上putimage(0, 0, Wide, Hight, &map, x, y);
}

5. 生成地图

可以使用IMAGE map(Wide_map, Hight_map) 创建一个图像映射,其中 Wide_map 代表图像的宽度,而 Hight_map 代表图像的高度。然后使用SetWorkingImage(&map),将map的地址作为参数传递给SetWorkingImage函数。这个函数的作用是将map作为当前操作的对象,以便在后续的图像处理过程中使用。最后使用putimage(0, 0, Wide, Hight, &map, x, y) 将地址绘制到窗口上,其中要让玩家小球始终出现在窗口的中央位置,那么其中的x=player.x - (Wide / 2);y=player.y - (Hight / 2);但是单单这样写就会出现窗口越界的情况,所以我们还需要限制x和y的范围:

//防止窗口越界
if (x < 0)
{x = 0;
}
if (y < 0)
{y = 0;
}
if (x > Wide_map - Wide)
{x = Wide_map - Wide;
}
if (y > Hight_map - Hight)
{y = Hight_map - Hight;
}

putimage(0, 0, Wide, Hight, &map, x, y) 这个函数调用是用于在屏幕上的特定位置绘制或显示一个图像。下面是对这个函数调用中各个参数的具体解释:

  1. (0, 0):这是图像要绘制的目标位置的左上角坐标,即x=0和y=0,通常表示屏幕的左上角。

  2. Wide:这个参数指定了要绘制的图像的宽度。

  3. Hight:这个参数指定了要绘制的图像的高度。

  4. &map:这是一个指向图像内存地址的指针,该图像将被绘制到屏幕上。在这个上下文中,map可能是一个包含了图像数据的数据结构或数组。

  5. x:这个参数通常指定了要开始绘制图像的起始点的x坐标(在图像数据中)。

  6. y:这个参数通常指定了要开始绘制图像的起始点的y坐标(在图像数据中)。

6. ai小球的移动

随机生成0-3的数字分别代表ai小球上下左右的移动,这样小球就会自由移动了。当玩家小球与ai小球靠近时,ai小球会追击或者逃跑,这里我们需要先计算小球的之间的距离,小球之间的距离就是两小球的圆心坐标的x相减的平方加上y相减的平方再开根号。开根号的函数为sqrt,它的头文件是<math.h>。

//距离
int Distance(int x, int y, int x1, int y1)
{return sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
}

然后判断两小球的距离是否小于50个像素点,即判断是否小于玩家小球的半径 + ai小球的半径 + 50。判断完后比较两小球的半径大小,如果ai小球的半径大于玩家小球的半径,那么ai小球就要追击玩家小球,即ai小球的坐标需要靠近玩家小球的坐标,就是如果ai小球的x大于玩家小球的x那么ai小球的x就减小,同理可得剩下的操作。

void Enemy_move()
{srand((unsigned)time(NULL));for (int i = 0; i < Enemy_num; i++){int direction = rand() % 4;if (Distance(player.x, player.y, Enemy[i].x, Enemy[i].y) > player.r + Enemy[i].r + 50){if (direction == 0){if (Enemy[i].y > 0)//防止小球越界的判断语句{Enemy[i].y -= enemy_sleep;}}if (direction == 1){if (Enemy[i].y < Hight_map)Enemy[i].y += enemy_sleep;}if (direction == 2){if (Enemy[i].x > 0)Enemy[i].x -= enemy_sleep;}if (direction == 3){if (Enemy[i].x < Wide_map)Enemy[i].x += enemy_sleep;}}//敌人追击玩家if (Distance(player.x, player.y, Enemy[i].x, Enemy[i].y) < player.r + Enemy[i].r + 50){if (Enemy[i].r > player.r){if (Enemy[i].x < player.x){if (Enemy[i].x < Wide_map){Enemy[i].x += enemy_sleep;}}if (Enemy[i].x > player.x){if (Enemy[i].x > 0){Enemy[i].x -= enemy_sleep;}}if (Enemy[i].y < player.y){if (Enemy[i].y < Hight_map){Enemy[i].y += enemy_sleep;}}if (Enemy[i].y > player.y){if (Enemy[i].y > 0){Enemy[i].y -= enemy_sleep;}}}//敌人逃跑else{if (Enemy[i].x < player.x){if (Enemy[i].x > 0){Enemy[i].x -= enemy_sleep;}}if (Enemy[i].x > player.x){if (Enemy[i].x < Wide_map){Enemy[i].x += enemy_sleep;}}if (Enemy[i].y < player.y){if (Enemy[i].y > 0){Enemy[i].y -= enemy_sleep;}}if (Enemy[i].y > player.y){if (Enemy[i].y < Hight_map){Enemy[i].y += enemy_sleep;}}}}}
}

7. 小球之间的吞噬关系

玩家小球与ai小球、ai小球与ai小球:

当两小球的圆心小于最大的那个圆的半径时,小的那个球就会被吃掉。吃点就是那个小球重新找个位置生成。吃完后,吃的那个小球半径增加被吃小球半径的十分之一。

ai小球与食物小球、玩家小球与食物小球:同上。

void EatFood()
{for (int i = 0; i < Food_num; i++){//玩家吃食物if (Distance(player.x, player.y, Food[i].x, Food[i].y) < player.r){player.r += Food[i].r / 100;Food[i].x = rand() % Wide_map;Food[i].y = rand() % Hight_map;Food[i].r = rand() % 5 + 1;Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);}}for (int j = 0; j < Enemy_num; j++){//敌人吃食物for (int i = 0; i < Food_num; i++){if (Distance(Enemy[j].x, Enemy[j].y, Food[i].x, Food[i].y) < Enemy[j].r){Enemy[j].r += Food[i].r / 50;Food[i].x = rand() % Wide_map;Food[i].y = rand() % Hight_map;Food[i].r = rand() % 5 + 1;Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);}}//敌人吃敌人for (int i = 0; i < Enemy_num; i++){if (Distance(Enemy[j].x, Enemy[j].y, Enemy[i].x, Enemy[i].y) < Enemy[j].r&& Enemy[j].r > Enemy[i].r){Enemy[j].r += Enemy[i].r / 10;Enemy[i].x = rand() % Wide_map;Enemy[i].y = rand() % Hight_map;Enemy[i].r = 10;Enemy[i].color = RGB(0, 255, 0);}if (Distance(Enemy[j].x, Enemy[j].y, Enemy[i].x, Enemy[i].y) < Enemy[i].r && Enemy[j].r < Enemy[i].r){Enemy[i].r += Enemy[j].r / 10;Enemy[j].x = rand() % Wide_map;Enemy[j].y = rand() % Hight_map;Enemy[j].r = 10;Enemy[j].color = RGB(0, 255, 0);}}if (Distance(player.x, player.y, Enemy[j].x, Enemy[j].y) < player.r){//玩家吃敌人if (player.r > Enemy[j].r){player.r += Enemy[j].r / 10;Enemy[j].x = rand() % Wide_map;Enemy[j].y = rand() % Hight_map;Enemy[j].r = 10;Enemy[j].color = RGB(0, 255, 0);}//敌人吃玩家else{if (invincibility == 0){Enemy[j].r += player.r / 10;player.x = Wide / 2;player.y = Hight / 2;player.r = 10;invincibility = 10;}}}}
}

最终效果:

球球大作战

源码:

#include<stdio.h>
#include<easyx.h>
#include<time.h>
#include<math.h>
#define Wide 1024
#define Hight 640
#define Wide_map (Wide*5)
#define Hight_map (Hight*5)
#define Food_num 1888
#define Enemy_num 888
//整个游戏地图
IMAGE map(Wide_map, Hight_map);
//复活时的无敌时间
int invincibility = 10; 
//玩家速度
int player_sleep = 5;
int l = 5;
int enemy_sleep = 5;
struct Ball
{int x;int y;float r;DWORD color;
};
struct Ball player;
struct Ball Food[Food_num];
struct Ball Enemy[Enemy_num];
//初始化球的数据
void Inset()
{srand((unsigned)time(NULL));player.x = Wide / 2;player.y = Hight / 2;player.r = 10;for (int i = 0; i < Food_num; i++){Food[i].x = rand() % Wide_map;Food[i].y = rand() % Hight_map;Food[i].r = rand() % 5 + 1;Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);}for (int i = 0; i < Enemy_num; i++){Enemy[i].x = rand() % Wide_map;Enemy[i].y = rand() % Hight_map;Enemy[i].r = 10;Enemy[i].color = RGB(0,255,0);}}
//玩家操作
void Player_move()
{if (GetAsyncKeyState(VK_UP)){if (player.y > 0){player.y -= player_sleep;}}if (GetAsyncKeyState(VK_DOWN)){if (player.y < Hight_map)player.y += player_sleep;}if (GetAsyncKeyState(VK_LEFT)){if (player.x > 0)player.x -= player_sleep;}if (GetAsyncKeyState(VK_RIGHT)){if (player.x < Wide_map)player.x += player_sleep;}if (GetAsyncKeyState(0x20)){player_sleep = l + 5;}else{player_sleep = l;}
}
//距离
int Distance(int x, int y, int x1, int y1)
{return sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
}
//敌人移动
void Enemy_move()
{srand((unsigned)time(NULL));for (int i = 0; i < Enemy_num; i++){int direction = rand() % 400;if (Distance(player.x, player.y, Enemy[i].x, Enemy[i].y) > player.r + Enemy[i].r + 50){if (direction < 100){if (Enemy[i].y > 0){Enemy[i].y -= enemy_sleep;}}if (direction < 200 && direction >= 100){if (Enemy[i].y < Hight_map)Enemy[i].y += enemy_sleep;}if (direction < 300 && direction >= 200){if (Enemy[i].x > 0)Enemy[i].x -= enemy_sleep;}if (direction <400 && direction >= 300){if (Enemy[i].x < Wide_map)Enemy[i].x += enemy_sleep;}}//敌人追击玩家if (Distance(player.x, player.y, Enemy[i].x, Enemy[i].y) < player.r + Enemy[i].r + 50){if (Enemy[i].r > player.r){if (Enemy[i].x < player.x){if (Enemy[i].x < Wide_map){Enemy[i].x += enemy_sleep;}}if (Enemy[i].x > player.x){if (Enemy[i].x > 0){Enemy[i].x -= enemy_sleep;}}if (Enemy[i].y < player.y){if (Enemy[i].y < Hight_map){Enemy[i].y += enemy_sleep;}}if (Enemy[i].y > player.y){if (Enemy[i].y > 0){Enemy[i].y -= enemy_sleep;}}}//敌人逃跑else{if (Enemy[i].x < player.x){if (Enemy[i].x > 0){Enemy[i].x -= enemy_sleep;}}if (Enemy[i].x > player.x){if (Enemy[i].x < Wide_map){Enemy[i].x += enemy_sleep;}}if (Enemy[i].y < player.y){if (Enemy[i].y > 0){Enemy[i].y -= enemy_sleep;}}if (Enemy[i].y > player.y){if (Enemy[i].y < Hight_map){Enemy[i].y += enemy_sleep;}}}}//for (int j = 0; j < Enemy_num; j++)//{//	if (Distance(Enemy[j].x, Enemy[j].y, Enemy[i].x, Enemy[i].y) < Enemy[j].r + Enemy[i].r + 30)//	{//		//敌人追敌人//		if (Enemy[i].r > Enemy[j].r)//		{//			int sleep = rand() % 6;//			int enemy_sleep1;//			if (sleep > 2)//			{//				enemy_sleep1 = enemy_sleep;//			}//			else//			{//				enemy_sleep1 = enemy_sleep + 5;//			}//			if (Enemy[i].x < Enemy[j].x)//			{//				if (Enemy[i].x < Wide_map)//				{//					Enemy[i].x += enemy_sleep1;//				}//			}//			if (Enemy[i].x > Enemy[j].x)//			{//				if (Enemy[i].x > 0)//				{//					Enemy[i].x -= enemy_sleep1;//				}//			}//			if (Enemy[i].y < Enemy[j].y)//			{//				if (Enemy[i].y < Hight_map)//				{//					Enemy[i].y += enemy_sleep1;//				}//			}//			if (Enemy[i].y > Enemy[j].y)//			{//				if (Enemy[i].y > 0)//				{//					Enemy[i].y -= enemy_sleep1;//				}//			}//		}//		//逃跑//		else//		{//			int sleep = rand() % 6;//			int enemy_sleep1;//			if (sleep > 2)//			{//				enemy_sleep1 = enemy_sleep;//			}//			else//			{//				enemy_sleep1 = enemy_sleep + 5;//			}//			if (Enemy[i].x < Enemy[j].x)//			{//				if (Enemy[i].x > 0)//				{//					Enemy[i].x -= enemy_sleep1;//				}//			}//			if (Enemy[i].x > Enemy[j].x)//			{//				if (Enemy[i].x < Wide_map)//				{//					Enemy[i].x += enemy_sleep1;//				}//			}//			if (Enemy[i].y < Enemy[j].y)//			{//				if (Enemy[i].y > 0)//				{//					Enemy[i].y -= enemy_sleep1;//				}//			}//			if (Enemy[i].y > Enemy[j].y)//			{//				if (Enemy[i].y < Hight_map)//				{//					Enemy[i].y += enemy_sleep1;//				}//			}//		}//	}//}}
}//吃食物
void EatFood()
{for (int i = 0; i < Food_num; i++){//玩家吃食物if (Distance(player.x, player.y, Food[i].x, Food[i].y) < player.r){player.r += Food[i].r / 100;Food[i].x = rand() % Wide_map;Food[i].y = rand() % Hight_map;Food[i].r = rand() % 5 + 1;Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);}}for (int j = 0; j < Enemy_num; j++){//敌人吃食物for (int i = 0; i < Food_num; i++){if (Distance(Enemy[j].x, Enemy[j].y, Food[i].x, Food[i].y) < Enemy[j].r){Enemy[j].r += Food[i].r / 50;Food[i].x = rand() % Wide_map;Food[i].y = rand() % Hight_map;Food[i].r = rand() % 5 + 1;Food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);}}//敌人吃敌人for (int i = 0; i < Enemy_num; i++){if (Distance(Enemy[j].x, Enemy[j].y, Enemy[i].x, Enemy[i].y) < Enemy[j].r&& Enemy[j].r > Enemy[i].r){Enemy[j].r += Enemy[i].r / 10;Enemy[i].x = rand() % Wide_map;Enemy[i].y = rand() % Hight_map;Enemy[i].r = 10;Enemy[i].color = RGB(0, 255, 0);}if (Distance(Enemy[j].x, Enemy[j].y, Enemy[i].x, Enemy[i].y) < Enemy[i].r && Enemy[j].r < Enemy[i].r){Enemy[i].r += Enemy[j].r / 10;Enemy[j].x = rand() % Wide_map;Enemy[j].y = rand() % Hight_map;Enemy[j].r = 10;Enemy[j].color = RGB(0, 255, 0);}}if (Distance(player.x, player.y, Enemy[j].x, Enemy[j].y) < player.r){//玩家吃敌人if (player.r > Enemy[j].r){player.r += Enemy[j].r / 10;Enemy[j].x = rand() % Wide_map;Enemy[j].y = rand() % Hight_map;Enemy[j].r = 10;Enemy[j].color = RGB(0, 255, 0);}//敌人吃玩家else{if (invincibility == 0){Enemy[j].r += player.r / 10;player.x = Wide / 2;player.y = Hight / 2;player.r = 10;invincibility = 10;}}}}
}
//显示
void Show()
{//设置地图SetWorkingImage(&map);//清屏cleardevice();//背景颜色setbkcolor(WHITE);//划线颜色setlinecolor(RGB(230,231,239));//划线for (int i = 0; i < Wide_map; i += 10){line(i, 0, i, Hight_map);}for (int i = 0; i < Hight_map; i += 10){line(0, i, Wide_map, i);}//食物for (int i = 0; i < Food_num; i++){setfillcolor(Food[i].color);solidcircle(Food[i].x, Food[i].y, Food[i].r);}//敌人for (int i = 0; i < Enemy_num; i++){setfillcolor(Enemy[i].color);solidcircle(Enemy[i].x, Enemy[i].y, Enemy[i].r);}//玩家setfillcolor(RED);solidcircle(player.x, player.y, player.r);SetWorkingImage();int x = player.x - (Wide / 2);int y = player.y - (Hight / 2);//防止窗口越界if (x < 0){x = 0;}if (y < 0){y = 0;}if (x > Wide_map - Wide){x = Wide_map - Wide;}if (y > Hight_map - Hight){y = Hight_map - Hight;}//把map输出到窗口上putimage(0, 0, Wide, Hight, &map, x, y);
}
int main()
{initgraph(Wide, Hight);Inset();//缓冲BeginBatchDraw();while (1){if (invincibility > 0)invincibility--;Show();//玩家操作Player_move();Enemy_move();EatFood();//刷新FlushBatchDraw();}closegraph();return 0;
}

相关文章:

(C语言)球球大作战

前言&#xff1a; 这款简易版的球球大作战是一款单人游戏&#xff0c;玩家需要控制一个小球在地图上移动&#xff0c;吞噬其他小球来增大自己的体积。本游戏使用C语言和easyx图形库编写&#xff0c;旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代码之前&#xf…...

高级数据结构 <AVL树>

本文已收录至《数据结构(C/C语言)》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言正文AVL树的性质AVL树的定义AVL树的插入函数左单旋右单旋右左双旋左右双旋 检验AVL树的合法性关于AVL树 最后 前言 前面我们学习了二叉树&#xff0c;普通的二叉树没有任何特殊性质&…...

在springboot中利用Redis实现延迟队列

文章目录 前言一、基本思路二、springboot实现案例三、测试总结 前言 在开发过程中&#xff0c;有很多场景都需要用到延迟队列来解决。目前支持延迟队列的中间件也不少&#xff0c;特别是基于JMS模式下的消息中间件基本上都支持延迟队列。但是有时我们项目规模可能比较小&…...

UpGrow评论:AI能将我的Instagram粉丝数增加10倍吗?

UpGrow Review: Can AI Grow My Instagram Followers 10X? 概述 UpGrow是一款专注于Instagram增长的AI驱动型社交媒体工具。它通过其庞大的300多人的网络&#xff0c;先进的定位功能&#xff0c;实时分析以及卓越的客户服务&#xff0c;帮助用户有机地增长Instagram关注者。…...

申请软著提交的演示视频有什么要求

申请软件著作权时&#xff0c;演示视频是一个重要的材料&#xff0c;主要用于展示软件的功能和操作流程。演示视频的要求可能会根据不同的申请机构和项目有所不同&#xff0c;但一般来说&#xff0c;以下是几个常见的要求&#xff1a; 内容完整性&#xff1a;演示视频需要展示…...

mac【启动elasticsearch报错:can not run elasticsearch as root

mac【启动elasticsearch报错&#xff1a;can not run elasticsearch as root 问题原因 es默认不能用root用户启动&#xff0c;生产环境建议为elasticsearch创建用户。 解决方案 为elaticsearch创建用户并赋予相应权限。 尝试了以下命令创建用户&#xff0c;adduser esh 和u…...

面试算法-65-二叉树的层平均值

题目 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[3.00000,14.50000,11.00000] 解释&#xff1a;第 0 层的…...

Linux: boot: latency启动延迟分析

https://elinux.org/images/6/64/Chris-simmonds-boot-time-elce-2017_0.pdf https://www.hcltech.com/sites/default/files/documents/resources/whitepaper/files/an_insight_to_optimize_embedded_linux_boot_time_performance.pdf 无意看到这个启动延迟分析&#xff0c;虽…...

QT界面制作

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowFlag(Qt::FramelessWindowHint);//接收动图QMovie *mv new QMovie(":/pictrue/th.gif…...

进阶二叉树

目录 二叉树 二叉搜索树 二叉搜索树的定义 二叉搜索树的操作 哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 哈夫曼树的性质 平衡二叉树 平衡二叉树的定义&#xff1a; 平衡二叉树的插入调整 1.LL插入/LL旋转 2.RR插入/RR旋转 3.LR插入/LR旋转 4.RL插入/RL旋转 二叉树…...

无人机拦截

配置yolo CUDA报错 nvcc fatal : Unsupported gpu architecture compute_30.&#xff08;1&#xff09;查看显卡匹配型号&#xff1a;https://blog.csdn.net/u013308762/article/details/121658823 &#xff08;2&#xff09;查看显卡&#xff1a;nvidia-smi -a 》NVIDIA GeF…...

CSDN 编辑器设置图片缩放和居中

CSDN 编辑器设置图片缩放和居中 文章目录 CSDN 编辑器设置图片缩放和居中对齐方式比例缩放 对齐方式 Markdown 编辑器插入图片的代码格式为 ![图片描述](图片路径)CSDN 的 Markdown 编辑器中插入图片&#xff0c;默认都是左对齐&#xff0c;需要设置居中对齐的话&#xff0c;…...

有哪些工具可以替代Gitbook?这篇文章告诉你

你是否曾经在搜索在线文档创建和共享工具时&#xff0c;遇到了Gitbook? Gitbook 是一个相当出色的工具&#xff0c;具有强大的编辑和发布功能&#xff0c;但也有其不足之处&#xff0c;如使用起来有一定的技术要求&#xff0c;入门门槛较高等。如果你正在寻找Gitbook的替代品&…...

小迪安全43WEB 攻防-通用漏洞任意文件下载删除重装敏感读取黑白审计

#知识点&#xff1a; 1、文件操作类安全问题 2、文件下载&删除&读取 3、白盒&黑盒&探针分析 #详细点&#xff1a; 文件读取&#xff1a;基本和文件下载利用类似 文件下载&#xff1a;利用下载获取源码或数据库配置文件及系统敏感文件为后续出思路 …...

大模型提示学习样本量有玄机,自适应调节方法好

引言&#xff1a;探索文本分类中的个性化示例数量 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;预测模型已经从零开始训练演变为使用标记数据对预训练模型进行微调。这种微调的极端形式涉及到上下文学习&#xff08;In-Context Learning, ICL&#xff09;&…...

Redis监控工具

Redis 是一种 NoSQL 数据库系统&#xff0c;以其速度、性能和灵活的数据结构而闻名。Redis 在许多领域都表现出色&#xff0c;包括缓存、会话管理、游戏、排行榜、实时分析、地理空间、叫车、聊天/消息、媒体流和发布/订阅应用程序。Redis 数据集完全存储在内存中&#xff0c;这…...

低代码表单设计器为企业数字转型强劲赋能!

想要实现数字化转型&#xff0c;创造流程化办公&#xff0c;让企业在信息高速发展的社会中抢占更多市场份额&#xff0c;进一步提升市场竞争力&#xff0c;就需要借助专业的软件平台提高效率。低代码开发平台拥有易操作、灵活、可视化的发展优势&#xff0c;作为一种新型的应用…...

【C#】Conventions(惯例)最佳实践和准则

在C#中,Conventions(惯例)是指编写代码时的一套最佳实践和准则。这些惯例旨在提高代码的可读性、一致性和可维护性。虽然这些惯例不是语言的强制规则,但遵循它们可以使你的代码更加清晰和专业。 以下是一些常见的C#编码惯例: 命名约定: 使用有意义的、描述性的名称。类名和公…...

vue3中使用cesium

vue3中使用cesium Cesium是一个开源的JavaScript库&#xff0c;专门用于创建3D地球和2D地图的Web应用程序。它提供了丰富的功能和工具&#xff0c;使得开发人员能够轻松地构建出高质量的地理空间可视化应用。 1. 安装cesium包 npm install cesium2. 复制node_modules中的Ces…...

arduino ide 开发esp8266注意事项

1.引脚序列号必须是常量来定义&#xff0c;否则会无限重启。 #define p2 2 const int Pin2p2; pinMode(Pin2, OUTPUT); 2.关于wifi的模式&#xff0c;ap,sta&#xff0c;apsta三种模式的初始化必须放在void set_up(){}这个函数里&#xff0c;不能额外搞个自定义函数&#xf…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...