简单贪吃蛇小游戏的设计与实现

news2025/2/5 12:35:16

文章目录

  • 1、知识预备
    • 1.1 WIN32 API
      • 1.1.1 什么是WIN32 API
      • 1.1.2 了解部分WIN32 API
        • 1.1.2.1 控制台坐标
        • 1.1.2.2 控制台光标
        • 1.1.2.3 获取键盘按键情况
    • 2.1 宽字符
      • 2.1.1 C语言的国际化
      • 2.1.2 宽字符的打印
  • 2、 贪吃蛇游戏设计
    • 2.1 游戏开始
    • 2.2 游戏运行
      • 2.2.1 更新分数
      • 2.2.2 按键检测
      • 2.2.3 蛇的移动
    • 2.3 游戏结束
    • 2.4 游戏主逻辑的实现
  • 3、游戏最终效果

1、知识预备

1.1 WIN32 API

1.1.1 什么是WIN32 API

众所周知,Windows是一个操作系统,但同时它也是一个很大的服务中心,包含各种各样的服务,这些服务实质上就是函数,而由于这些函数服务的对象是应用程序,即Application,所以便把这些服务称为Appliication Programming Interface,简称API。WIN32 API 即Windows32位平台下的应用程序编程接口。

1.1.2 了解部分WIN32 API

1.1.2.1 控制台坐标

我们这个简单贪吃蛇小游戏的实现,是在控制台窗口中实现的,那么如何在VS中调出控制台窗口呢?

我们首先开启调试,将正常情况下的Windows终端打开,然后在最上端按鼠标右键转到设置,如下所示:
在这里插入图片描述

打开设置窗口后,找到这个选项:
在这里插入图片描述
将其由Windows终端改为Windows控制台主机,然后保存更改,这样之后无论是程序的调试还是正常执行,都是使用控制台窗口。至于为什么要使用控制台窗口,这是因为无论是之后所介绍的API的使用,还是想要对窗口大小、名称进行相应设置,都需要在控制台窗口中才可以完成。

在这里插入图片描述

在这里插入图片描述

这样,我们就成功打开了控制台窗口。

考虑到后续的游戏设计,此处大家必须对整个控制台的位置坐标有一个基本的了解。
整个控制台,左上角为0行0列,注意横为行,纵为列,其中,行代表的是纵坐标,列代表的是横坐标,所以画成一个坐标系的话就是这样:

在这里插入图片描述
那我们是如何去管理控制台的这些具体位置呢?
这就涉及到WIN32 API中定义的一个结构体COORD,表示一个字符在控制台屏幕上的坐标。

typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, *PCOORD;

我们可以看到,这个结构体中有两个成员变量,一个代表横坐标x,另一个代表纵坐标y,即控制台中的横纵坐标

1.1.2.2 控制台光标

我们去定位控制台的坐标,想要实现在特定的坐标处打印相应的内容,这实际上是通过定位光标实现的.
WIN32 API中有为控制台的光标专门封装了一个结构体,用来管理光标的相应信息.

CONSOLE_CURSOR_INFO
这个结构体,包含有关控制台光标的信息
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize;
BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
注:
dwSize是用来设置光标填充字符单元格的百分比的,此值介于1到100之间,从单元格底部的水平线条到完全填充单元格。
bVisible恰如其名,是用来控制光标是否可见,类型是BOOL类型,因此true为可见,false为不可见。

那我们如何获得控制台上的光标信息,又如何对这个光标信息进行修改,更重要的是如何对这个光标进行定位呢?

这就涉及到句柄的问题了。
句柄实质上就是一个用来标识对象或者项目的标识符,从用途上讲,获得了相应设备的句柄,我们就可以通过这个句柄对相应的设备进行操作。最常见的标准设备有两种:键盘和屏幕(即控制台窗口)。键盘对应标准输入,而屏幕则对应标准错误和标准输出。

要想获得句柄,就要使用一个专门用于获取句柄的函数:

HANDLE WINAPI GetStdHandle(
In DWORD nStdHandle
);
其中函数参数可取以下三种:
STD_INPUT_HANDLE 用于读取键盘的输入
STD_OUTPUT_HANDLE 用于输出,即对控制台进行相应的控制
STD_ERROR_HANDLE 标准错误设备

返回值类型HANDLE实质上是void* 类型,只不过被重命名了。

在这里插入图片描述

获取句柄的实例:

在这里插入图片描述

成功获取了句柄之后,我们就可以对控制台的光标进行相应的设置了。

在这里插入图片描述

在这里插入图片描述

除了调整光标的填充度和可见度,我们还可以设置光标的位置。

在这里插入图片描述

在这里插入图片描述

在后接的游戏涉及中,我们需要频繁设置光标位置,因此我们将光标位置设置的相关程序封装成一个函数SetPos.

在这里插入图片描述

1.1.2.3 获取键盘按键情况

SHORT GetAsyncKeyState(
int vKey
);

我们使用GetAsyncKeyState这个函数来实时获取键盘的按键情况.
使用这个函数时,我们需要将键盘按键对应的虚拟值传递给函数,对于不同的按键状态,函数会有不同情况的返回值进行对应.
返回值是一个16位的short类型数据.如果最高位是1,说明按键的状态是按下;如果最高位是0,说明按键的状态是抬起.而要判断按键是否按过(即按下后松手弹起),则通过最低位来进行判断,如果最低位被置为1,则说明按过;如果最低位是0,则说明没有按过.

我们在贪吃蛇小游戏中,要判断的是这个按键是否按过,因此我们需要对这个函数返回值的最低位进行判断.由于按键是否按过在贪吃蛇游戏中需要频繁进行判断,即需要频繁调用该函数,同时需要频繁对该函数的返回值进行判断,因此我们将这个判断的流程写成一个宏函数.

在这里插入图片描述

相关参考:

WINDOWS下的虚拟键码表
GetStdHandle
GetConsoleCursorInfo
SetConsoleCursorInfo
SetConsoleCursorPosition
GetAsyncKeyState

2.1 宽字符

2.1.1 C语言的国际化

C语言字符默认是采用ASCII编码的,而ASCII字符集采用的是单字节编码,且只使用了单字节中的低七位,最高位是没有使用的,这样总共能编码128个字符。但是在一些欧洲国家的语言中,128个字符是不够用的,因此一些欧洲国家就决定,再利用单字节中闲置的最高位进行编码,这样总共能编码256个字符,基本够用了。

但是对于亚洲国家而言,这显然是不够的,比如说中国,光汉字就多达十万左右。一个字节最多只能表示256个字符,所以必须用多个字节进行表示。比如,简体中文常见的编码方式GB2312,就是使用两个字节表示一个汉字,这样理论上最多可以表示65536个字符,满足日常的需求已经足够了。

而为了更好地适应C语言的国际化,C语言的标准中不断加入了国际化的支持。比如:加入了宽字符类型wchar_t 以及宽字符的输入和输出函数;还加入了locale.h头文件,其中提供了程序员针对特定地区调整程序行为的函数。

setlocale函数
char *setlocale(int category, const char *locale)
setlocale函数用来使程序行为本地化,可以针对一个类项进行修改,也可以针对所有类项。
该函数中的第一个参数就是要修改的类项,不同的类项名称不同,如果要修改所有类项,则使用LC_ALL。
该函数的第二个参数只有两种取值“C”和“”(即空字符串),当取值为"C"时,库函数按照默认方式执行;而当取值为“”时,便会切换到本地模式,程序会适应本地环境。注意,程序会默认执setlocale(LC_ALL,“C”)。

2.1.2 宽字符的打印

对于宽字符类型的数据,我们需要使用宽字符打印函数wprintf进行打印,不过宽字符类型的数据无论是定义还是打印时都需要加上一个字符L需要注意的是,要想正常实现宽字符的输入和输出,我们首先得使用setlocale函数,配置本地化。

在这里插入图片描述
前面提到了控制台窗口的坐标,那么一个宽字符在控制台窗口中占几行几列呢?
一个普通的char类型字符,即单字节字符,在控制台窗口中占一行一列;而一个二字节大小的宽字符,在控制台窗口中占一行两列。也就是说,宽字符相比于单字节字符,在横坐标,即x轴方向上多占一个单位,而在纵坐标,即y轴方向上,二者相同。

相关参考:
setlocale函数详解

2、 贪吃蛇游戏设计

2.1 游戏开始

我们最终要呈现的游戏效果如下所示:

这是第一个界面:

在这里插入图片描述

这是第二个界面:

在这里插入图片描述

这是第三个界面,同时也是我们的游戏界面:

在这里插入图片描述
第三个界面中,右侧文字为游戏说明文字,而左侧界面就是游戏界面,游戏界面可以分为三部分:墙体、蛇身和食物——这三种符号均用宽字符的形式进行打印。

所以,贪吃蛇游戏开始的设计流程如下:

  1. 首先,我们要调整控制台窗口。我们设想贪吃蛇的游戏地图大小为56 * 26,即横坐标方向上有28个方块(墙体),纵坐标方向上有26个方块,考虑到除墙体外,还有额外的文字说明,所以我们将控制台的窗口设置为100 * 30.
  2. 其次,在整个的游戏过程中,光标需要隐藏,防止光标对游戏效果造成影响。
  3. 最后,便是三个界面的依次打印,前两个界面打印完后,都需要添加system(“pasue”)和system(“cls”) 这两条语句,以实现按任意键继续以及清屏的功能。

整个游戏开始逻辑的代码如下:

在这里插入图片描述

考虑到游戏程序的编写过程中,需要频繁设置光标位置(即定位坐标),所以我们将光标位置的设置封装为一个函数。

在这里插入图片描述


前两个界面的代码实现如下:

在这里插入图片描述

在这里插入图片描述


第三个界面,我们要完成3个任务:打印地图、打印蛇以及打印第一个食物。

地图的打印,程序很简单,关键是要对于相关坐标计算清楚。控制台窗口行列,即纵横坐标,均从0开始,即0行0列开始,而要打印的墙体是宽字符,所以一个墙体,在纵坐标上占一个单位,在横坐标上占两个单位。所以地图的相应坐标范围应为:横坐标为0~55, 纵坐标为0 ~ 25.

在这里插入图片描述

在这里插入图片描述


接下来,便是蛇的打印。

在贪吃蛇中,我们使用什么结构来实现蛇呢?我们很容易能将蛇的一节节身体联想为单链表的一个个结点,因此我们使用链表这种数据结构来实现贪吃蛇。

首先,我们要将蛇身的结点封装成一个结构体,如下所示:

在这里插入图片描述

同时,贪吃蛇游戏中的这条贪吃蛇还会涉及到很多其它量:蛇走的方向、蛇走的快慢、蛇要吃的食物、每个食物的分数、所吃食物的总得分以及整个游戏的状态(比如说,蛇撞墙了,那么此时状态应为异常,即游戏应该终止)。

我们可以看到这一条贪吃蛇涉及到很多很多的量,为了便于管理和维护,我们将这些量全都封装到一个结构体中。

在这里插入图片描述

在这里插入图片描述

同时,我们将代表蛇身和食物的符号定义为标识符常量,方便程序的阅读。

在这里插入图片描述


这样,我们相关的准备工作便已进行完毕,可以开始蛇身的初始化以及打印。

我们知道,贪吃蛇游戏刚进入时,会在一定位置提供给你一条具有一定长度的蛇,所以我们要确定这个位置和长度。

一定的起始位置不妨定义为标识符常量:

在这里插入图片描述
蛇身的初始长度不妨定义为5,即包含5个链表结点。

注意:这里将POS_X定义为10,即定义为偶数,是有缘由的。因为无论是蛇身、墙体还是食物,都是宽字符,在横坐标上占两个单位,而横坐标从0开始,所以墙体相应的横坐标为0 ~ 1,2 ~ 3,…,54 ~ 55,我们可以发现,都是偶数开始的。而我们蛇身在横坐标上也是占两个单位,故蛇身的横向移动也是两个单位两个单位移动的,如果蛇身的起始位置不为偶数,那么撞墙时,就会出现蛇头一半在墙内,一半在墙外的情况,而这并不是我们所希望的.我们希望,蛇撞墙,便是蛇头与某个墙完全重合,故我们将蛇身的起始位置设为偶数。既然蛇身的起始位置为偶数,那么食物的横坐标起始位置也得为偶数,这样蛇才算完全吃到食物,而不会蛇头一半在食物里,一半在食物外。

初始化并打印贪吃蛇的相关代码如下:

在这里插入图片描述


打印完蛇身,最后要进行的是食物的打印。我们希望食物的生成是完全随机的,所以食物的横纵坐标我们使用rand函数进行生成,但同时,食物的坐标也有诸多限制——食物必须得在地图内且不能与墙重合,而且食物也不能与蛇身重合,最重要的是,食物的起始横坐标必须为偶数。

食物打印的代码如下所示:

在这里插入图片描述

通过以上这些过程,我们已成功实现游戏欢迎界面、游戏说明界面以及实际游戏界面中地图、蛇和食物的打印,即贪吃蛇游戏的开始流程GameStart设计完毕。

2.2 游戏运行

先观察一下我们的游戏界面:

在这里插入图片描述
游戏界面右方有一些信息,这些信息可以分为两类:一类是游戏的帮助信息(游戏规则的说明),另一类则是得分的记录,包括总得分和每个食物的分数。游戏的帮助信息只需要打印一次,而分数则需要不断更新。

所以,在正式进入游戏之前,我们还需要打印游戏的帮助信息,这个我们将其封装为一个函数。

在这里插入图片描述

现在,便正式进入游戏的模块。
游戏的模块可以分为三部分:分数的更新、按键的检测和蛇的移动。考虑到游戏模块是需要不断进行的,因此我们将整个游戏模块放在do-while循环中。

2.2.1 更新分数

更新分数的实现逻辑较为简单,将分数重新打印即可。

在这里插入图片描述但有一点需要注意,分数的更新,即重新打印,必须能够做到将上一次的分数完全覆盖,否则分数会出错。比如说,前一次的分数为10,后一次的分数为5,如果不做相应处理,而是直接打印,实际上显示的分数则为50,这就是没有完全覆盖带来的后果。这种情况,要想完全覆盖,可以在打印时设置数字所占的位数,以实现完全覆盖。正如上述代码,第二个printf函数中,我将数字所占位数设置为2(多的位数会自动补空格),并且设置为左对齐。

2.2.2 按键检测

在进行蛇的移动之前,我们首先要进行按键检测,因为有一些按键会对蛇的移动产生影响。

在讲述具体的程序之前,我们先将检测按键是否按过的程序定义为一个宏函数:

在这里插入图片描述
如果相应的按键按过,那么这个宏函数的结果为1,否则为0

接下来进行按键检测。我们有以下按键需要检测:

  1. 控制蛇上下左右移动的四个方向按键
  2. 控制蛇加速的F1键,控制蛇减速的F2键
  3. 游戏暂停的空格键,游戏退出的ESC键

方向键以及暂停、退出键的检测

在这里插入图片描述

注意上述方向的调整,方向不能任意变化,要确保蛇不会自己吃自己。
按空格键,游戏暂停;再按空格键,游戏继续。

加速与减速的设计:

蛇走的快慢,是通过睡眠时间的长短来调控的。由于我们将蛇走的逻辑设计为先睡一段时间再走,所以睡眠时间长,蛇走得就慢,睡眠时间短,蛇走得就快。

我们以睡眠时间来标记速度的挡位,总共分为7挡:50,100,150,200,250,300,350
其中200ms是初始挡位,即蛇的起始速度,从此速度开始,可以分别加速三档和减速三档。加速到50ms时,无法再加速,只能减速;减速到350ms时,无法再减速,只能加速。

不同的速度下,对应一个食物的分数也不同——速度快,食物分数高;速度慢,食物分数低。每加一次速,单个食物分数增加5分;每减一次速,单个食物分数减少5分。

具体的代码实现如下:

在这里插入图片描述

2.2.3 蛇的移动

按键检测完之后,就是蛇的移动。

在这里插入图片描述

蛇的移动该如何实现呢?
蛇身是由链表实现的,我们可以将蛇即将移动到的下一个位置看作一个蛇身结点,即重新malloc一个蛇身结点,而这个蛇身结点中,存储的是下一个位置的横纵坐标。在这种情况下,蛇的移动就变成了链表的头插与尾删,再将重新得到的链表遍历打印,即实现蛇走一步。

但是,我们还要考虑到蛇行进过程中的特殊情况。
如果蛇走到的下一个位置是食物,那么蛇吃食物,蛇身需要变长一节;如果蛇走到的下一个位置是墙体,蛇撞墙,游戏终止;如果蛇走到的下一个位置是蛇身的一节,蛇吃自己,那么游戏也要终止。
所以,根据蛇下一个位置坐标的情况,我们需要做出不同的处理,所以我们有以下的函数设计:

在这里插入图片描述

检测下一个位置的坐标是否为食物:

在这里插入图片描述

下一个坐标是食物,那么我们蛇就吃食物。注意,吃食物时,由于蛇身变长了一节,所以此时只需要进行链表头插,而不需要尾删。

在这里插入图片描述
注意:由于此时的蛇身打印,已经有之前打印好的蛇身作为基础,所以此时无需遍历打印蛇身,只需要将蛇即将走到的下一个位置打印上蛇身的图案即可。这样,我们就成功实现了蛇吃食物。

如果下一个位置不是食物,那么我们蛇就正常走一步,即链表头插和尾删,以及蛇身的打印。

在这里插入图片描述
注意,此处的打印也是在之前已经打印好的蛇身的基础上进行打印,所以不需要遍历打印,只需要进行一些修改——把蛇要走到的下一个位置打印为蛇身,蛇尾结点处打印两个空格进行覆盖。


如果下一个位置是食物的话,那么走到下一个位置肯定没问题;但如果下一个位置不是食物,蛇正常走一步,就有可能会撞到墙或者撞到自己,所以对于这种情况,我们需要进行额外的判断。

在这里插入图片描述
检测是否撞到墙,即拿蛇头结点的坐标与墙的坐标比对;检测是否撞到自身,即拿蛇头结点的坐标与蛇身剩余结点的坐标一个一个比对。

在这里插入图片描述

至此,贪吃蛇游戏运行的三大模块实现完毕。由于整个游戏的运行放在do-while循环中,所以要有循环条件,经过上述的分析,循环继续的条件显然为游戏的状态为OK.

在这里插入图片描述

2.3 游戏结束

游戏结束时,我们还需要进行相应的处理。
考虑到游戏结束的原因共有三种:主动退出、撞到墙以及撞到自己。所以相应地,我们也要有不同的对应说明。另外,在游戏结束后,我们还需要将蛇身的结点以及生成的食物所malloc出的堆区空间全部释放。

在这里插入图片描述

2.4 游戏主逻辑的实现

至此,我们游戏的三个核心函数GameStart()、GameRun()和GameEnd() 已经实现完毕,接下来便是在游戏的主逻辑中,将这三个函数串起来。

在这里插入图片描述


3、游戏最终效果

在这里插入图片描述

获取贪吃蛇游戏的全部代码,请访问博主的gitee仓库:简单的贪吃蛇小游戏实现

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

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

相关文章

mac中idea菜单工具栏没有git图标了

1.右击菜单工具栏 2.选中VCS,点击添加 3.搜索你要的工具,选中点击确定就添加了 4.回到上面一个界面,选中你要放到工具栏的工具,点击应用就好了 5.修改图标,快捷键或者右击选中编辑图标 6.选择你要的图标就好了

ElementPlus 自定义封装 el-date-picker 的快捷功能

文章目录 需求分析 需求 分析 我们看到官网上给出的案例如下,但是不太满足我们用户想要的快捷功能,因为不太多,因此需要我们自己封装一些,方法如下 外部自定义该组件的快捷内容 export const getPickerOptions () > {cons…

电子病历五级的Python编程基础实战

一、电子病历五级之路:机遇与挑战并存 在当今数字化医疗的浪潮下,电子病历五级成为医院迈向高质量发展的关键里程碑。它不仅象征着医院信息化建设的深度与广度,更是保障医疗服务质量、提升患者安全的核心要素。随着电子病历五级标准的深入推行…

VDA 学习手册

VDA(Verband der Automobilindustrie,德国汽车工业联合会)报文标准是专为汽车行业制定的电子数据交换(EDI)标准,用于支持供应链管理中的数据传输。它是由德国汽车工业联合会开发和维护的,广泛应…

cesium入门学习四

怎么加载地图效果文件,地图效果的显示。 学习总结: 1.cesium入门学习一-CSDN博客 2.cesium入门学习二-CSDN博客 3.cesium入门学习三-CSDN博客 1.怎么加载geojson文件,并在html中显示 1.1 geojson文件来源: DataV.GeoAtlas地理小…

前端开发 -- 自动回复机器人【附完整源码】

一&#xff1a;效果展示 本项目实现了一个简单的网页聊天界面&#xff0c;用户可以在输入框中输入消息&#xff0c;并点击发送按钮或按下回车键来发送消息。机器人会根据用户发送的消息内容&#xff0c;通过关键字匹配来生成自动回复。 二&#xff1a;源代码分享 <!DOCTYP…

2011-2019年各省总抚养比数据

2011-2019年各省总抚养比数据 1、时间&#xff1a;2011-2019年 2、来源&#xff1a;国家统计局 3、指标&#xff1a;行政区划代码、地区、年份、总抚养比(人口抽样调查)(%) 4、范围&#xff1a;31省 5、指标解释&#xff1a;总抚养比也称总负担系数。指人口总体中非劳动年…

【从零开始入门unity游戏开发之——C#篇34】C#匿名函数(delegate )和Lambda表达式

文章目录 一、匿名函数&#xff08;delegate &#xff09;1、什么是匿名函数&#xff1f;2、匿名函数的基本语法2.1 语法2.2 **没有参数的匿名函数&#xff1a;**2.3 **有参数的匿名函数&#xff1a;**2.4 **有返回值的匿名函数&#xff1a;** 3、匿名函数的使用示例3.1 作为参…

脱离电路图编程

SM0.0常开始终吸合 SM0.1&#xff08;特殊中继&#xff09; 常开&#xff1a;闭合一次再断开 常闭&#xff1a;断开一次再闭合 上述是依据电路图编程

人工智能及深度学习的一些题目

1、一个含有2个隐藏层的多层感知机&#xff08;MLP&#xff09;&#xff0c;神经元个数都为20&#xff0c;输入和输出节点分别由8和5个节点&#xff0c;这个网络有多少权重值&#xff1f; 答&#xff1a;在MLP中&#xff0c;权重是连接神经元的参数&#xff0c;每个连接都有一…

OpenGL变换矩阵和输入控制

在前面的文章当中我们已经成功播放了动画&#xff0c;让我们的角色动了起来&#xff0c;这一切变得比较有意思了起来。不过我们发现&#xff0c;角色虽然说是动了起来&#xff0c;不过只是在不停地原地踏步而已&#xff0c;而且我们也没有办法通过键盘来控制这个角色来进行移动…

【ArcGIS Pro】完整的nc文件整理表格模型构建流程及工具练习数据分享

学术科研啥的要用到很多数据&#xff0c;nc文件融合了时间空间数据是科研重要文件。之前分享过怎样将nc文件处理成栅格后整理成表格。小编的读者还是有跑不通整个流程的&#xff0c;再来做一篇总结篇&#xff0c;也分享下练习数据跟工具&#xff0c;如果还是弄不了的&#xff0…

linux-21 目录管理(一)mkdir命令,创建空目录

对linux而言&#xff0c;对一个系统管理来讲&#xff0c;最关键的还是文件管理。那所以我们接下来就来看看如何实现文件管理。当然&#xff0c;在文件管理之前&#xff0c;我们说过&#xff0c;文件通常都放在目录下&#xff0c;对吧&#xff1f;所以先了解目录&#xff0c;可能…

vulnhub jangow靶机

1.扫描靶机IP arp-scan -l如果扫不到靶机的话根据以下配置 启动时点击第二个 按回车 继续选择第二个 按e进入编辑 删除"recovery nomodeset" 在末尾添加"quiet splash rw init/bin/bash" Ctrlx 启动进入如下界面 passwd修改root密码 重启电脑登录root修…

惠普HP proliant DL380 G6服务器使用

惠普HP proliant DL380 G6服务器使用经历 前言 HP ProLiant DL380 G6是一款机架式服务器&#xff0c;标配1个Xeon E5504处理器。 已被列入“高耗能老旧通信设备淘汰指导目录” 配置 基本类别 类别 机架式 结构 2U 内存 内存类型 DDRIII 内存大小 4GB&#xff08;单条插槽…

java 斐波那契查找,涵盖原理、算法分析、实现细节、优缺点、应用场景等

一、定义 斐波那契查找&#xff08;Fibonacci Search&#xff09;是一种基于斐波那契数列的查找算法&#xff0c;适用于已排序的数组。它利用斐波那契数列的性质来减少比较次数&#xff0c;并且能够在某些条件下比二分查找更快。 更多优质资源推荐&#xff1a; http://sj.yso…

内网学习:工作组用户与权限

目录 一、本地用户组介绍本地工作组介绍用户与组的关系 二、四种用户类型及权限比较本地系统最高权限&#xff08;System账户&#xff09;特性Administrator与System账户的区别 本地最高管理员&#xff08;Administrator用户&#xff09;特性 本地普通管理员特性 本地普通用户特…

图片转成oled使用的字模数据

目录 oled尺寸 如何生成用到的图片 图片转字模 1.首先用Img2Lcd转成bmp单色图片 2.然后用PCtoLCD2002把单色图片转字模 oled尺寸 我使用0.96寸oled模块&#xff0c;对应着的分辨率是128*64&#xff0c;对应着宽高像素比128*64。所以不是随意一张图片就能用的&#xff0c;…

PTPVT 插值说明

文章目录 PTPVT 插值说明 PTPVT 插值说明PVT Hermite插值PVT 三次多项式插值PT 插值Sin轨迹测试结果PVT Hermite插值结果PVT 三次多项式插值结果PT 插值结果 用户轨迹测试结果PVT Hermite插值结果PT 插值结果 PTPVT 插值说明 PT模式&#xff1a; 位置-时间路径插值算法。 PVT模…

Mac安装多个版本node、java、python 等开发软件环境,安装、卸载、升级多个数据库

安装多个版本node、java、python 等开发软件环境 使用nvm&#xff08;Node.js Version Manager&#xff09;来管理多个Node.js版本。 使用jenv来管理多个Java版本。 使用pyenv来管理多个Python版本。 以下是安装和使用这些版本管理器的基本步骤&#xff1a; 1. 安装多个版本…