基于STM32的摇杆开关控制小恐龙游戏(附源码)

news2024/9/25 11:09:17

文章目录

  • 一、 前言
    • 谷歌小恐龙
  • 二、硬件
  • 三、软件
    • 3.1 摇杆开关
    • 3.2 OLED屏幕
  • 四、展示
  • 五、总结


一、 前言

最近有看到别人在OLED屏幕上玩小恐龙,所幸查阅下资料,并下好源码。可惜他的源码的主控是STM32F103ZET6,用的是STM32CubeIDE,采用的是HAL库编写。我目前手头上并没有该主控的开发板,只能自己手动移植到STM32F103C8T6上,觉得用按键来操作小恐龙跳跃不是很舒服,所以自己改用摇杆开关用遥控向上来进行跳跃,更顺手些。

谷歌小恐龙

谷歌小恐龙是指谷歌 Chrome 浏览器中的一个小游戏,通常出现在没有网络连接时的页面(称为“无网页游戏”或“离线游戏”)。这款游戏名为“恐龙跳跃”(T-Rex Runner),玩家需要控制一只恐龙跳过障碍物,随着游戏时间的推移,速度会逐渐加快,挑战也会变得更大。

在这里插入图片描述

在这里插入图片描述

谷歌小恐龙游戏在线玩


二、硬件

老样子,用面板上搭建一个简单的实验环境。

共需要一块最小系统板,一个0.96寸的OLED显示屏(IIC驱动)和一个摇杆开关。

硬件相对比较简单,很容易实现,感兴趣的可以试下。

引脚连接:(如需更改,直接修改对应.h文件里面的宏定义)

摇杆开关X输出:PB0
摇杆开关Y输出:PB1
摇杆开关按键:PB10
OLED显示屏SCL:PA0
OLED显示屏SDA:PA1

在这里插入图片描述

对摇杆开关不了解的可以看下摇杆开关的简单应用

对OLED不了解的可以看下0.96寸OLED(IIC接口)显示屏的图像显示应用

在这里插入图片描述

三、软件

3.1 摇杆开关

这里的ADCX和ADCY的引脚要是ADC引脚,还要看一下具体的DMA通道。至于下面那个按键就是摇杆开关的SW开关引脚了,任意引脚即可。

/* Defines ------------------------------------------------------------------*/
#define Rocker_GPIO_RCC   RCC_APB2Periph_GPIOB
#define Rocker_GPIO_Port  GPIOB
#define ADCX_Pin          GPIO_Pin_0
#define ADCY_Pin          GPIO_Pin_1

#define Key_GPIO_RCC      RCC_APB2Periph_GPIOB
#define Key_GPIO_Port     GPIOB
#define Key_Pin           GPIO_Pin_10//根据实际的引脚修改

/* Variables Define ---------------------------------------------------------*/
uint16_t conv_val[4] = {0};

float LeftTwoAxisKey_X = 0;
float LeftTwoAxisKey_Y = 0;
/* Function prototypes ------------------------------------------------------*/
/*******************************************************************************
 * 函数名:User_Rocker_Init
 * 描述  :摇杆开关相关变量初始化
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :
 *******************************************************************************/
void User_Rocker_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	DMA_InitTypeDef DMA_InitStructure;
	ADC_InitTypeDef ADC_InitStructure;

	RCC_APB2PeriphClockCmd(Rocker_GPIO_RCC, ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

	GPIO_InitStructure.GPIO_Pin = ADCX_Pin;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(Rocker_GPIO_Port, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = ADCY_Pin;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(Rocker_GPIO_Port, &GPIO_InitStructure);

	DMA_DeInit(DMA1_Channel1);									   // 将DMA的通道1寄存器重设为缺省值
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(ADC1->DR)); // 外设基址为:ADC 数据寄存器地址
	DMA_InitStructure.DMA_MemoryBaseAddr = (u32)conv_val;		   // 存储器地址
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;			   // 数据源来自外设
	// 缓冲区大小,应该等于数据目的地的大小
	DMA_InitStructure.DMA_BufferSize = 4;
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;			// 外设寄存器只有一个,地址不用递增
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;						// 存储器地址递增
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外设数据大小为半字,即两个字节
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;			// 内存数据大小也为半字,跟外设数据大小相同
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;								// 循环传输模式
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;							// DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;								// 禁止存储器到存储器模式,因为是从外设到存储器
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);								// 初始化DMA
	DMA_Cmd(DMA1_Channel1, ENABLE);												// 使能 DMA 通道

	ADC_DeInit(ADC1); // ADC1复位
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_ScanConvMode = ENABLE;
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NbrOfChannel = 2;
	ADC_Init(ADC1, &ADC_InitStructure);
	RCC_ADCCLKConfig(RCC_PCLK2_Div8);

	// 配置ADC 通道的转换顺序和采样时间
	ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5);
	ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_55Cycles5);

	ADC_DMACmd(ADC1, ENABLE);
	ADC_Cmd(ADC1, ENABLE);		// 使能adc1
	ADC_ResetCalibration(ADC1); // 复位ADC1校准
	while (ADC_GetResetCalibrationStatus(ADC1))
		;						// 等待ADC1复位校准结束
	ADC_StartCalibration(ADC1); // 开启ADC1校准
	while (ADC_GetCalibrationStatus(ADC1))
		; // 等待ADC1校准结束
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

/*******************************************************************************
 * 函数名:Key_Init
 * 描述  :按键初始化
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :
 *******************************************************************************/
void User_Key_Init(void)
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
	GPIO_InitTypeDef GPIO_InitStructure;

	/*开启LED相关的GPIO外设时钟*/
	RCC_APB2PeriphClockCmd(Key_GPIO_RCC, ENABLE);

	/*设置引脚模式为上拉输入*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

	/*选择要控制的GPIO引脚*/
	GPIO_InitStructure.GPIO_Pin = Key_Pin;

	/*调用库函数,初始化GPIO*/
	GPIO_Init(Key_GPIO_Port, &GPIO_InitStructure);
}

/*******************************************************************************
 * 函数名:Key_IN_Read
 * 描述  :Key输入模式读取引脚状态
 * 输入  :void
 * 输出  :uint8_t
 * 调用  :初始化
 * 备注  :
 *******************************************************************************/
uint8_t Key_IN_Read(void)
{
	return GPIO_ReadInputDataBit(Key_GPIO_Port, Key_Pin);
}

/*******************************************************************************
 * 函数名:Rocker_Scan
 * 描述  :摇杆开关扫描
 * 输入  :void
 * 输出  :void
 * 调用  :内部调用
 * 备注  :
 *******************************************************************************/
int Rocker_Scan(void)
{
	LeftTwoAxisKey_X = conv_val[0] * 3.3 / 4096;
	LeftTwoAxisKey_Y = conv_val[1] * 3.3 / 4096;
	//	printf("LeftTwoAxisKey_X=%f  LeftTwoAxisKey_Y=%f\r\n",LeftTwoAxisKey_X,LeftTwoAxisKey_Y);

	/*********************判断摇杆开关方向****************************/
	if ((LeftTwoAxisKey_X > 1) && (LeftTwoAxisKey_Y < 1))
	{
		//       printf("Up \r\n");
		return 1;
	}
	if ((LeftTwoAxisKey_X > 1) && (LeftTwoAxisKey_Y > 2))
	{
		//        printf("Down \r\n");
	}

	/*********************判断摇杆按键是否按下****************************/
	if (Key_IN_Read())
	{
		delay_syms(2);
		if (Key_IN_Read())
		{
			return 2;
		}
	}
	return 0;
}

3.2 OLED屏幕

#define IIC_GPIO_Port GPIOA
#define SDA_Pin       GPIO_Pin_1
#define SCL_Pin       GPIO_Pin_0//根据实际的引脚修改

#define OLED_SCLK_Clr() GPIO_ResetBits(IIC_GPIO_Port,SCL_Pin)//SCL
#define OLED_SCLK_Set() GPIO_SetBits(IIC_GPIO_Port,SCL_Pin)

#define OLED_SDIN_Clr() GPIO_ResetBits(IIC_GPIO_Port,SDA_Pin)//SDA
#define OLED_SDIN_Set() GPIO_SetBits(IIC_GPIO_Port,SDA_Pin)

//初始化SSD1306
void OLED_Init(void)
{
	IIC_Init();//IIC引脚初始化
	
	delay_syms(500);
	
	OLED_WR_Byte(0xAE,OLED_CMD);//--display off
	OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
	OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
	OLED_WR_Byte(0x40,OLED_CMD);//--set start line address
	OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
	OLED_WR_Byte(0x81,OLED_CMD); // contract control
	OLED_WR_Byte(0xFF,OLED_CMD);//--128
	OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
	OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
	OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
	OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
	OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
	OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
	OLED_WR_Byte(0x00,OLED_CMD);//

	OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
	OLED_WR_Byte(0x80,OLED_CMD);//

	OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
	OLED_WR_Byte(0x05,OLED_CMD);//

	OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
	OLED_WR_Byte(0xF1,OLED_CMD);//

	OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
	OLED_WR_Byte(0x12,OLED_CMD);//

	OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
	OLED_WR_Byte(0x30,OLED_CMD);//

	OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
	OLED_WR_Byte(0x14,OLED_CMD);//

	OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
	
	delay_syms(500);
	
	OLED_FillPicture(0x0);
}

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
void OLED_Clear(void)
{
	uint8_t i,n;
	for(i=0;i<8;i++)
	{
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
		OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
		OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址
		for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
	} //更新显示
}

// 绘制重启
void OLED_DrawRestart()
{
	unsigned int j=0;
	unsigned char x, y;
	unsigned char byte;
	//OLED_SetPos(0, 0);
	for (y = 2; y < 5; y++)
	{
		OLED_SetPos(52, y);
		IIC_Start();
		IIC_WriteByte(0x78);
		IIC_WaitAck();
		IIC_WriteByte(0x40);
		IIC_WaitAck();
		for (x = 0; x < 24; x++)
		{
			byte = RESTART[j++];
			IIC_WriteByte(byte);
			IIC_WaitAck();
		}
		IIC_Stop();
	}
	OLED_ShowString(10, 3, "GAME", 16);
	OLED_ShowString(86, 3, "OVER", 16);
}

// 绘制小恐龙
void OLED_DrawDino()
{
	static unsigned char dino_dir = 0;
	unsigned int j=0;
	unsigned char x, y;
	unsigned char byte;

	dino_dir++;
	dino_dir = dino_dir%2;
	for(y=0; y<2; y++)
	{
		OLED_SetPos(16, 6+y);
		IIC_Start();
		IIC_WriteByte(0x78);
		IIC_WaitAck();
		IIC_WriteByte(0x40);
		IIC_WaitAck();
		for (x = 0; x < 16; x++)
		{
			j = y*16 + x;
			byte = DINO[dino_dir][j];

			IIC_WriteByte(byte);
			IIC_WaitAck();
		}
		IIC_Stop();
	}
}

// 绘制跳跃小恐龙
int OLED_DrawDinoJump(char reset)
{
	char speed_arr[] = {1, 1, 3, 3, 4, 4, 5, 6, 7};
	static char speed_idx = sizeof(speed_arr)-1;
	static int height = 0;
	static char dir = 0;
	//char speed = 4;

	unsigned int j=0;
	unsigned char x, y;
	char offset = 0;
	unsigned char byte;
	if(reset == 1)
	{
		height = 0;
		dir = 0;
		speed_idx = sizeof(speed_arr)-1;
		return 0;
	}
	if (dir==0)
	{
		height += speed_arr[speed_idx];
		speed_idx --;
		if (speed_idx<0) speed_idx = 0;
	}
	if (dir==1)
	{
		height -= speed_arr[speed_idx];
		speed_idx ++;
		if (speed_idx>sizeof(speed_arr)-1) speed_idx = sizeof(speed_arr)-1;
	}
	if(height >= 31)
	{
		dir = 1;
		height = 31;
	}
	if(height <= 0)
	{
		dir = 0;
		height = 0;
	}
	if(height <= 7) offset = 0;
	else if(height <= 15) offset = 1;
	else if(height <= 23) offset = 2;
	else if(height <= 31) offset = 3;
	else offset = 4;

	for(y=0; y<3; y++) // 4
	{
		OLED_SetPos(16, 5- offset + y);

		IIC_Start();
		IIC_WriteByte(0x78);
		IIC_WaitAck();
		IIC_WriteByte(0x40);
		IIC_WaitAck();
		for (x = 0; x < 16; x++) // 32
		{
			j = y*16 + x; // 32
			byte = DINO_JUMP[height%8][j];

			IIC_WriteByte(byte);
			IIC_WaitAck();
		}
		IIC_Stop();
	}
	if (dir == 0) oled_drawbmp_block_clear(16, 8- offset, 16);
	if (dir == 1) oled_drawbmp_block_clear(16, 4- offset, 16);
	return height;
}

// 绘制随机出现的仙人掌障碍物
int OLED_DrawCactusRandom(unsigned char ver, unsigned char reset)
{
	char speed = 5;
	static int pos = 128;
	int start_x = 0;
	int length = 0;

	unsigned int i=0, j=0;
	unsigned char x, y;
	unsigned char byte;
	if (reset == 1)
	{
		pos = 128;
		oled_drawbmp_block_clear(0, 6, speed);
		return 128;
	}
	if (ver == 0) length = 8; //sizeof(CACTUS_1) / 2;
	else if (ver == 1) length = 16; //sizeof(CACTUS_2) / 2;
	else if (ver == 2 || ver == 3) length = 24;

	for(y=0; y<2; y++)
	{
		if(pos < 0)
		{
			start_x = -pos;
			OLED_SetPos(0, 6+y);
		}
		else
		{
			OLED_SetPos(pos, 6+y);
		}

		IIC_Start();
		IIC_WriteByte(0x78);
		IIC_WaitAck();
		IIC_WriteByte(0x40);
		IIC_WaitAck();

		for (x = start_x; x < length; x++)
		{
			if (pos + x > 127) break;

			j = y*length + x;
			if (ver == 0) byte = CACTUS_1[j];
			else if (ver == 1) byte = CACTUS_2[j];
			else if(ver == 2) byte = CACTUS_3[j];
			else byte = CACTUS_4[j];

			IIC_WriteByte(byte);
			IIC_WaitAck();
		}
		IIC_Stop();
	}

	oled_drawbmp_block_clear(pos + length, 6, speed);

	pos = pos - speed;
	return pos + speed;
}

// 绘制云朵
void OLED_DrawCloud()
{
	static int pos = 128;
	static char height=0;
	char speed = 3;
	unsigned int i=0;
	int x;
	int start_x = 0;
	int length = sizeof(CLOUD);
	unsigned char byte;

	//if (pos + length <= -speed) pos = 128;

	if (pos + length <= -speed)
	{
		pos = 128;
		height = rand()%3;
	}
	if(pos < 0)
	{
		start_x = -pos;
		OLED_SetPos(0, 1+height);
	}
	else
	{
		OLED_SetPos(pos, 1+height);
	}

	IIC_Start();
	IIC_WriteByte(0x78);
	IIC_WaitAck();
	IIC_WriteByte(0x40);
	IIC_WaitAck();
	for (x = start_x; x < length + speed; x++)
	{
		if (pos + x > 127) break;
		if (x < length) byte = CLOUD[x];
		else byte = 0x0;

		IIC_WriteByte(byte);
		IIC_WaitAck();
	}
	IIC_Stop();

	pos = pos - speed;
}

四、展示

大概是下面这样子,如果觉得速度有点慢或者快,修改cur_speed 的值,也就是修改score/XX,改XX的大小。

cur_speed = score/20;
if (cur_speed > 29) cur_speed = 29;
delay_syms(30 - cur_speed);

屏闪的问题是手机相机拍摄的问题。实物是没问题的。

基于STM32和OLED的小恐龙游戏项目(摇杆开关控制)


五、总结

今天主要讲了基于STM32的摇杆开关控制小恐龙游戏,主要将原有的按键方式修改为摇杆控制。

感谢你的观看!

在这里插入图片描述

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

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

相关文章

C++的深拷贝和浅拷贝

浅拷贝是一种简单的拷贝方式&#xff0c;仅仅是复制对象的基本类型成员和指针成员的值&#xff0c;而不复制指针所指向的内存。这可能会导致两个对象共享相同的资源&#xff0c;从而引发潜在的问题&#xff0c;如内存泄漏、意外修改共享资源等。一般来说编译器默认帮我们实现的…

运行HGD数据集的 example.py 文件

使用HGD数据集时&#xff0c;需要从braindecode中调用相关的函数&#xff0c;但是在我的环境中运行时出现错误&#xff0c;现将解决过程记录&#xff0c;方便以后查阅。 运行HGD数据集的 example.py 文件 ModuleNotFoundError: No module named ‘braindecode.datautil.signalp…

PCL安装与配置(PCL1.8.1+MSVC2017)

上一篇安装PCL1.9.1,由于Generic Warning框一直弹出。 一、PCL1.8.1下载: 路径:PCL网址 所以我又安装了PCL1.8.1 MSVC2017 x64版本的。 二、安装 安装的步骤,和PCL安装与配置(PCL1.9.1+MSVC2017)这一篇一致。大家可以参考。 直接安装双击(PCL-1.8.1-AllInOne-msvc201…

【小趴菜前端实习日记1】

后台管理系统的模块化开发&#xff1a;vue2vueRouterElement-uiaxios 一、后台框架&#xff1a;element-ui <router-view>匹配路由二、封装侧边栏&#xff08;结合el-menu进行二次封装&#xff09;1.slideBar.vue:2.slideBarItem.vuevue中用template标签包裹循环渲染列表…

AI数字人直播平台+短视频合成平台软件系统 附带源代码包以及部署教程

AI数字人直播平台概述 AI数字人直播平台是一种基于人工智能技术的虚拟直播系统&#xff0c;它利用深度学习、自然语言处理、计算机视觉等技术&#xff0c;克隆出与真人相似的AI数字人&#xff0c;并在平台上进行直播。这些数字人不仅具有真人的外形、动作&#xff0c;而且镜头…

【vulhub靶场之thinkphp】——(5-rce)

第一步&#xff1a;打开靶场 输入开启命令 cd vulhub/thinkphp/5-rce docker-compose up -d docker-compose ps//查看开启的端口 第二步&#xff1a; 访问网址 第三步&#xff1a;漏洞利用 漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖&am…

Docker如何优雅删除镜像以及容器

一、先查看镜像和容器 docker images docker ps -a 二、停止正在运行的容器&#xff08;CONTAINER ID即容器ID&#xff0c;直接复制即可&#xff09; docker stop CONTAINER ID 三、删除容器 docker rm CONTAINER ID 四、删除镜像&#xff08;IMAGE ID即镜像ID&#xff0c;同理…

25考研计算机组成原理复习·3.3主存储器与CPU的连接·3.4外部存储器

目录 主存储器与CPU的连接 存储芯片的基本结构 位扩展/字扩展 位扩展 字扩展 字位同时扩展 外部存储器 磁盘存储器 磁盘原理 磁盘设备的组成 性能指标 磁盘阵列RAID 固态硬盘 组成 &#x1f469;‍&#x1f4bb; 读写性能特性 与机械硬盘相比的特点 &#x1f…

【Linux】权限(shell外壳、文件权限、管理权限)

目录 推荐文章一、shell 外壳1 文章详解&#xff1a;秒懂shell外壳程序3.shell 外壳是什么&#xff1f;4.shell 的执行 二、用户权限1.用户类型1.1.普通用户切换 rootsu 与 su - 的区别[Linux 中su 与su - 的区别](http://t.csdnimg.cn/IlIET)su - root &#xff08;完全切换了…

20240807提取飞凌OK3588-C的IMG固件中的时钟频率link_freq和pixel_clock

20240807提取飞凌OK3588-C的IMG固件中的时钟频率link_freq和pixel_clock 2024/8/6 16:32 缘起&#xff1a;调试代码的时候边调试变修改&#xff0c;在优化MIPI CSI时钟的时候&#xff0c;越改越差&#xff01;最后变成了负优化。 现在源代码/C文件找不到了&#xff0c;但是还有…

SQL注入实例(sqli-labs/less-19)

0、初始页面 1、确定闭合字符 注入点为referer&#xff0c;闭合字符为单引号 2、爆库名 3、爆表名 4、爆列名 5、查询最终目标

笔面试编程题总结

8/6诺瓦星云 修改程序 void point(int *p){*p p[2];}; int main() {int c[] {1,2,3,4,5},*p c;point(p1);for(;p <c5;){printf("%d",*p);}return 0; }1、分隔字符串 strtok //c语言 #include <stdio.h> #include <string.h>// 函数声明 char* fin…

【合并 K 个升序链表】python刷题记录

R4-分治篇 目录 最小堆方法 分治法 ps: 如果只是数组就很好处理了 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def mergeKLists(self, lists…

C++ GDl+ 多张图片合并生成GIF动画格式图片

使用ImageMagick多张图合成GIF。 1、工具下载安装 下载地址&#xff1a;ImageMagick – Download&#xff0c;windows下载版本如下&#xff1a; 下载后&#xff0c;安装&#xff0c;安装时选择为C/C安装动态库和头文件。 2、代码实现 附加包含目录&#xff1a;ImageMagick-7.…

Is exchanging integral and sum this way allowed?

See https://math.stackexchange.com/questions/3878856/is-exchanging-integral-and-sum-this-way-allowed#:~:textYes%2C%20and%20the%20reason%20is%20simple%20-%20the,just%20a%20whole%20lot%20of%20these%20squeezed%20together.

涉密U盘管理:公司禁用个人U盘的两种常规设置方法

古语云&#xff1a;“事以密成&#xff0c;语以泄败。”此言道出了保密工作对于事业成功的重要性。 在当今这个信息爆炸的时代&#xff0c;数据的安全与保密已成为企业生存与发展的基石。尤其是在处理涉密信息时&#xff0c;任何微小的疏忽都可能引发严重的后果。 因此&#x…

zabbix7.0TLS-04-快速入门-监控项

文章目录 1 概述2 查看一个主机的所有监控项3 添加新的监控项3.1 监控项 各个配置项详解3.2 测试配置项3.3 添加成功 1 概述 一个监控项对应了一个键和值。监控项是监控数据的来源&#xff0c;没有监控项也就没有监控数据。 监控项必须添加到某一个主机中&#xff0c;一个主机…

学习日志8.8--防火墙状态检测

在之前的拓扑实验中手动配置了安全策略&#xff0c;允许trust到untrust之间进行通信&#xff0c;也允许untrust到trust之间进行通信。意味着&#xff0c;防火墙是支持单方向管控的&#xff0c;意思是inbound和outbound方向的流量管控需要分别配置。 当在配置trust到untrust的安…

【人工智能】【机器学习】-好书推荐之《Python神经网络编程》

目录 内容概览 编程环境 面向对象 学习目标 如果你是想要自学机器学习相关知识的读者&#xff0c;我相信看完这篇文章的介绍后&#xff0c;你会对机器学习有更清晰的认识。帮助你走进机器学习的殿堂。 《Python神经网络编程》&#xff08;原书名&#xff1a;Make Your Own …

STM32基础篇:I2C通信协议

I2C总线 I2C&#xff08;IIC---Inter Integrated Circuit 内部集成电路&#xff09; 以上为I2C大体结构图&#xff0c;其中时钟线SCL用于传输时钟信号&#xff0c;数据线SDA来传输实际的数据。 主机与从机 1.主机的职责 假如由从机1和从机2&#xff0c;从机1想向SDA上发送一…