贪吃蛇- 隐藏光标的属性

devtools/2024/12/22 20:17:31/

目的

在编写贪吃蛇这样的文本模式游戏时,隐藏光标是一个常用的技巧,目的是为了提高用户体验和游戏的视觉表现。隐藏光标的属性目的主要包括以下几点:
1. **改善视觉效果**:

光标在屏幕上闪烁可能会分散玩家的注意力,尤其是在移动快速的贪吃蛇游戏中。隐藏光标可以让玩家更专注于游戏本身,而不是被光标干扰。


2. **避免混淆**:

在文本模式下,光标可能会与游戏中的字符混淆,尤其是当光标与游戏中的蛇或食物的字符颜色相同时。隐藏光标可以避免这种混淆,确保游戏的清晰度。


3. **保持游戏界面的整洁**:

贪吃蛇游戏通常有一个简洁的游戏界面,光标的存在可能会破坏这种简洁性。隐藏光标有助于保持游戏界面的整洁和统一。


4. **技术限制**:

在某些情况下,显示光标可能会影响游戏的刷新速度或响应时间。隐藏光标可以减少这种技术限制的影响,使得游戏运行更加流畅。


在C语言或其他编程语言中,通常会使用特定的系统调用来隐藏光标。例如,在Windows操作系统的命令行界面中,可以使用 `CONSOLE_CURSOR_INFO` 结构和 `GetConsoleCursorInfo` 和 `SetConsoleCursorInfo` 函数来隐藏或显示光标。在Linux或Unix系统中,可以使用终端控制序列来隐藏光标,例如在C语言中可以使用 `printf("\e[?25l")` 来隐藏光标,使用 `printf("\e[?25h")` 来显示光标。
隐藏光标是一个简单的步骤,但它可以提高贪吃蛇这类文本模式游戏的总体质量和玩家的游戏体验。

GetStdHandle 函数(句柄函数)

函数的使用

1,获得句柄

炒菜需要菜->锅->锅柄

我们这个时候需要拿到锅柄

简单的说就是,这里有三个参数分别对照的是输入流,屏幕显示,控制台

我们需要的是屏幕的光标消失

所以我们在GetStdHandle 函数里面输入STD_OUTPUT_HANDLE参数

然后命名一个变量进行接收

//举例
HANDLE hOutput = NULL;
//获取标准输出的句柄(用来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleCursorlnfo(获得光标信息)

此时我们拿到锅柄了,那么我们此时需要拿到锅,有锅才能炒菜

可以看到,我们的函数语法一个是指向句柄,一个是指向参数的指针

所以这里我们还需要讲解一下

CONSOLE_CURSOR_INFO 结构

因为GetConsoleCursorlnfo(获得光标信息)函数事情比较多,里面的参数一个是句柄,一个在这个结构体

我们可以看见这个结构体一个是游标占比一个是游标的可见性,我们这里是设置的游标的可见性,那么参数里面说的很清楚,设置游标的可见性,可见可以直接设置为TRUE

那么不可见就可以设置为FALSE

此时我们回到GetConsoleCursorlnfo(获得光标信息)函数,我们需要了解的是,GetConsoleCursorlnfo(获得光标信息)接收的参数一个是句柄信息,一个是存储游标信息的结构体,但是我们不能直接进行设置

因为GetConsoleCursorlnfo(获得光标信息)本身就是获取光标信息的函数,我们需要先获取光标信息,再设置

我们先上一部分代码

	//句柄//句柄 目的就像锅的把柄一样  可以这样 HANDLE houtpu = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE 数值就是指针HANDLE houtpu = NULL;houtpu = GetStdHandle(STD_OUTPUT_HANDLE);//获得光标信息//拿到句柄之后,需要获得光标的信息,就像我们有了锅的把柄,然后得有锅才能炒菜,改变菜的属性,生->熟//GetConsoleCursorInfo控制台光标信息 第一个参数的光标信息,第二个参数的指针,指向CONSOLE CURSOR INFO的指针//创建一个CONSOLE CURSOR INFO的结构体,这个结构体是描述创建控制台光标信息的,创建并且初始化CONSOLE_CURSOR_INFO cureor_info = { 0 };GetConsoleCursorInfo(houtpu, &cureor_info);//隐藏控制台光标,把创建的结构体指针设置为不可见//dwSize,光标填充的字符单元格的百分比。 此值介于1到100之间。 光标外观会变化,范围从完全填充单元格到单元底部的水平线条。//则此成员为 TRUE。CursorInfo.bVisible=false;//隐藏控制台光标	//bVisible,游标的可见性。 如果光标可见,cureor_info.bVisible = false;

提醒一下,这里的结构体的设置是需要进行初始化的,并且设置可见性,是在获取光标信息下的,因为设置需要先获取才能设置,但是此时的设置还没有设置到控制台里面

也就是此时虽然我们已经设置了光标的属性是不可见,但是此时还是可见的

因为设置光标信息还有一个函数

SetConsoleCursorInfo(设置光标信息)

我们看一下语法信息

我们在windows官网可以查询到,设置光标信息函数的参数一个是句柄函数,一个是结构体的参数

所以我们的完整代码可以写为

	//句柄//句柄 目的就像锅的把柄一样  可以这样 HANDLE houtpu = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE 数值就是指针HANDLE houtpu = NULL;houtpu = GetStdHandle(STD_OUTPUT_HANDLE);//获得光标信息//拿到句柄之后,需要获得光标的信息,就像我们有了锅的把柄,然后得有锅才能炒菜,改变菜的属性,生->熟//GetConsoleCursorInfo控制台光标信息 第一个参数的光标信息,第二个参数的指针,指向CONSOLE CURSOR INFO的指针//创建一个CONSOLE CURSOR INFO的结构体,这个结构体是描述创建控制台光标信息的,创建并且初始化CONSOLE_CURSOR_INFO cureor_info = { 0 };GetConsoleCursorInfo(houtpu, &cureor_info);//隐藏控制台光标,把创建的结构体指针设置为不可见//dwSize,光标填充的字符单元格的百分比。 此值介于1到100之间。 光标外观会变化,范围从完全填充单元格到单元底部的水平线条。//则此成员为 TRUE。CursorInfo.bVisible=false;//隐藏控制台光标	//bVisible,游标的可见性。 如果光标可见,cureor_info.bVisible = false;//设置光标信息//SetConsoleCursorInfo设置光标信息//参数//BOOL WINAPI SetConsoleCursorInfo(//	_In_       HANDLE              hConsoleOutput,//	_In_ const CONSOLE_CURSOR_INFO * lpConsoleCursorInfo//);SetConsoleCursorInfo(houtpu, &cureor_info);

封装一个隐藏光标属性的函数

//隐藏光标的信息
void set_hide()
{//句柄//句柄 目的就像锅的把柄一样  可以这样 HANDLE houtpu = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE 数值就是指针HANDLE houtpu = NULL;houtpu = GetStdHandle(STD_OUTPUT_HANDLE);//获得光标信息//拿到句柄之后,需要获得光标的信息,就像我们有了锅的把柄,然后得有锅才能炒菜,改变菜的属性,生->熟//GetConsoleCursorInfo控制台光标信息 第一个参数的光标信息,第二个参数的指针,指向CONSOLE CURSOR INFO的指针//创建一个CONSOLE CURSOR INFO的结构体,这个结构体是描述创建控制台光标信息的,创建并且初始化CONSOLE_CURSOR_INFO cureor_info = { 0 };GetConsoleCursorInfo(houtpu, &cureor_info);//隐藏控制台光标,把创建的结构体指针设置为不可见//dwSize,光标填充的字符单元格的百分比。 此值介于1到100之间。 光标外观会变化,范围从完全填充单元格到单元底部的水平线条。//则此成员为 TRUE。CursorInfo.bVisible=false;//隐藏控制台光标	//bVisible,游标的可见性。 如果光标可见,cureor_info.bVisible = false;//设置光标信息//SetConsoleCursorInfo设置光标信息//参数//BOOL WINAPI SetConsoleCursorInfo(//	_In_       HANDLE              hConsoleOutput,//	_In_ const CONSOLE_CURSOR_INFO * lpConsoleCursorInfo//);SetConsoleCursorInfo(houtpu, &cureor_info);
}

此时可以发现,界面没有光标显示了


http://www.ppmy.cn/devtools/34459.html

相关文章

QtWindows任务栏

目录 引言任务栏进度右键菜单缩略图工具栏完整代码 引言 针对Windows系统的任务栏,Qt基于系统的原生接口封装有一些非常见类,如QWinTaskbarButton、QWinTaskbarButton、QWinThumbnailToolBar等,用于利用工具栏提供更多的信息,诸如…

盘点热门的5个AI视频工具(上):附保姆级教程,居然还有免费的?(建议收藏)

一条完全使用 AI 做出的短视频,点赞上万,转发上万! 你敢信,这是我在前几天刷视频的时候,看到的一个 AI 视频案例。 这种 AI 视频为什么会火? AI 虽然不是什么新的领域,但 2023 年&#xff0c…

c++ BSTree二叉搜索树(附原码)

目录 一、概念 二、基本操作 1、插入 2、中序遍历 3、删除 4、查找 5、总结删除 三、应用场景 四、原码 一、概念 左子树比根小,右子树比根大 意义:最多查找高度次数 不需要排序,就达到了二分查找的效率 同时还弥补了单纯数组的插入…

redis之地理空间GEO

使用中文时会乱码,我们可以在启动添加命令 redis-cli -a 密码 -- raw 即可 由名字知其是和地理位置相关的,其将三维地球划分为二维平面进行存储。 命令如下: geoadd name 经度 纬度 名称 :在name中添加一个坐标 zrang name 0…

力扣:62. 不同路径

62. 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径&…

文件批量改名字怎么改(怎样批量修改文件名)

文件批量改名字怎么改(怎样批量修改文件名) 批量重命名文件可以通过多种方法实现,具体取决于用户的操作系统和熟练程度。 以下是一些常见的方法: 下载地址https://download.csdn.net/download/dhyuan_88/89237041 使用操作系统自带…

WP Rocket插件下载:加速您的WordPress网站,提升用户体验

在互联网速度决定用户体验的今天,一个快速加载的网站对于吸引和保留访问者至关重要。WP Rocket插件,作为一款专为WordPress设计的高性能缓存插件,提供了一套完整的解决方案,帮助您优化网站性能,提升用户体验。 [WP Ro…