之前在写扫雷游戏的时候,将所有的内容放到了一篇文章中,自己复习和他人观看其实都会多少非常费劲,所以这次的贪吃蛇游戏以各重要部分作为分篇依据来介绍。
一.WIN32API是什么?
Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外, 它同时也是⼀个很大的服务中心,调用这个服务中心的各种服务(每⼀种服务就是⼀个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application)所以便称之为Application Programming Interface,简称API 函数。WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口。
二.改变控制台的窗口大小与标题
这里我们需要用到两条cmd命令:mode con cols= lines= 与title(使用时需要包含头文件stdlib.h)
2.1mode con cols= lines=
这个非常容易理解,在cols后面输入想设置的列数,在lines后面设置想要的行数
int main()
{
system("mode con cols=100 lines=30");
return 0;
}
可以自行改变参数来调整窗口大小。
2.2title
这条命令可以改变控制台的名称,譬如下面这样一个例子:
int main()
{
system("title 贪吃蛇");
system("pause");
return 0;
}
(这里使用pause是为了看到我们改变后的效果,程序结束后我们的改名效果也会消失)结果截图如下:
2.3补充:COORD(控制台屏幕上的坐标)
COORD是Windows API中定义的⼀个结构体,表示⼀个字符在控制台屏幕幕缓冲区上的坐标,坐标系 (0,0) 的原点位于缓冲区的顶部左侧单元格。
COORD类型的声明:
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, *PCOORD;
给坐标赋值:
COORD pos = { 10, 15 };
请注意以下内容不需要记忆,主要是要弄明白它们如何使用即可:
三.GetStdHandle
GetStdHandle是⼀个Windows API函数。它用于从⼀个特定的标准设备(标准输入、标准输出或标准错误)中取得⼀个句柄(用来标识不同设备的数值),使用这个句柄可以操作设备。
HANDLE GetStdHandle(DWORD nStdHandle);
官方文档:GetStdHandle 函数 - Windows Console | Microsoft Learn
这里的句柄其实简单一些理解就是你需要通过此语句来告诉系统你目标的操作位置(标准输入设备,标准输出设备,标准错误设备)。
实例:
HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
四.GetConsoleCursorInfo
获取有关指定控制台屏幕缓冲区的光标大小和可见性的信息
BOOL WINAPI GetConsoleCursorInfo(
HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
实例:
HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
官方文档:GetConsoleCursorInfo 函数 - Windows Console | Microsoft Learn
补充:CONSOLE_CURSOR_INFO(包含控制台光标信息)
这个结构体,包含有关控制台光标的信息:
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize;
BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
dwSize,由光标填充的字符单元格的百分比。此值介于1到100之间。 光标外观会变化,范围从完 全填充单元格到单元底部的水平线条。
bVisible,游标的可见性。如果光标可见,则此成员为TRUE。
官方文档:CONSOLE_CURSOR_INFO 结构 - Windows Console | Microsoft Learn
五.SetConsoleCursorInfo
设置指定控制台屏幕缓冲区的光标的大小和可见性。
BOOL WINAPI SetConsoleCursorInfo(
HANDLE hConsoleOutput,
const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);
这里就需要用到四里面的补充内容,以设置想要的光标大小,比如我们有以下一个实例:
int main()
{
HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(houtput, &CursorInfo);
CursorInfo.dwSize = 100;
SetConsoleCursorInfo(houtput, &CursorInfo);
system("pause");
return 0;
}
我们一般默认的光标比例大小为25,改完之后的光标如下图所示:
如果不想让光标显示的话,把bVisible改为false即可(改之前需要添加头文件stdbool.h)。
需要注意dwSize也必须要设置值,否则光标改变无法生效。
官方文档:SetConsoleCursorInfo 函数 - Windows Console | Microsoft Learn
六.(改变光标位置)SetConsoleCursorPosition
设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调用SetConsoleCursorPosition函数将光标位置设置到指定的位置。
它的定义如下:
BOOL WINAPI SetConsoleCursorPosition(
HANDLE hConsoleOutput,
COORD pos
);
这里我们前面介绍的COORD其实就发挥了作用让我们来进行这样一个实例:
int main()
{
HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = { 10,20 };
SetConsoleCursorPosition(houtput,pos);
system("pause");
return 0;
}
结果如下:
可以明显观察到输入文字的起始光标位置发生了改变。
我们也可以直接封装一个函数,便于我们随时随地的改变光标的位置:
//设置光标的坐标
void SetPos(short x, short y)
{
COORD pos = { x, y };
HANDLE houtput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//设置标准输出上光标的位置为pos
SetConsoleCursorPosition(houtput, pos);
}
官方文档:SetConsoleCursorPosition 函数 - Windows Console | Microsoft Learn
七.(获取按键情况)GetAsyncKeyState
GetAsyncKeyState的返回值是short类型,在上一次调用GetAsyncKeyState 函数后,如果返回的16位的short数据中,最高位是1,说明按键的状态是按下,如果最高是0,说明按键的状态是抬 起;如果最低位被置为1则说明,该按键被按过,否则为0。
它的定义如下:
SHORT GetAsyncKeyState(
int vKey
);
如果我们要判定按键是否被按过,则可以检测GetAsyncKeyState返回值的最低值是否为1:
#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )
这里要介绍实例不方便介绍,我们到之后文章中的实践部分来介绍,这里先知道这种获取按键情况的方法即可。
官方文档:getAsyncKeyState 函数 (winuser.h) - Win32 apps | Microsoft Learn
至此,贪吃蛇实现过程中需要使用的WIN32 API已经介绍完毕,我们下篇文章见。