目的
在编写贪吃蛇这样的文本模式游戏时,隐藏光标是一个常用的技巧,目的是为了提高用户体验和游戏的视觉表现。隐藏光标的属性目的主要包括以下几点:
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); }
此时可以发现,界面没有光标显示了