贪吃蛇前奏曲——win32API
目录
1.引言
2.win32API
3.控制台程序
1.引言
若我们想在控制台中实现贪吃蛇程序,则必须要掌握一定的win32API知识。借助win32API我们可以实现对控制台进行想要的处理,因此让我们一起来学习有关win32API的知识吧。
2.win32API
Windows这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外,它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每种服务就是一个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,因为这些函数服务的对象是应用程序(Application),所以便称之为Application Programming Interfa,简称为API函数。WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口。
3.控制台程序
平常我们运行起来的黑框程序其实就是控制台程序
3.1mode命令
我们可以使用cmd命令来设置控制台窗口的长宽:设置控制台窗口的大小,30行,100列
system("mode con cols=100 lines=30")
3.2title命令
我们可以通过title命令来设置控制台窗口的名字
system("title 贪吃蛇")
效果如下

3.3控制台屏幕上的坐标COORD
COORD是Windows API中定义的一个结构体,表示一个字符子在控制台屏幕缓冲区上的坐标,坐标系(0,0)的原点位于缓冲区的顶部左侧单元格。

COORD类型的声明:
typedef struct _COORD{
SHORT X;
SHORT Y;
}COORD,*PCOORD;
给坐标赋值:
COORD pos={10,15};
因为我们需要获取光标位置,在想要的位置打印。
3.4GetStdHandle
GetStdHandle是一个Windows API函数。它用与从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值),使这个点句柄可以操作设备。
HANDLE GetStdHandle(DWORD nStdHandle);
nStdHandle可取参数如下:

实例:
//HANDLE被定义位void *,但这只是语法层面的类型声明,并不改变其“句柄”本质
//不能当作普通指针使用
HANDLE hOutput=NULL;//获得标准输出的句柄(用来标识不同设备的数值)
hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
3.5GetConsoleCursorInfo
检索有关控制台屏幕缓冲区的光标大小和可见性的信息
BOOL WINAPI GetConsoleCursorInfo(
HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
PCONSOLE_CURSOR_INFO 是指向CONSOLE_CURSOR_INFO结构的指针,该结构接收有关主机游标
实例:
HANDLE hOutput=NULL;
//获取标准输入的句柄(用来标识不同设备的数值)
hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo (hOutput,&CursorInfo);//获取控制台光标信息
3.5.1CONSOLE_CURSOR_INFO
这个结构体,包含有关控制台光标的信息
typedef struct _CONSOLE_CURSOR_INFO{
DWORD dwSize;
BOOL dVisible;
}CONSOLE_CURSOR_INFO,*PCONSOLE_CURSOR_INFO;
dwSize,由光标填充字符单元格的百分比。值介于1~100。光标外观会变化,范围从完全填充单元格到单元格底部的水平线条。
bVisible,光标的可见性。如果光标可见,则此成员为TRUE。
CursorInfo.bVisible=false;//隐藏控制台光标
因为在贪吃蛇程序中,若存在光标会影响美观。
3.6SetConsoleCursorInfo
设置指定控制台屏幕缓冲区的光标的大小和可见性。
BOOL WINAPI SetConsoleCursorInfo(
HANDLE hConsoleOutput,
const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);
实例:
HANDLE hOuput=GetStdHandle(STD_OUTPUT_HANDLE);
//隐藏光标操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput,&CursorInfo);//获取控制台光标信息
CursorInfo.bVisible=false;
SetConSoleCursorInfo(hOutput,&CursorInfo);//设置控制台光标状态
3.7SetConsoleCursorPosition
设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调用SetConsoleCursorPosition函数将光标位置设置到指定的位置。
BOOL WINAPI SetConsoleCursorPosition(
HANDLE hConsoleOutput,
COORD pos
);
实例:
COORD pos={10,5};
HANDLE hOutoput=NULL;
//获取标准输出的句柄(用来表示不同设备的数值)
hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
//设置标准输出上光标的位置为pos
SetConsoleCursorPosition(hOutput,pos);
SetPos:封装一个设置光标位置的函数
void SetPos(short x,short y){
COORD pos={x,y};
HANDLE hOutput=NULL;
//获取标准输出的句柄(用来标识不同设备的数值)
hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
//设置标准输出上光标的位置为pos
SetConsoleCursorPosition(hOutput,pos);
}
3.8GetAsyncKeyState
获取按键情况,GetAsyncKeyState的函数原型如下:
SHORT GetAsyncKeyState(int vKey);
只要我们将键盘上每个键的虚拟键值传递给函数,函数就可以通过返回值来分辨按键的状态。
GetAsyncKeyState的返回值是short类型,在上一次调用GetAsyncKeyState函数后,如果返回的16为的short数据中,最高位是1,说明按键的状态是按下,如果最高是0,说明按键的状态是抬起;如果最低位被置为1则说明被按过,否则为0.
因此如果我们要判断一个键是否被按过,可以检测GetAsyncKeyState返回值的最低位是否为1。
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK)&0x1)?1:0)
虚拟键码如下:
Virtual-Key 代码 (Winuser.h) - Win32 apps | Microsoft Learn
实例:检测数字键

更多推荐


所有评论(0)