c语言游戏实战(10):坤坤的篮球回避秀

  前言:

这款简易版的球球大作战是博主耗时两天半完成的,玩家需要控制坤坤在游戏界面上移动,来躲避游戏界面上方不断掉下来的篮球。本游戏使用C语言和easyx图形库编写,旨在帮助初学者了解游戏开发的基本概念和技巧。

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

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

坤坤:玩家控制的坤坤可以在游戏界面内自由移动,按下特定的按键后可以跳跃。

篮球:篮球在游戏界面的正上方源源不断地生成,并下降。

坤坤触碰篮球:当坤坤触碰到上方掉下来的篮球时,坤坤的血量就会降低一格,一共五格血量降完为止。

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

1. 初始化游戏界面和模型的信息。

2. 处理键盘输入,实现玩家控制坤坤的移动和跳跃。

3. 生成足够数量的篮球。

4. 生成篮球,并控制其移动。

5. 检测篮球与坤坤之间的触碰关系,并减少相应的血量。

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

1. 前期准备

第一步:我们需要在easyx官网下载好easyx图形库。(具体操作可以去b站搜索相关视频)

第二步:按照下图的步骤将字符集改为多节字符集,因为如果使用的字符集只包含有限数量的字符,可能无法支持所有需要的字符,导致无法正确加载图像。因此,将字符集改为多字符集可以确保包含所有可能需要的字符,从而避免加载图像时出现错误或乱码问题。

2. 游戏的背景设置

游戏界面的长和宽根据背景图片的长宽(右键点击图片的属性可以查看)来设置,这里的背景图片有两张一张是游戏界面,另一张是游戏结束的图片。这里首先需要声明一个IMAGE类型的变量来存储加载的图片数据。这是后续对图片进行处理的基础,利用函数loadimage可以从本地文件中加载图片(尽量将游戏所需要的素材放在和代码的同一个目录里),最后利用putimage可以将图片绘制到窗口上来。

int main()
{
	Init();
	Itset();
    //设置窗口的长宽
	initgraph(Wide, Hight);
    //缓冲
	BeginBatchDraw();
	while (1)
	{
		show();
        //刷新
		FlushBatchDraw();
	}
	closegraph;
	return 0;
}
//声明IMAGE类型的变量
IMAGE img[2];
//加载图片
loadimage(&img[0], "resource/微信图片_20240222202456.jpg");
loadimage(&img[1], "resource/微信图片_20240303132408.jpg");
//绘制图片
putimage(0, 0, &img[Img]);

3. 初始模型的信息

在这里篮球和坤坤的模型都是球,只是后面用图片覆盖而已。首先在游戏游戏界面的正上方生成多个球(具体数量自己定),然后在游戏的下方生成一个玩家控制的球,最后就是加载图片了。

初始化小球 

void Itset()
{
	//
	for (int i = 0; i < Ball_num; i++)
	{
		Enemy[i].x = Wide / 2;
		Enemy[i].y = 10;
		Enemy[i].r = 10;
	}
	//玩家
	Player.x = Wide / 2;
	Player.r = 10;
	Player.y = Hight - Player.r * 4;
}

加载图片

因为loadimage函数只能加载图片,加载不了视频或者动图,所以我们需要将视频一帧一帧的加载上去,然后用循环绘制图片,这样就产生了一个动图的效果。

IMAGE kunkun[58];
IMAGE ball[Ball_num];
	loadimage(&kunkun[0], "resource/2月22日.png", 34, 34);
	loadimage(&kunkun[1], "resource/2月22日(1).png", 34, 34);
	loadimage(&kunkun[2], "resource/2月22日(2).png", 34, 34);
	loadimage(&kunkun[3], "resource/2月22日(3).png", 34, 34);
	loadimage(&kunkun[4], "resource/2月22日(4).png", 34, 34);
	loadimage(&kunkun[5], "resource/2月22日(5).png", 34, 34);
	loadimage(&kunkun[6], "resource/2月22日(6).png", 34, 34);
	loadimage(&kunkun[7], "resource/2月22日(7).png", 34, 34);
	loadimage(&kunkun[8], "resource/2月22日(8).png", 34, 34);
	loadimage(&kunkun[9], "resource/2月22日(9).png", 34, 34);
	loadimage(&kunkun[10], "resource/2月22日(10).png", 34, 34);
	loadimage(&kunkun[11], "resource/2月22日(11).png", 34, 34);
	loadimage(&kunkun[12], "resource/2月22日(12).png", 34, 34);
	loadimage(&kunkun[13], "resource/2月22日(13).png", 34, 34);
	loadimage(&kunkun[14], "resource/2月22日(14).png", 34, 34);
	loadimage(&kunkun[15], "resource/2月22日(15).png", 34, 34);
	loadimage(&kunkun[16], "resource/2月22日(16).png", 34, 34);
	loadimage(&kunkun[17], "resource/2月22日(17).png", 34, 34);
	loadimage(&kunkun[18], "resource/2月22日(18).png", 34, 34);
	loadimage(&kunkun[19], "resource/2月22日(19).png", 34, 34);
	loadimage(&kunkun[20], "resource/2月22日(20).png", 34, 34);
	loadimage(&kunkun[21], "resource/2月22日(21).png", 34, 34);
	loadimage(&kunkun[22], "resource/2月22日(22).png", 34, 34);
	loadimage(&kunkun[23], "resource/2月22日(23).png", 34, 34);
	loadimage(&kunkun[24], "resource/2月22日(24).png", 34, 34);
	loadimage(&kunkun[25], "resource/2月22日(25).png", 34, 34);
	loadimage(&kunkun[26], "resource/2月22日(26).png", 34, 34);
	loadimage(&kunkun[27], "resource/2月22日(27).png", 34, 34);
	loadimage(&kunkun[28], "resource/2月22日(28).png", 34, 34);
	loadimage(&kunkun[29], "resource/2月22日(29).png", 34, 34);
	loadimage(&kunkun[30], "resource/2月22日(30).png", 34, 34);
	loadimage(&kunkun[31], "resource/2月22日(31).png", 34, 34);
	loadimage(&kunkun[32], "resource/2月22日(32).png", 34, 34);
	loadimage(&kunkun[33], "resource/2月22日(33).png", 34, 34);
	loadimage(&kunkun[34], "resource/2月22日(34).png", 34, 34);
	loadimage(&kunkun[35], "resource/2月22日(35).png", 34, 34);
	loadimage(&kunkun[36], "resource/2月22日(36).png", 34, 34);
	loadimage(&kunkun[37], "resource/2月22日(37).png", 34, 34);
	loadimage(&kunkun[38], "resource/2月22日(38).png", 34, 34);
	loadimage(&kunkun[39], "resource/2月22日(39).png", 34, 34);
	loadimage(&kunkun[40], "resource/2月22日(40).png", 34, 34);
	loadimage(&kunkun[41], "resource/2月22日(41).png", 34, 34);
	loadimage(&kunkun[42], "resource/2月22日(42).png", 34, 34);
	loadimage(&kunkun[43], "resource/2月22日(43).png", 34, 34);
	loadimage(&kunkun[44], "resource/2月22日(44).png", 34, 34);
	loadimage(&kunkun[45], "resource/2月22日(45).png", 34, 34);
	loadimage(&kunkun[46], "resource/2月22日(46).png", 34, 34);
	loadimage(&kunkun[47], "resource/2月22日(47).png", 34, 34);
	loadimage(&kunkun[48], "resource/2月22日(48).png", 34, 34);
	loadimage(&kunkun[49], "resource/2月22日(49).png", 34, 34);
	loadimage(&kunkun[50], "resource/2月22日(50).png", 34, 34);
	loadimage(&kunkun[51], "resource/2月22日(51).png", 34, 34);
	loadimage(&kunkun[52], "resource/2月22日(52).png", 34, 34);
	loadimage(&kunkun[53], "resource/2月22日(53).png", 34, 34);
	loadimage(&kunkun[54], "resource/2月22日(54).png", 34, 34);
	loadimage(&kunkun[55], "resource/2月22日(55).png", 34, 34);
	loadimage(&kunkun[56], "resource/2月22日(56).png", 34, 34);
	for (int i = 0; i < Ball_num; i++)
	{
		loadimage(&ball[i], "resource/5459.png_860.png", 36, 36);
	}

4. 绘制图片

图片是需要根据球来移动的,所以putimage函数的格式应该为:

putimage(x, y, Wide, Hight, &kunkun[a], 0, 0,SRCAND);
  1. x, y:图像左上角在窗口中的坐标。
  2. Wide, Hight:要绘制的图像的宽度和高度。
  3. &kunkun[a]:指向图像数据数组的指针,a是数组中图像数据的索引。
  4. 0, 0:源图像中要复制的区域的左上角坐标。

这样图片的位置就可以根据球的为止移动了。 

void show()
{
	srand((unsigned)time(NULL));
    //清屏函数
	cleardevice();
	//setbkcolor(WHITE);
	putimage(0, 0, &img[Img]);
	putimage(0, 0, &Heal[Health], SRCAND);
	for (int i = 0; i < Ball_num; i++)
	{
		setfillcolor(RGB(229, 124, 77));
		solidcircle(Enemy[i].x, Enemy[i].y, Enemy[i].r);
	}
	putimage(Player.x - 14, Player.y - 14, Wide, Hight, &kunkun[a], 0, 0,SRCAND);
	for (int i = 0; i < Ball_num; i++)
	{
		putimage(Enemy[i].x - 18, Enemy[i].y - 18, Wide, Hight, &ball[i], 0, 0, SRCAND);
	}
}

 5. 篮球的移动

随机生成8个随机数,然后根据这八个随机数在执行向下移动的同时执行向左或向右的指令。为了防止篮球的移动速度太快,我们需要加一个Sleep(10)函数给它降速。当篮球移动出游戏界面的时候我们让它重新生成。

void Enemy_move()
{
	srand((unsigned)time(NULL));
	for (int i = 0; i < Ball_num; i++)
	{
		int direction = rand() % 8;
			if (direction == 0)
			{
				Enemy[i].y++;
				Enemy[i].x--;
			}
			else if (direction == 1)
			{
				Enemy[i].y++;
				Enemy[i].x++;
			}
			else if (direction == 2)
			{
				Enemy[i].y += 2;
				Enemy[i].x += 2;
			}
			else if (direction == 3)
			{
				Enemy[i].y += 2;
				Enemy[i].x -= 2;
			}
			else if (direction == 4)
			{
				Enemy[i].y += 3;
				Enemy[i].x += 3;
			}
			else if (direction == 5)
			{
				Enemy[i].y += 3;
				Enemy[i].x -= 3;
			}
			else if (direction == 6)
			{
				Enemy[i].y += 4;
				Enemy[i].x -= 4;
			}
			else if (direction == 7)
			{
				Enemy[i].y += 4;
				Enemy[i].x += 4;
			}
			if (Enemy[i].x <0 || Enemy[i].x>Wide || Enemy[i].y > Hight - Player.r * 3)
			{
				Enemy[i].x = Wide / 2;
				Enemy[i].y = 10;
				Enemy[i].r = 10;
			}
	}
}

6. 玩家与球碰撞

生成游戏血条,每碰撞一次血条减少,并且重新生成篮球。

IMAGE Heal[6];
	loadimage(&Heal[5], "resource/微信图片_20240303142935.jpg");
	loadimage(&Heal[4], "resource/微信图片_20240303142958.jpg");
	loadimage(&Heal[3], "resource/微信图片_20240303142931.jpg");
	loadimage(&Heal[2], "resource/微信图片_20240303142926.jpg");
	loadimage(&Heal[1], "resource/微信图片_20240303142922.jpg");
//玩家与球碰撞
void collide()
{
	for (int i = 0; i < Ball_num; i++)
	{
		if (Distance(Player.x, Player.y, Enemy[i].x, Enemy[i].y) < Player.r + Enemy[i].r && Health > 0)
		{
			Health--;
			Enemy[i].x = Wide / 2;
			Enemy[i].y = 10;
			Enemy[i].r = 10;
		}
	}
	
}

7. 人物的移动 

在这里需要用到GetAsyncKeyState(vk virtual key)函数获取异步按键状态,其中vk virtual key是虚拟键值,如果接受到这个虚拟键值,它会返回真。VK_UP、VK_LEFT、VK_RIGHT、0x20、0x41、0x44、0x57分别是上箭头键、左箭头键、右箭头键、空格键、a、d、w的虚拟键值。最后这里比较难处理的就是跳跃的这个动作了,我在这里设置人物跳跃后最高上升60个像素格,然后通过while循环循环上升每次上升5个像素个,如果是直接上升60个像素格的话,就是闪现了达不到跳跃的效果,在人物上升的同时其他动作是任然要进行的,所以我们还需要将这些动作函数打包放到这个人物跳跃的while循环当中。值得注意的是我们还需要在这个while循环中加一个Sleep(20)调节循环速度,使这里运动速度与主函数的while循环的运动速度一致。

void player_move()
{
	if (GetAsyncKeyState(VK_LEFT)|| GetAsyncKeyState(0x41))
	{
		if (Player.x > 0)
			Player.x -= Player_sleep;
	}
	if (GetAsyncKeyState(VK_RIGHT)|| GetAsyncKeyState(0x44))
	{
		if (Player.x < Wide)
			Player.x += Player_sleep;
	}
	if (Player.y == Hight - Player.r * 4)
	{
		if (GetAsyncKeyState(0x20) || GetAsyncKeyState(0x57)|| GetAsyncKeyState(VK_UP))
		{
			BeginBatchDraw();
			while (Player.y > Hight - Player.r * 4 - 60)
			{
				Sleep(20);
				Player.y -= 5;
				player_move();
				Enemy_move();
				show();
				collide();
				FlushBatchDraw();
			}
		}
		if (Health == 0)
		{
			printf("\a");
			system("pause");
			exit(0);
		}
	}
}

效果展示:

坤坤的篮球回避秀

源码:

#include<stdio.h>
#include<easyx.h>
#include<time.h>
#include<windows.h>
#include<mmsystem.h>
#include<math.h>
#pragma comment(lib,"winmm.lib")
#define Wide 1280
#define Hight 720
#define Wide1 780
#define Hight1 286
#define Ball_num 20
#define Player_sleep 5
int Health = 5;
int sleep = 1;
int Img = 0;
struct Ball
{
	float x = 0;
	int y = 0;
	float r = 0;

};
struct Ball Enemy[Ball_num];
struct Ball Player;
IMAGE img[2];
IMAGE kunkun[58];
IMAGE ball[Ball_num];
IMAGE Heal[6];
int a = 0;
//加载图片
void Init()
{
	loadimage(&img[0], "resource/微信图片_20240222202456.jpg");
	loadimage(&img[1], "resource/微信图片_20240303132408.jpg");
	loadimage(&Heal[5], "resource/微信图片_20240303142935.jpg");
	loadimage(&Heal[4], "resource/微信图片_20240303142958.jpg");
	loadimage(&Heal[3], "resource/微信图片_20240303142931.jpg");
	loadimage(&Heal[2], "resource/微信图片_20240303142926.jpg");
	loadimage(&Heal[1], "resource/微信图片_20240303142922.jpg");
	loadimage(&kunkun[0], "resource/2月22日.png", 34, 34);
	loadimage(&kunkun[1], "resource/2月22日(1).png", 34, 34);
	loadimage(&kunkun[2], "resource/2月22日(2).png", 34, 34);
	loadimage(&kunkun[3], "resource/2月22日(3).png", 34, 34);
	loadimage(&kunkun[4], "resource/2月22日(4).png", 34, 34);
	loadimage(&kunkun[5], "resource/2月22日(5).png", 34, 34);
	loadimage(&kunkun[6], "resource/2月22日(6).png", 34, 34);
	loadimage(&kunkun[7], "resource/2月22日(7).png", 34, 34);
	loadimage(&kunkun[8], "resource/2月22日(8).png", 34, 34);
	loadimage(&kunkun[9], "resource/2月22日(9).png", 34, 34);
	loadimage(&kunkun[10], "resource/2月22日(10).png", 34, 34);
	loadimage(&kunkun[11], "resource/2月22日(11).png", 34, 34);
	loadimage(&kunkun[12], "resource/2月22日(12).png", 34, 34);
	loadimage(&kunkun[13], "resource/2月22日(13).png", 34, 34);
	loadimage(&kunkun[14], "resource/2月22日(14).png", 34, 34);
	loadimage(&kunkun[15], "resource/2月22日(15).png", 34, 34);
	loadimage(&kunkun[16], "resource/2月22日(16).png", 34, 34);
	loadimage(&kunkun[17], "resource/2月22日(17).png", 34, 34);
	loadimage(&kunkun[18], "resource/2月22日(18).png", 34, 34);
	loadimage(&kunkun[19], "resource/2月22日(19).png", 34, 34);
	loadimage(&kunkun[20], "resource/2月22日(20).png", 34, 34);
	loadimage(&kunkun[21], "resource/2月22日(21).png", 34, 34);
	loadimage(&kunkun[22], "resource/2月22日(22).png", 34, 34);
	loadimage(&kunkun[23], "resource/2月22日(23).png", 34, 34);
	loadimage(&kunkun[24], "resource/2月22日(24).png", 34, 34);
	loadimage(&kunkun[25], "resource/2月22日(25).png", 34, 34);
	loadimage(&kunkun[26], "resource/2月22日(26).png", 34, 34);
	loadimage(&kunkun[27], "resource/2月22日(27).png", 34, 34);
	loadimage(&kunkun[28], "resource/2月22日(28).png", 34, 34);
	loadimage(&kunkun[29], "resource/2月22日(29).png", 34, 34);
	loadimage(&kunkun[30], "resource/2月22日(30).png", 34, 34);
	loadimage(&kunkun[31], "resource/2月22日(31).png", 34, 34);
	loadimage(&kunkun[32], "resource/2月22日(32).png", 34, 34);
	loadimage(&kunkun[33], "resource/2月22日(33).png", 34, 34);
	loadimage(&kunkun[34], "resource/2月22日(34).png", 34, 34);
	loadimage(&kunkun[35], "resource/2月22日(35).png", 34, 34);
	loadimage(&kunkun[36], "resource/2月22日(36).png", 34, 34);
	loadimage(&kunkun[37], "resource/2月22日(37).png", 34, 34);
	loadimage(&kunkun[38], "resource/2月22日(38).png", 34, 34);
	loadimage(&kunkun[39], "resource/2月22日(39).png", 34, 34);
	loadimage(&kunkun[40], "resource/2月22日(40).png", 34, 34);
	loadimage(&kunkun[41], "resource/2月22日(41).png", 34, 34);
	loadimage(&kunkun[42], "resource/2月22日(42).png", 34, 34);
	loadimage(&kunkun[43], "resource/2月22日(43).png", 34, 34);
	loadimage(&kunkun[44], "resource/2月22日(44).png", 34, 34);
	loadimage(&kunkun[45], "resource/2月22日(45).png", 34, 34);
	loadimage(&kunkun[46], "resource/2月22日(46).png", 34, 34);
	loadimage(&kunkun[47], "resource/2月22日(47).png", 34, 34);
	loadimage(&kunkun[48], "resource/2月22日(48).png", 34, 34);
	loadimage(&kunkun[49], "resource/2月22日(49).png", 34, 34);
	loadimage(&kunkun[50], "resource/2月22日(50).png", 34, 34);
	loadimage(&kunkun[51], "resource/2月22日(51).png", 34, 34);
	loadimage(&kunkun[52], "resource/2月22日(52).png", 34, 34);
	loadimage(&kunkun[53], "resource/2月22日(53).png", 34, 34);
	loadimage(&kunkun[54], "resource/2月22日(54).png", 34, 34);
	loadimage(&kunkun[55], "resource/2月22日(55).png", 34, 34);
	loadimage(&kunkun[56], "resource/2月22日(56).png", 34, 34);
	for (int i = 0; i < Ball_num; i++)
	{
		loadimage(&ball[i], "resource/5459.png_860.png", 36, 36);
	}
}
//初始化小球的信息
void Itset()
{
	//
	for (int i = 0; i < Ball_num; i++)
	{
		Enemy[i].x = Wide / 2;
		Enemy[i].y = 10;
		Enemy[i].r = 10;
	}
	//玩家
	Player.x = Wide / 2;
	Player.r = 10;
	Player.y = Hight - Player.r * 4;
}
void Enemy_move()
{
	srand((unsigned)time(NULL));
	for (int i = 0; i < Ball_num; i++)
	{
		int direction = rand() % 8;
			if (direction == 0)
			{
				Enemy[i].y++;
				Enemy[i].x--;
			}
			else if (direction == 1)
			{
				Enemy[i].y++;
				Enemy[i].x++;
			}
			else if (direction == 2)
			{
				Enemy[i].y += 2;
				Enemy[i].x += 2;
			}
			else if (direction == 3)
			{
				Enemy[i].y += 2;
				Enemy[i].x -= 2;
			}
			else if (direction == 4)
			{
				Enemy[i].y += 3;
				Enemy[i].x += 3;
			}
			else if (direction == 5)
			{
				Enemy[i].y += 3;
				Enemy[i].x -= 3;
			}
			else if (direction == 6)
			{
				Enemy[i].y += 4;
				Enemy[i].x -= 4;
			}
			else if (direction == 7)
			{
				Enemy[i].y += 4;
				Enemy[i].x += 4;
			}
			if (Enemy[i].x <0 || Enemy[i].x>Wide || Enemy[i].y > Hight - Player.r * 3)
			{
				Enemy[i].x = Wide / 2;
				Enemy[i].y = 10;
				Enemy[i].r = 10;
			}
	}
}
void show()
{
	srand((unsigned)time(NULL));
	cleardevice();
	putimage(0, 0, &img[Img]);
	putimage(0, 0, &Heal[Health], SRCAND);

	for (int i = 0; i < Ball_num; i++)
	{
		setfillcolor(RGB(229, 124, 77));
		solidcircle(Enemy[i].x, Enemy[i].y, Enemy[i].r);
	}
	putimage(Player.x - 14, Player.y - 14, Wide, Hight, &kunkun[a], 0, 0,SRCAND);
	for (int i = 0; i < Ball_num; i++)
	{
		putimage(Enemy[i].x - 18, Enemy[i].y - 18, Wide, Hight, &ball[i], 0, 0, SRCAND);
	}
}
//距离
int Distance(int x, int y, int x1, int y1)
{
	return sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
}
//玩家与球碰撞
void collide()
{
	for (int i = 0; i < Ball_num; i++)
	{
		if (Distance(Player.x, Player.y, Enemy[i].x, Enemy[i].y) < Player.r + Enemy[i].r && Health > 0)
		{
			Health--;
			Enemy[i].x = Wide / 2;
			Enemy[i].y = 10;
			Enemy[i].r = 10;
		}
	}
	
}
void player_move()
{
	if (GetAsyncKeyState(VK_LEFT)|| GetAsyncKeyState(0x41))
	{
		if (Player.x > 0)
			Player.x -= Player_sleep;
	}
	if (GetAsyncKeyState(VK_RIGHT)|| GetAsyncKeyState(0x44))
	{
		if (Player.x < Wide)
			Player.x += Player_sleep;
	}
	if (Player.y == Hight - Player.r * 4)
	{
		if (GetAsyncKeyState(0x20) || GetAsyncKeyState(0x57)|| GetAsyncKeyState(VK_UP))
		{
			BeginBatchDraw();
			while (Player.y > Hight - Player.r * 4 - 60)
			{
				Sleep(20);
				Player.y -= 5;
				player_move();
				Enemy_move();
				show();
				collide();
				FlushBatchDraw();
			}
		}
		if (Health == 0)
		{
			printf("\a");
			system("pause");
			exit(0);
		}
	}
}
int main()
{
	Init();
	Itset();
	initgraph(Wide, Hight);
	BeginBatchDraw();
	while (1)
	{
		Sleep(20);
		if (a <= 56)
		{
			a++;
		}
		if (a > 56)
		{
			a = 0;
		}
		if (Player.y < Hight - Player.r * 4)
		{
			Player.y += 2;
		}
		if (sleep > 0)
		{
			sleep--;
		}
		if (Health == 0)
			Img = 1;
		show();
		FlushBatchDraw();
		Enemy_move();
		player_move();
		collide();
	}
	closegraph;
	return 0;
}

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

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

相关文章

php开发项目 docx,pptx,excel表格上传阿里云,腾讯云存储后截取第一页生成缩略图

服务器或者存储上传的word,ppt和excel表格需要截取内容展示的时候,就需要管理后台每次上传文件时根据不同文件类型截取图片保存起来,并讲图片的地址保存到数据字段中.网上搜索了很多相关文章遇到的坑不少,经过2天时间终于完成了,将代码和遇到的问题完整记录下来. 本文用的…

【JavaEE进阶】 Linux常用命令

文章目录 &#x1f343;前言&#x1f334;ls 与 pwd&#x1f6a9;ls&#x1f6a9;pwd &#x1f38d;cd&#x1f6a9;认识Linux目录结构 &#x1f340;touch与cat&#x1f6a9;touch&#x1f6a9;cat &#x1f332;mkdir与rm&#x1f6a9;mkdir&#x1f6a9;rm &#x1f384;cp与…

长贵对赵本山说:你需要我们家大脚,我立马给你配双大鞋!

长贵对赵本山说&#xff1a;你需要我们家大脚&#xff0c;我立马给你配双大鞋&#xff01; --小品《乡村爱情》&#xff08;中2&#xff09;的台词 表演者&#xff1a;赵本山 于月仙 王小利 唐鉴军等 &#xff08;接上&#xff09; 哈哈哈 伊拉克啊 这地方也不产这玩意吧 …

Blazor 向 ECharts 传递 option

目标 将ECharts封装为Blazor组件&#xff0c;然后通过jsRuntime向ECharts传递参数&#xff0c;即设置option。 封装ECharts 步骤&#xff1a; 1. 在index.html中引入echarts.min.js&#xff1b; 2. 创建blazor组件&#xff0c;将ref传递给js用于初始化echarts&#xff1b; …

指定新加坡|高职老师自费赴新加坡国立大学访学交流

K老师任职于某高职院校&#xff0c;希望通过自费出国访学&#xff0c;达到拓宽国际化视野&#xff0c;为本校的专业发展寻求新契机的目的&#xff0c;并将访学目标国家指定为新加坡。最终我们为其获得新加坡国立大学的邀请函。因交叉性、前沿性的专业特性&#xff0c;K老师的出…

构建安全的REST API:OAuth2和JWT实践

引言 大家好&#xff0c;我是小黑&#xff0c;小黑在这里跟咱们聊聊&#xff0c;为什么REST API这么重要&#xff0c;同时&#xff0c;为何OAuth2和JWT在构建安全的REST API中扮演着不可或缺的角色。 想象一下&#xff0c;咱们每天都在使用的社交媒体、在线购物、银行服务等等…

大气颗粒物和VOCs PMF源解析实用干货

目前&#xff0c;大气颗粒物和臭氧污染成为我国亟待解决的环境问题。颗粒物和臭氧污染不仅对气候和环境有重要影响&#xff0c;而且对人体健康有严重损害。而臭氧的前体物之一为挥发性有机物&#xff08;VOCs&#xff09;。为了高效、精准地治理区域大气颗粒物和臭氧污染&#…

115.龙芯2k1000-pmon(14)- pmon编程优化

通过上面的分析&#xff0c;发现&#xff0c;其实gzrom-dtb.bin其实有很多空白区域&#xff0c;而且空白区域填充的都是0&#xff0c;这对flash来说并不友好&#xff0c;能否把填充的位置改为ff呢&#xff0c;这样编程的速度也会加快&#xff0c;对flash来说也是一种保护呢。 …

【网站项目】121开放式教学评价管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Linux速览(1)——基础指令篇

在上一章对Linux有了一些基础了解之后&#xff0c;本章我们来学习一下Linux系统下一些基本操作的常用的基础指令。 目录 1. ls 指令 2. pwd&&whoami命令 3. cd 指令 4. touch指令 5.mkdir指令&#xff08;重要&#xff09;&#xff1a; 6.rmdir指令 && …

【虚拟机安装centos7后找不到网卡问题】

最近开始学习linux&#xff0c;看着传智播客的教学视频学习&#xff0c;里面老师用的是centos6.5&#xff0c;我这边装的是centos7最新版的 结果到了网络配置的这一节&#xff0c;卡了我好久。 我在centos一直找不到我的网卡eth0&#xff0c;只有一个回环网口&#xff0c;在/…

TikTok外贸系统的核心功能及其源代码分享!

随着全球化的不断推进&#xff0c;外贸业务成为越来越多企业的增长动力&#xff0c;TikTok作为一个全球性的社交媒体平台&#xff0c;其用户基数庞大、活跃度高&#xff0c;为外贸业务提供了无限的商机。 为了帮助企业在TikTok上更好地开展外贸业务&#xff0c;TikTok外贸系统…

Ubuntu环境使用docker构建并运行SpringBoot镜像

今天Ubuntu环境使用docker构建并运行SpringBoot镜像&#xff0c;看文章之前建议先查看安装流程: Linux环境之Ubuntu安装Docker流程 一、镜像打包过程及执行 1、创建一个测试目录 mkdir javaDemo 2、springBoot的包复制到此目录下 cp demo1-0.0.1-SNAPSHOT.jar /data/app/…

Docker快速集成minio

拉取镜像&#xff08;默认最新的&#xff09; docker pull minio/minio创建配制和数据映射文件夹&#xff08;用于将容器内的配置和数据映射到本地&#xff09; 这边的路径可以修改成自己想要的文件夹 mkdir -p /data/minio/{config,data}启动容器 (这边启动容器要保证本地映…

【大厂AI课学习笔记NO.61】环境部署的选择

主要是选择单机和分布式、生产和开发环境的规划等。 开发环境、测试环境、预发布环境和生产环境是软件开发和部署过程中常见的几个环境&#xff0c;它们各自的定义、区别、联系以及实现的关键技术如下&#xff1a; 1. 开发环境&#xff08;Development Environment&#xff09…

骨传导耳机哪个牌子好?六大选购窍门,帮你甩掉坑货!

很多用户对骨传导耳机的理解存在偏差&#xff0c;认为只要选择价格贵的、热度高的产品就能万事大吉&#xff0c;而实际却不是如此&#xff0c;要知道&#xff0c;随着骨传导耳机逐渐成为热门款式&#xff0c;目前的市场上的骨传导耳机品牌也变得五花八门&#xff0c;这其中就包…

Android MediaCodec 简明教程(五):使用 MediaCodec 编码 ByteBuffer 数据,并保存为 MP4 文件

系列文章目录 Android MediaCodec 简明教程&#xff08;一&#xff09;&#xff1a;使用 MediaCodecList 查询 Codec 信息&#xff0c;并创建 MediaCodec 编解码器Android MediaCodec 简明教程&#xff08;二&#xff09;&#xff1a;使用 MediaCodecInfo.CodecCapabilities 查…

刷题日记:面试经典 150 题 DAY3

刷题日记&#xff1a;面试经典 150 题 DAY3 274. H 指数238. 除自身以外数组的乘积380. O(1) 时间插入、删除和获取随机元素134. 加油站135. 分发糖果 274. H 指数 原题链接 274. H 指数 重要的是都明白H指数到底是是个啥。注意到如果将引用数从大到小排序&#xff0c;则对于…

每日一题-移除链表元素

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 移除链表元素 以上是题目名称&#xff1a; typedef struct ListNode SListNode; struct ListNode* removeElements(struct ListNode* head, int val) {SListNode*newHead,*newTail;ne…

Matlab 机器人工具箱 例程:运动学+动力学+路径规划+可视化

文章目录 1 创建机器人2 机器人显示3 机器人示教4 机器人路径规划&#xff1a;给定关节角路径5 机器人路径规划&#xff1a;给定末端位姿&#xff0c;求关节角路径6 工作空间可视化参考链接 1 创建机器人 clc;clear;close all; deg pi/180;L1 Revolute(d, 0, a, 0, alpha, 0,…