【c语言】飞机大战(1)

news2025/4/14 12:04:29

提前准备好游戏要的素材,可以到爱给网去找,飞机大战我们需要的是一个我方战机图片,一个背景图,三个敌方战机的图,我方战机的图片,敌方战机的图片,并且将图片和.cpp放在同一文件夹下.
在这里插入图片描述
这里创建.cpp的文件是因为要用到图形库,所以创建.cpp的文件,然后图片格式都是png

1.我方飞机和背景图片的加载和贴图

#include<stdio.h>
#include <graphics.h>//图形库头文件
#define HEIGHT  503
#define WIDTH 700
IMAGE img_bk, img_plane;//定义背景图片,玩家的类




int main()
{
	initgraph(WIDTH, HEIGHT);//初始化游戏的背景
	loadimage(&img_bk, "./back.png");//加载游戏背景图
	loadimage(&img_plane, "./1.png");//加载游戏玩家图片
	putimage(0, 0, &img_bk);//贴游戏背景图
	putimage(200,200, &img_plane);//贴玩家战机的图片


	getchar();//防止窗口闪退









}

背景图片是503*700,背景图片大小自己设置,为了让游戏体验感增强,如果铺满整个屏幕的话,会不好移动.
在这里插入图片描述

2.去掉飞机背后的黑色背景,使用一个算法函数

#include<stdio.h>
#include <graphics.h>
#define HEIGHT  503
#define WIDTH 700
IMAGE img_bk, img_plane;
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里的R
			int sg = ((src[srcX] & 0xff00) >> 8);   //G
			int sb = src[srcX] & 0xff;              //B
			if (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
				}
			}
		}
	}
}



int main()
{
	initgraph(WIDTH, HEIGHT);
	loadimage(&img_bk, "./back.png");
	loadimage(&img_plane, "./1.png");

	putimage(0, 0, &img_bk);//贴背景前两个为图片左上角要贴在窗口的坐标
	drawAlpha(&img_plane, 200, 200);//贴飞机图片


	getchar();









}

这个函数我看不懂,是在网上搜的,我来解释一下三个参数,第一个是图片的地址,第二个参数,第三个参数的坐标是图片左上角从窗口的哪个位置贴,背景肯定是从窗口的左上角贴.
在这里插入图片描述
在这里插入图片描述
注意:使用这个函数在飞机移动屏幕过程中,会出现异常,不知道怎么解决,希望有大佬可以帮帮我,drawAlpha区别putimage可以把背景变透明

3.静态显示所有素材图片

#include<stdio.h>
#include <graphics.h>
#define HEIGHT  503
#define WIDTH 700
IMAGE img_bk, img_plane, img_a, img_b, img_c,img_abullet,img_bbullet,img_cbullet,img_planebullet;
struct aircraft 
{
	int x, y;







};
aircraft plane, a, b, c;
void datainit()
{
	plane = { 150,150 };
	a = { 0,0 };
	b = { 300,0 };
	c = { 450,0 };












}
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里的R
			int sg = ((src[srcX] & 0xff00) >> 8);   //G
			int sb = src[srcX] & 0xff;              //B
			if (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);
	drawAlpha(&img_plane,plane.x,plane.y);
	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);




}


int main()
{
	initgraph(WIDTH, HEIGHT);
	datainit();
	load();
	draw();

	


	getchar();









}

定义3个敌方战机,a,b,c,3个敌机的子弹abullet,bbullet,cbullet,我方战机的子弹planebullet
IMAGE img_a, img_b, img_c,img_abullet,img_bbullet,img_cbullet,img_planebullet;
定义一个结构体记录每个图片左上角要贴在窗口的坐标.四个结构体表示我方战机,3个敌方战机在窗口上的坐标,图中的初始化只是为了让图片不重叠而已。
将加载图片的函数统一放在load函数里面,将贴图片的函数放在draw中.
在这里插入图片描述

4.我方飞机的移动

void player_move(int speed) //处理飞机移动
{

	if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W'))
	{
		if (plane.y > 0)
			plane.y -= speed;
	}
	if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S'))
	{
		if (plane.y + 126< 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;
	}
}

这个移动函数在之前游戏里用了好多次,这里就不强调了.函数中的speed参数是我方战机的速度,每按一次会移动几个像素.这里的重点放在飞机边界的判断上,记得加双缓冲,要不然,屏幕会闪
在这里插入图片描述

在这里插入图片描述

边界的判断以及飞机的移动

	if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S'))
	{
		if (plane.y + 126< HEIGHT)
			plane.y += speed;
	}

这里加126是为了不让程序出现异常,如果正常的话应该加51,因为我方战机图片大小是51*51;如果是51的话会出现如下视频的错误,不知道为什么,请看vcr

5.敌方战机的移动

首先我们要修改一下飞机结构体的变量

struct aircraft
{
	int x, y;
	int width;//敌机图片的宽度
	int height;//敌机图片的高度
	int speed;//敌机的速度
	int bornflag;//敌机在窗口里面置0,在外面置1

};

然后修改一下初始话敌机的属性.

void datainit()
{
	plane = { 150,150 };
	//a = { 0,0 };
	/*b = { 300,0 };*/
	/*c = { 450,0 };*/
	a.speed = 1;//a敌机的速度
	a.bornflag = 1;//a敌机是否存在
	b.bornflag = 1;
	c.bornflag = 1;
	a.width = 100;//a敌机的宽度
	a.height = 100;//a敌机的高度
	b.speed = 1;
	b.width = 80;
	b.height = 100;
	c.height = 70;
	c.width = 70;
	c.speed = 3;











}

敌机a的移动

敌机a的移动

如视频所示,对应的代码实现是

void ufoamove()
{
	static int dir1 = 1;


	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;
	}













}

定义一个静态变量dir,dir为1的话,表示敌机前进,dir为0,敌机后退。因为是static,所以只有第一次初始化时候是1,别的时候不执行第一句.当敌机a没在窗口里面,说明a.bornflag == 1,就将a.bornflag 置为0,敌机a要出现了,随机数生成敌机a要出现的左右方向哪个地方,y=-50;是为了初始化的时候隐藏飞机.当敌机a前进200个像素时,dir置0,让敌机a后退.当敌机向上退出屏幕50个像素时,重新dir=1;敌机向前.此时会出现在另一个位置。在主函数中加入产生随机种子函数

srand(time(NULL));

包含头文件

#include<time.h>
#include<stdlib.h>

敌机出屏幕,drawAlpha这个函数会出错,所以我们把draw中的drawAlpha都改成putimage,这样黑框框又出现了,(电子叹气)

void draw()
{
	putimage(0, 0, &img_bk);
	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, 0 ,&img_abullet );
		putimage(400, 50 ,&img_bbullet);
		putimage(400, 100 ,&img_cbullet );
		putimage(400, 150, &img_planebullet );




}

敌机b的移动

请看vcr

敌机b的移动

对应代码

void ufobmove()
{
	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;


	}








}

由视频可知敌机b的移动规律是在左右移动的同时还向前移动,step如果为正,向右移动,step如果为负,表示向左移动,如果b战机没有出现在窗口内(b.bornflag == 1),将b.bornflag 置0,表示要出现,随机数生成b战机的坐标.y=-b.height;初始化先隐藏起来.如果b战机到了左右边界,step=-step;
就向相反的方向移动了,左右移动实质是在给b.x±step;然后y++,b战机在左右移动的过程中,一直往前走.当b战机出了下边界,b.bornflag = 1;表示b战机出了窗口.

敌机c的移动

请看vcr

敌机c的移动

对应的代码为

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;

	}






}

这个c战机是要撞向我方飞机,tmpx,tmpy存放的是c战机的临时的位置,刚生成时,当然是他出生点的坐标,disx是c战机刚出来x方向上与当时我方战机x方向上的距离,同理另一个.step是,假如c.speed的速度为5的话,step==200,就是说将x方向上的距离分为200份,vx就是每一份的距离是多少像素,这里强制类型转化,c.x,c.y是整数,因为vx,vy不清楚,所以+0.5,四舍五入一下就是整数了.如果在左,右,下方向超出了,就c.bornflag = 1;离开窗口了.

6.整体代码展示

#include<stdio.h>
#include <graphics.h>
//#include<conio.h>//_getch();
#define HEIGHT  503
#define WIDTH 700
IMAGE img_bk, img_plane, img_a, img_b, img_c, img_abullet, img_bbullet, img_cbullet, img_planebullet;
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;











}
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里的R
			int sg = ((src[srcX] & 0xff00) >> 8);   //G
			int sb = src[srcX] & 0xff;              //B
			if (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);
	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, 0 ,&img_abullet );
		putimage(400, 50 ,&img_bbullet);
		putimage(400, 100 ,&img_cbullet );
		putimage(400, 150, &img_planebullet );




}
void player_move(int speed) //处理飞机移动
{

	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;
	}
}
void ufoamove()
{
	static int dir1 = 1;


	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;
	}













}
void ufobmove()
{
	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;


	}








}
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;

	}






}

int main()
{
	initgraph(WIDTH, HEIGHT);
	BeginBatchDraw();
	datainit();
	while (1)
	{
		load();
		draw();
		ufoamove();
		ufobmove();
		ufocmove();
		player_move(5);
		FlushBatchDraw();
	}
	EndBatchDraw();


	getchar();









}

7.剩下实现放在下一篇啦

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【nodejs】Express概念与使用介绍

Express Express是基于Node.js平台&#xff0c;从内置模块http封装出来的第三方模块&#xff0c;可以更方便的开发Web服务器。 中文官网&#xff1a; http://www.expressjs.com.cn/ 一、基本使用 // 导入express const express require(express) // 创建web服务器 const a…

Linux驱动开发简易流程

推荐视频&#xff1a; 正点原子【第四期】手把手教你学 Linux之驱动开发篇 小智-学长嵌入式Linux&Android底层开发入门教程 能力矩阵 基础能力矩阵 熟悉c/c、熟悉数据结构 熟悉linux系统&#xff0c;Shell脚本&#xff0c;Makefile/cmake/mk 文件IO、多线程、竞争、并发…

selenium模块有哪些用途?

Selenium模块是一个用于Web应用程序测试的模块&#xff0c;具有多种示例用法。以下是一些示例&#xff1a; 1.打开网页并执行一些基本操作&#xff0c;如点击按钮、输入文本等。 定位网页元素并执行操作&#xff0c;例如使用 find_element 方法查找单个元素&#xff0c;使用 f…

关于Omlox定位标准(一)——omlox hub

关于Omlox定位标准 Omlox是世界上第一个开放的定位标准&#xff0c;旨在实现灵活的实时定位解决方案&#xff0c;&#xff0c;可以使用来自各个制造商的单元。“omlox"一词源自拉丁词汇"omni”&#xff08;无处不在&#xff09;和"locus"&#xff08;位置…

磁盘阵列raid

一、服务器硬件 cpu 、 主板 、内存、硬盘、网卡、电源、raid卡、风扇、远程管理卡 二、硬盘尺寸 目前生产环境中主流的两种类型硬盘 3.5寸 和 2.5寸 硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器&#xff0c;但是3.5寸没法转换成2.5寸 1.如何在服务器上…

JavaEE - 网络编程之回显服务器

目录 一.什么是回显服务器&#xff1f; 二.UDP是什么&#xff1f; 1.TCP 是有链接的&#xff0c; UDP 是无连接的 2.TCP是可靠传输的,UDP是不可靠传输的 3.TCP是面向字节流的&#xff0c;UDP是面向数据报 4.TCP和UDP是全双工的 三.UDP的 socket api 四. 具体代码实现 …

PPT录制视频的方法,轻松提升演示效果!

在现代工作和学习中&#xff0c;ppt是一种常见的演示工具&#xff0c;而将ppt转化为视频形式更能方便分享和传播。本文将介绍两种ppt录制视频的方法&#xff0c;每一种方法都将有详细的步骤和简要的介绍&#xff0c;通过这些方法&#xff0c;你可以轻松将ppt制作成视频&#xf…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《面向平稳氢气需求的综合制氢系统鲁棒优化配置方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主的专栏栏目《论文与完整程序》 这个标题涉及到针对平稳氢气需求的综合制氢系统鲁棒优化配置方法。让我们逐步解读这个标题的关键要素&#xff1a; 面向平稳氢气需求&#xff1a; 这部分指…

【Spark精讲】一文讲透SparkSQL聚合过程以及UDAF开发

SparkSQL聚合过程 这里的 Partial 方式表示聚合函数的模式&#xff0c;能够支持预先局部聚合&#xff0c;这方面的内容会在下一节详细介绍。 对应实例中的聚合语句&#xff0c;因为 count 函数支持 Partial 方式&#xff0c;因此调用的是 planAggregateWithoutDistinct 方法&a…

Nacos注册

一、简介 Nacos是阿里云开源的一个服务发现、配置管理和服务鉴权平台&#xff0c;它提供了一种更简单、更便捷、更开放的方式来管理服务&#xff0c;帮助开发者快速实现服务的发现、配置的管理、服务的鉴权等功能。Nacos可以帮助开发者轻松管理微服务应用中的服务提供者、服务…

Ubuntu22.04系统安装软件、显卡驱动、cuda、cudnn、pytorch

Ubuntu22.04系统安装软件、显卡驱动、cuda、cudnn、pytorch 安装 Nvidia 显卡驱动安装 CUDA安装 cuDNN安装 VSCode安装 Anaconda 并更换源在虚拟环境中安装 GPU 版本的 PyTorchReference 这篇博文主要介绍的是 Ubuntu22.04 系统中软件、显卡驱动、cuda、cudnn、pytorch 等软件和…

系统启动流程 - 理解modules加载流程

​编辑 Hacker_Albert    202 linux 启动流程module加载 1.启动过程分为三个部分 BIOS 上电自检&#xff08;POST&#xff09;引导装载程序 (GRUB2)内核初始化启动 systemd&#xff0c;其是所有进程之父。 1.1.BIOS 上电自检&#xff08;POST&#xff09; BIOS stands for…

杰发科技AC7840——EEPROM初探

0.序 7840和7801的模拟EEPROM使用不太一样 1.现象 按照官方Demo&#xff0c;在这样的配置下&#xff0c;我们看到存储是这样的&#xff08;连续三个数字1 2 3&#xff09;。 使用串口工具的多帧发送功能 看不出多少规律 修改代码后 发现如下规律&#xff1a; 前四个字节是…

VSCode中的注释标签

2023年12月30日&#xff0c;周六上午 在软件开发中&#xff0c;开发者会使用这些标签来提供关于代码功能、版本信息、作者、API使用说明等方面的额外信息。 这些标签的含义通常是&#xff1a; apiNote: 提供有关API使用的注释或说明。author: 标识代码作者的信息。category: …

【 ATU NXP-SBC 系列 】FS26XX GUI_OTP烧录与模拟操作

1. 概述 FS26XX 为了其安全性需求&#xff0c;针对重要暂存器的配置&#xff0c;使用 one time program 的功能&#xff0c;避免不小心修改重要暂存器&#xff0c;导致发生重大意外&#xff0c;使系统丧失功能安全性。FS26XX 也可以让使用者先测试 OTP 后的结果功能&#xff0…

Python:将print内容写入文件

简介&#xff1a;print函数是Python中使用频率非常非常高的函数&#xff0c;其包含四个参数&#xff1a;sep、end、file、flush。 历史攻略&#xff1a; Python基础&#xff1a;输入、输出 Python&#xff1a;将控制台输出保存成文件 参数解析&#xff1a; print()函数可以…

简单了解SQL堆叠注入与二次注入(基于sqllabs演示)

1、堆叠注入 使用分号 ; 成堆的执行sql语句 以sqllabs-less-38为例 ?id1 简单测试发现闭合点为单引号 ?id1 order by 3 ?id1 order by 4使用order by探测发现只有三列&#xff08;字段数&#xff09; 尝试简单的联合注入查询 ?id-1 union select 1,database(),user()-…

爬虫工作量由小到大的思维转变---<第三十五章 Scrapy 的scrapyd+Gerapy 部署爬虫项目>

前言: 项目框架没有问题大家布好了的话,接着我们就开始部署scrapy项目(没搭好架子的话,看我上文爬虫工作量由小到大的思维转变---&#xff1c;第三十四章 Scrapy 的部署scrapydGerapy&#xff1e;-CSDN博客) 正文: 1.创建主机: 首先gerapy的架子,就相当于部署服务器上的;所以…

[mysql 基于C++实现数据库连接池 连接池的使用] 持续更新中

目背景 常见的MySQL、Oracle、SQLServer等数据库都是基于C/S架构设计的&#xff0c;即&#xff08;客户端/服务器&#xff09;架构&#xff0c;也就是说我们对数据库的操作相当于一个客户端&#xff0c;这个客户端使用既定的API把SQL语句通过网络发送给服务器端&#xff0c;MyS…

【Bootstrap学习 day4】

Bootstrap5 列表组 使用Bootstrap创建列表 可以创建三种不类型的HTML列表&#xff1a; 无序列表—顺序无关紧要的项目列表。无序列表中的列表标有项目符号&#xff0c;例如。、等ul>li有序列表—顺序确实很重要的项目列表。有序列表中的列表项用数字标记&#xff0c;例如1、…