目录

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

实例:检测数字键

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐