【C语言】C语言经典小游戏:贪吃蛇(上)
文章目录
- 一、游戏背景及其功能
- 二、Win32 API介绍
- 1、Win32 API
- 2、控制台程序
- 3、定位坐标(COORD)
- 4、获得句柄(GetStdHandle)
- 5、获得光标属性(GetConsoleCursorInfo)
- 1)描述光标属性(CONSOLE_CURSOR_INFO)
- 6、设置光标属性(SetConsoleCursorInfo)
- 7、设置光标位置(SetConsoleCursorPosition )
- 1)封装函数SetPos
- 8、检测按键状态(GetAsyncKeyState)
- 三、贪吃蛇游戏设计与分析
- 1、地图
- 1)<locale.h>本地化
- 2)类项
- 3)setlocale函数
- 4)宽字符的打印
- 5)地图坐标
- 2、蛇⾝和⻝物
- 3、数据结构设计
- 4、游戏流程设计
一、游戏背景及其功能
贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。
在这里我们将使⽤C语⾔在Windows环境的控制台中模拟实现经典⼩游戏贪吃蛇。
实现基本的功能:
- 贪吃蛇地图绘制
- 蛇吃⻝物的功能(上、下、左、右⽅向键控制蛇的动作)
- 蛇撞墙死亡
- 蛇撞⾃⾝死亡
- 计算得分
- 蛇⾝加速、减速
- 暂停游戏
在编写这个游戏之前,需要我们掌握C语⾔函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等相关知识,在我的博客中除了Win32 API以外其余知识都有详细的讲解,在这里我们将来学习Win32 API的知识。
二、Win32 API介绍
Win32 API对我们来说是一个全新的内容,因此将在这里对其进行全面讲解。
1、Win32 API
Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application),所以便称之为Application Programming Interface,简称API函数。
Win32 API 也就是Microsoft Windows 32位平台的应⽤程序编程接⼝。
2、控制台程序
平常我们运⾏起来的⿊框程序其实就是控制台程序。
- 我们可以输入cmd命令来设置控制台窗⼝的⻓和宽。
例如:将控制台窗口的⼤⼩设置为30⾏,100列。
mode con cols=100 lines=30
参考:mode命令
- 也可以通过cmd命令来设置控制台窗⼝的名字。
title 贪吃蛇
如图:
参考:title命令
- 这些能在控制台窗⼝执⾏的命令,也可以调⽤C语⾔函数
system
来执⾏。
例如:
#include<stdio.h>
int main()
{//设置控制台的长宽system("mode con cols=30 lines=30");//设置控制台名称system("title 贪吃蛇");return 0;
}
运行结果:
3、定位坐标(COORD)
COORD
是Windows API中定义的⼀个结构体,表⽰⼀个字符在控制台上的坐标,坐标(0,0)位于缓冲区的顶部左侧单元格。
如图:
注意: 使用Windows API 中的内容时需要包含头文件#include<windows.h>
。
COORD类型的声明:
typedef struct _COORD
{SHORT X;SHORT Y;
}COORD, * PCOORD;
- 使用COORD来表示一个字符在控制台上的坐标。
COORD pos = { 10, 15 };
4、获得句柄(GetStdHandle)
GetStdHandle
是⼀个Windows API函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄,使⽤这个句柄可以操作设备。
函数原型:
HANDLE GetStdHandle(DWORD nStdHandle);
举例:获得输出句柄。
int main()
{//获得输出句柄HANDLE hOutput = NULL;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);return 0;
}
5、获得光标属性(GetConsoleCursorInfo)
GetConsoleCursorInfo
也是一个Windows API 函数,用来获取控制台光标的属性(光标大小、可见性等等)。
函数原型:
BOOL WINAPI GetConsoleCursorInfo(HANDLE hConsoleOutput,PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
注:
PCONSOLE_CURSOR_INFO
是指向CONSOLE_CURSOR_INFO
结构的指针,该结构接收有关光标的信息。
函数的使用:
int main()
{//获得输出句柄HANDLE hOutput = NULL;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//获取光标信息 CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(hOutput, &CursorInfo);return 0;
}
1)描述光标属性(CONSOLE_CURSOR_INFO)
CONSOLE_CURSOR_INFO
是 Windows API 中的一个结构体,用于描述控制台光标的属性。
结构体的声明:
typedef struct _CONSOLE_CURSOR_INFO {DWORD dwSize;BOOL bVisible;
} CONSOLE_CURSOR_INFO, * PCONSOLE_CURSOR_INFO;
- dwSize:光标在屏幕上的大小。此值介于1到100之间,是光标高度占字符单元格高度的百分比。
- bVisible:光标的可见性。如果光标可⻅为TRUE,不可见为FALSE。
CursorInfo.bVisible = FALSE; //隐藏控制台光标
6、设置光标属性(SetConsoleCursorInfo)
SetConsoleCursorInfo
是 Windows API 中的一个函数,用于设置控制台光标的属性(大小和可见性)。它一般与 GetConsoleCursorInfo
配合使用。
函数原型:
BOOL WINAPI SetConsoleCursorInfo(HANDLE hConsoleOutput,const CONSOLE_CURSOR_INFO* lpConsoleCursorInfo
);
函数的使用:
int main()
{//获得输出句柄HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//获取光标信息 CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(hOutput, &CursorInfo);//设置光标状态 CursorInfo.bVisible = FALSE; //隐藏控制台光标 SetConsoleCursorInfo(hOutput, &CursorInfo);
}
运行结果:
可以看到此时光标已经被隐藏了。
7、设置光标位置(SetConsoleCursorPosition )
SetConsoleCursorPosition
是 Windows API 中的一个函数,用于设置控制台屏幕缓冲区中光标的位置。
函数原型:
BOOL WINAPI SetConsoleCursorPosition(HANDLE hConsoleOutput,COORD pos
);
函数的使用:
int main()
{//坐标COORD pos = { 10, 5 };//获得输出句柄HANDLE hOutput = NULL; hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//设置光标的位置为坐标pos SetConsoleCursorPosition(hOutput, pos);return 0;
}
运行结果:
可以看到此时光标的位置已经被设置到(10,5)这个坐标了。
1)封装函数SetPos
- 如果想要让光标出现在指定的坐标位置,那么我们就可以将上述代码封装为一个函数
SetPos
。
void SetPos(short x, short y)
{ //取得坐标COORD pos = { x, y };//获得输出句柄HANDLE hOutput = NULL;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//设置光标位置SetConsoleCursorPosition(hOutput, pos);
}
8、检测按键状态(GetAsyncKeyState)
GetAsyncKeyState
是 Windows API 中的一个函数,用于检测某个按键或鼠标按钮的当前状态。
函数原型:
SHORT GetAsyncKeyState(int vKey);
将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。
GetAsyncKeyState
的返回值是short类型,在调⽤ GetAsyncKeyState
函数后,如果返回的16位short数据中,如果最低位被置为1则说明,该按键被按过,否则为0。
- 因此如果我们要判断⼀个键是否被按过,可以检测
GetAsyncKeyState
函数的返回值最低位是否为1。将其定义为一个宏。
#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )
参考:虚拟键码
实例: 检测数字键
#include <stdio.h>
#include <windows.h>#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )int main()
{while (1){if (KEY_PRESS(0x30)){printf("0\n");}else if (KEY_PRESS(0x31)){printf("1\n");}else if (KEY_PRESS(0x32)){printf("2\n");}else if (KEY_PRESS(0x33)){printf("3\n");}else if (KEY_PRESS(0x34)){printf("4\n");}else if (KEY_PRESS(0x35)){printf("5\n");}else if (KEY_PRESS(0x36)){printf("6\n");}else if (KEY_PRESS(0x37)){printf("7\n");}else if (KEY_PRESS(0x38)){printf("8\n");}else if (KEY_PRESS(0x39)){printf("9\n");}}return 0;
}
运行结果:
当我们按下数字键后就会在控制台上面显示出来,而按到其他键时则不会显示。
三、贪吃蛇游戏设计与分析
1、地图
我们最终的贪吃蛇界面应该实现下面的效果,那我们的地图该如何布置呢?
如果想在控制台窗⼝中的指定位置输出信息,我们得知道
该位置的坐标。
控制台窗⼝的坐标如下所⽰,横向的是X轴,纵向是Y轴。
在游戏地图上,我们打印墙体使⽤宽字符:□,打印蛇使⽤宽字符●,打印⻝物使⽤宽字符★。
普通的字符是只占1个字节,而上述这类宽字符需要占2个字节。
这⾥再简单的讲⼀下C语⾔的国际化特性相关的知识,过去C语⾔并不适合⾮英语国家(地区)使⽤。
C语⾔最初假定字符都是单字节的。但是这些假定并不是在世界的任何地⽅都适⽤。
后来为了使C语⾔适应国际化,C语⾔的标准中不断加⼊了国际化的⽀持。⽐如:加⼊了宽字符的类型wchar_t
和宽字符的输⼊和输出函数,加⼊了<locale.h>
头⽂件,其中提供了允许程序员针对特定地区(通常是国家或者说某种特定语⾔的地理区域)调整程序⾏为的函数。
1)<locale.h>本地化
<locale.h>
提供的函数⽤于控制C标准库中对于不同的地区会产⽣不⼀样⾏为的部分。
在标准中,依赖地区的部分有以下⼏项:
- 数字量的格式
- 货币量的格式
- 字符集
- ⽇期和时间的表⽰形式
2)类项
通过修改地区,程序可以改变它的⾏为来适应世界的不同区域。但地区的改变可能会影响库的许多部分,其中⼀部分可能是我们不希望修改的。所以C语⾔⽀持针对不同的类项进⾏修改,下⾯不同的宏指定不同的类项:
- LC_COLLATE:影响字符串⽐较函数
strcoll()
和strxfrm()
。 - LC_CTYPE:影响字符处理函数的⾏为。
- LC_MONETARY:影响货币格式。
- LC_NUMERIC:影响
printf()
的数字格式。 - LC_TIME:影响时间格式
strftime()
和wcsftime()
。 - LC_ALL:针对所有类项修改,将以上所有类别设置为给定的语⾔环境。
每个类项的详细说明,请点击参考
3)setlocale函数
函数原型:
char* setlocale (int category, const char* locale);
setlocale 函数⽤于修改当前地区,可以针对⼀个类项修改,也可以针对所有类项。
setlocale 函数的第⼀个参数可以是前⾯说明的类项中的⼀个,那么每次只会影响⼀个类项,如果第⼀个参数是LC_ALL,就会影响所有的类项。
C标准给第⼆个参数仅定义了2种可能取值:"C"
(正常模式)和" "
(本地模式)。
在任意程序执⾏开始,都会隐藏式执⾏调⽤:
setlocale(LC_ALL, "C");
当地区设置为"C"时,库函数按正常⽅式执⾏,⼩数点是⼀个点。
当程序运⾏起来后想改变地区,就只能显⽰调⽤setlocale函数。⽤" "
作为第2个参数,调⽤setlocale函数就可以切换到本地模式,这种模式下程序会适应本地环境。
⽐如:切换到我们的本地模式后就⽀持宽字符(汉字)的输出等。
setlocale(LC_ALL, " ");
4)宽字符的打印
那如果想在屏幕上打印宽字符,怎么打印呢?
宽字符的字⾯量必须加上前缀“L”,否则C语⾔会把字⾯量当作窄字符类型处理。
前缀“L”在单引号前⾯,表⽰宽字符,对应 wprintf()
的占位符为 %lc
;
在双引号前⾯,表⽰宽字符串,对应wprintf()
的占位符为 %ls
。
#include <stdio.h>
#include<locale.h>int main()
{setlocale(LC_ALL, "");wchar_t ch1 = L'●';wchar_t ch2 = L'□';wchar_t ch3 = L'张';wprintf(L"%lc\n", ch1);wprintf(L"%lc\n", ch2);wprintf(L"%lc\n", ch3);printf("%c%c\n", 'a', 'b');return 0;
}
注: 我们需要以管理员的身份打开VS再运行代码才可以观察得更明显。
运行结果:
从输出的结果来看,我们发现一个普通字符占1个字符的位置,但是⼀个宽字符会占⽤2个字符的位置,因此如果我们要在贪吃蛇中使⽤宽字符,就得处理好地图上坐标的计算。
普通字符和宽字符打印出宽度的展⽰如下:
5)地图坐标
我们假设实现⼀个棋盘27⾏,58列的棋盘,再围绕地图画出墙,
如下:
2、蛇⾝和⻝物
初始化状态,假设蛇的⻓度是5,蛇⾝的每个节点是●,在固定的⼀个坐标处,⽐如(24,5)处开始出现蛇,连续5个节点。
- 注意: 蛇的每个节点的x坐标必须是2的倍数,否则可能会出现蛇的⼀个节点有⼀半⼉出现在墙体中,另外⼀般在墙外的现象,坐标不好对⻬。
关于⻝物,就是在墙体内随机⽣成⼀个坐标(x坐标必须是2的倍数),坐标不能和蛇的⾝体重合,然后打印★。
3、数据结构设计
在游戏运⾏的过程中,蛇每次吃⼀个⻝物,蛇的⾝体就会变⻓⼀节,如果我们使⽤链表存储蛇的信息,那么蛇的每⼀节其实就是链表的每个节点。每个节点只要记录好蛇⾝节点在地图上的坐标就⾏,所以蛇身的节点结构如下:
typedef struct SnakeNode
{int x;int y;struct SnakeNode* next;
}SnakeNode, * pSnakeNode;
- pSnakeNode是结构体指针,等价于
typedef struct SnakeNode* pSnakeNode;
要管理整条贪吃蛇,我们再封装⼀个Snake的结构来维护整条贪吃蛇:
typedef struct Snake
{pSnakeNode _pSnake;//指向蛇头的指针pSnakeNode _pFood;//指向食物节点的指针enum DIRECTION _dir;//蛇的方向enum GAME_STATUS _status;//游戏的状态int _food_weight;//一个食物的分数int _score;//总成绩int _sleep_time;//休息时间,时间越短,速度越快
}Snake, * pSnake;
- 蛇的⽅向,可以⼀⼀列举,使⽤枚举:
enum DIRECTION
{UP = 1,//上DOWN,//下LEFT,//左RIGHT//右
};
- 游戏状态,可以⼀⼀列举,使⽤枚举:
enum GAME_STATUS
{OK,//正常运行KILL_BY_WALL,//撞墙KILL_BY_SELF,//咬到自己END_NOMAL//正常结束
};
4、游戏流程设计
现在我们已经把贪吃蛇大致的步骤梳理了一遍,了解完上述知识后,接着在下篇文章就开始编写方法来实现整个游戏。
相关文章:

【C语言】C语言经典小游戏:贪吃蛇(上)
文章目录 一、游戏背景及其功能二、Win32 API介绍1、Win32 API2、控制台程序3、定位坐标(COORD)4、获得句柄(GetStdHandle)5、获得光标属性(GetConsoleCursorInfo)1)描述光标属性(CO…...
usbutils工具的使用帮助
作为嵌入式系统开发中的常用工具,usbutils 是一套用于管理和调试USB设备的Linux命令行工具集。以下是其核心功能和使用方法的详细说明: 1. 工具组成 核心命令: lsusb:列出所有连接的USB设备及详细信息(默认安装&#…...

vue2中使用jspdf插件实现页面自定义块pdf下载
pdf下载 实现pdf下载的环境安装jspdf插件在项目中使用 实现pdf下载的环境 项目需求案例背景,点击【pdf下载】按钮,弹出pdf下载弹窗,显示需要下载四个模块的下载进度,下载完成后,关闭弹窗即可! 项目使用的是…...

如何防止服务器被用于僵尸网络(Botnet)攻击 ?
防止服务器被用于僵尸网络(Botnet)攻击是关键的网络安全措施之一。僵尸网络是黑客利用大量被感染的计算机、服务器或物联网设备来发起攻击的网络。以下是关于如何防止服务器被用于僵尸网络攻击的技术文章: 防止服务器被用于僵尸网络ÿ…...

基于cornerstone3D的dicom影像浏览器 第二十九章 自定义菜单组件
文章目录 前言一、程序结构1. 菜单数据结构2. XMenu.vue3. XSubMenu.vue4. XSubMenuSlot.vue5. XMenuItem.vue 二、调用流程总结 前言 菜单用于组织程序功能,为用户提供导航。是用户与程序交互非常重要的接口。 开源组件库像Element Plus和Ant Design中都提供了功能…...

【Block总结】DBlock,结合膨胀空间注意模块(Di-SpAM)和频域模块Gated-FFN|即插即用|CVPR2025
论文信息 标题: DarkIR: Robust Low-Light Image Restoration 作者: Daniel Feijoo, Juan C. Benito, Alvaro Garcia, Marcos Conde 论文链接:https://arxiv.org/pdf/2412.13443 GitHub链接:https://github.com/cidautai/DarkIR 创新点 DarkIR提出了…...
【学习笔记】单例类模板
【学习笔记】单例类模板 一、单例类模板 以下为一个通用的单例模式框架,这种设计允许其他类通过继承Singleton模板类来轻松实现单例模式,而无需为每个类重复编写单例实现代码。 // 命名空间(Namespace) 和 模板(Tem…...
字符串加密(华为OD)
题目描述 给你一串未加密的字符串str,通过对字符串的每一个字母进行改变来实现加密,加密方式是在每一个字母str[i]偏移特定数组元素a[i]的量,数组a前三位已经赋值:a[0]=1,a[1]=2,a[2]=4。当i>=3时,数组元素a[i]=a[i-1]+a[i-2]+a[i-3]。例如:原文 abcde 加密后 bdgkr,…...

口罩佩戴检测算法AI智能分析网关V4工厂/工业等多场景守护公共卫生安全
一、引言 在公共卫生安全日益受到重视的当下,口罩佩戴成为预防病毒传播、保障人员健康的重要措施。为了高效、精准地实现对人员口罩佩戴情况的监测,AI智能分析网关V4口罩检测方案应运而生。该方案依托先进的人工智能技术与强大的硬件性能,…...

Double/Debiased Machine Learning
独立同步分布的观测数据 { W i ( Y i , D i , X i ) ∣ i ∈ { 1 , . . . , n } } \{W_i(Y_i,D_i,X_i)| i\in \{1,...,n\}\} {Wi(Yi,Di,Xi)∣i∈{1,...,n}},其中 Y i Y_i Yi表示结果变量, D i D_i Di表示因变量, X i X_i Xi表…...

HarmonyOS Next 弹窗系列教程(4)
HarmonyOS Next 弹窗系列教程(4) 介绍 本章主要介绍和用户点击关联更加密切的菜单控制(Menu) 和 气泡提示(Popup) 它们出现显示弹窗出现的位置都是在用户点击屏幕的位置相关 菜单控制(Menu&…...

【C】-递归
1、递归概念 递归(Recursion)是编程中一种重要的解决问题的方法,其核心思想是函数通过调用自身来解决规模更小的子问题,直到达到最小的、可以直接解决的基准情形(Base Case)。 核心:自己调用…...

飞马LiDAR500雷达数据预处理
0 引言 在使用飞马D2000无人机搭载LiDAR500进行作业完成后,需要对数据进行预处理,方便给内业人员开展点云分类等工作。在开始操作前,先了解一下使用的软硬件及整体流程。 0.1 外业测量设备 无人机:飞马D2000S激光模块ÿ…...
Kerberos面试内容整理-在 Linux/Windows 中的 Kerberos 实践
Windows 实践: 在Windows环境中,Kerberos 几乎是无形融合的。用户使用域账号登录计算机时,实际上就完成了Kerberos的AS认证并获取TGT;此后的资源访问(如共享文件夹、打印机、数据库等)都会自动使用Kerberos进行验证,而无需用户干预。Windows通过LSASS进程维护和缓存用户…...
在 Allegro PCB Editor 中取消(解除或删除)已创建的 **Module** 的操作指南
在 Allegro PCB Editor 中取消(解除或删除)已创建的 Module 有两种主要场景,操作也不同: 📌 场景一:仅想解除元件与 Module 的关联(保留元件位置和布线,但可独立编辑) …...
基于springboot的校园社团信息系统的设计与实现
其他源码获取可以看首页:代码老y 个人简介:专注于毕业设计项目定制开发:springbootvue系统,Java微信小程序,javaSSM系统等技术开发,并提供远程调试部署、代码讲解、文档指导、ppt制作等技术指导。源码获取&…...
nodejs里面的http模块介绍和使用
Node.js的http模块是构建在libuv库之上,以JavaScript接口形式暴露出来的核心模块之一,它允许开发者轻松地创建和管理HTTP服务器及客户端,进而实现网络应用的快速开发。此模块的设计理念围绕着事件驱动和非阻塞I/O模型,这些特性使N…...
mamba架构和transformer区别
Mamba 架构和 Transformer 架构存在多方面的区别,具体如下: 计算复杂度1 Transformer:自注意力机制的计算量会随着上下文长度的增加呈平方级增长,例如上下文增加 32 倍时,计算量可能增长 1000 倍,在处理长序…...

嵌入式鸿蒙开发环境搭建操作方法与实现
Linux环境搭建镜像下载链接: 链接:https://pan.baidu.com/s/1F2f8ED5V1KwLjyYzKVx2yQ 提取码:Leun vscode和Linux系统连接的详细过程1.下载Visual Studio Code...
在 Spring Boot 中使用 WebFilter:实现请求拦截、日志记录、跨域处理等通用逻辑!
💡 前言 在开发 Web 应用时,我们经常需要对所有请求进行统一处理,例如: 记录请求日志实现跨域(CORS)接口权限控制请求参数预处理防止 XSS 攻击 这些功能如果都写在每个 Controller 或 Service 里&#x…...
CSS预处理器:Sass与Less的语法和特性(含实际案例)
Sass(SCSS语法示例) 1. 变量:统一管理颜色 // 定义变量 $primary-color: #1a237e; $success-color: #4caf50; $font-size-base: 16px;// 实际应用 body {color: $primary-color;font-size: $font-size-base; }.button {background: $succes…...

QT常用控件(1)
控件是构成QT的基础元素,例如Qwidget也是一个控件,提供了一个‘空’的矩形,我们可以往里面添加内容和处理用户输入,例如:按钮(QpushButton),基础显示控件(Lableÿ…...

明基编程显示器终于有优惠了,程序员快来,错过等一年!
最近618的活动已经陆续开始了,好多人说这是买数码产品的好时候,作为一名资深程序员,我做了不少功课,决定给自己升级办公设备,入手明基 RD 系列的显示器,这是市面上首家专注于我们程序员痛点和需求的产品&am…...

【计算机网络】非阻塞IO——select实现多路转接
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:计算机网络 🌹往期回顾🌹:【计算机网络】NAT、代理服务器、内网穿透、内网打洞、局域网中交换机 🔖流水不争࿰…...
Figma 中构建 Master Control Panel (MCP) 的完整设计方案
以下是在 Figma 中构建 Master Control Panel (MCP) 的完整设计方案,专为设计系统管理而优化: 一、MCP 核心功能架构 #mermaid-svg-iZAnYxyYU4BtpeaE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merma…...
什么是权威解析服务器?权威解析服务器哪些作用?
域名系统(DNS)是互联网的核心基础设施之一,它将易于记忆的域名转换为计算机能够识别的IP地址。DNS服务器在这一过程中扮演着至关重要的角色,它们可以分为以下几种类型: 根DNS服务器 根DNS服务器位于DNS层级结构的最顶端…...

LeetCode--23.合并k个升序链表
解题思路: 1.获取信息: 给出了多个升序链表,要求合并成一个升序链表,返回首元结点 2.分析题目: 外面在21题的时候,讲了怎样合并两个升序链表为一个升序链表,不了解的,建议去看一下21…...
ComfyUI 工作流
目录 🧠 ComfyUI 是什么? ComfyUI 的特点 🔧 ComfyUI 工作流程(节点图) 📌 简单理解 如何安装? 🧠 ComfyUI 是什么? ComfyUI 是一个 Stable Diffusion 的图形化用户界面(GUI),专门用来生成图像。它通过 节点图(Node Graph)形式来让用户定义图像生成的每…...
使用glide 同步获取图片
在 Glide 中,可以使用asBitmap()方法来获取图片的Bitmap对象,进而同步地加载图片。以下是具体示例: String imageUrl "https://example.com/image.jpg"; Bitmap bitmap Glide.with(context).asBitmap().load(imageUrl).apply(ne…...

【推荐算法】NeuralCF:深度学习重构协同过滤的革命性突破
NeuralCF:深度学习重构协同过滤的革命性突破 一、算法背景知识:协同过滤的演进与局限1.1 协同过滤的发展历程1.2 传统矩阵分解的缺陷 二、算法理论/结构:NeuralCF架构设计2.1 基础NeuralCF结构2.2 双塔模型进阶结构2.3 模型实现流程对比 三、…...