一.Win32相关API的介绍
1.首先我们先介绍一下:什么是API?
也就是说我们Window系统给我们提供了很多函数,让我们可以通过调用这些函数去完成一些我们目前想要完成的任务
而这些函数服务的对象是应用程序
因此这些函数被称为API
1.控制台程序
1.什么是控制台程序
平常我们运⾏起来的⿊框程序其实就是控制台程序
就是这个Microsoft Visual Studio 调试控制台
在我们的Windows系统中,就有一个叫做命令提示符的工具
这个也是控制台程序
我们可以在Window系统中搜索cmd
然后打开,这个命令提示符就是控制台
我们要介绍的是:
2.命令提示符中设置控制台窗口的大小
我们可以设置控制台窗口的长宽:
比方说我现在想要让这个命令提示符的行数和列数设置为:
10行,50列
mode con cols=50 lines=10 • 1
我们输入这个命令,按下回车(就像是在Linux系统中输入命令行相同)
然后发现这个命令提示符变得特别小了
因此这就证明了我们是可以手动设置控制台大小的
3.控制台行和列的注意事项
然后我想让他变成一个正方形呢?
我们输入:让它行和列都变成30吧
mode con cols=30 lines=30 • 1
为什么不是一个正方形呢?
明明我输的是行30,列30啊
为什么会这样呢?
因为控制台中行的长度的基本单位和列的长度的基本单位不同
其实:
我们可以简单理解为:
控制台中每一行的长度==每一列的长度*2
那么我们想要构建一个正方形就可这样做了:
mode con cols=60 lines=30
这就是一个正方形了
4.VS2019中设置控制台窗口的大小
比方说我们想要一个15行,30列的一个正方形控制台窗口
mode con cols=30 lines=15
只需要包含Windows.h头文件
并且使用system函数
system("mode con cols=30 lines=15");
5.设置控制台名称
我们这个个界面还有一个贪吃蛇的名称
这个怎么设置呢?
跟刚才一样
只需要在VS代码里面加上
system("title 贪吃蛇");
不过我这里一开始的时候是无法修改这个控制台的名称
等到我写完贪吃蛇代码之后
控制台的名称就自然而然好了
所以大家如果在这一步无法修改名称的话,请先继续往后看
2.控制台屏幕坐标
COORD是Windows API中定义的一个结构体
它表示一个字符在控制台屏幕上的坐标
这个坐标系是这样的
typedef struct _COORD { SHORT X;//X轴上的坐标 SHORT Y;//Y轴上的坐标 }COORD,*PCOORD; 如果我们想要给这个控制台坐标赋值的话: 比方说我们给它的坐标赋值为:x轴:20,y轴:10 COORD pos = {20,10}; 那么pos就是这个控制台上的对应位置的点
我们现在已经清楚了这个控制的坐标系的规则
但是还有一个问题:
这个控制台上的光标去哪了?
其实这个光标被我们隐藏了
那么我们该怎么样去隐藏这个光标呢?
别急,我们先来介绍一个函数:GetStdHandle
3.GetStdHandle
GetStdHandle是⼀个Windows API函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。
这是微软官方给的API的使用手册,大家可以看一下
这个GetStdHandle函数的手册网址:GetStdHandle函数的手册网址
4.设置控制台光标状态
1.GetConsoleCursorInfo
2.CONSOLE_CURSOR_INFO
3.SetConsoleCursorInfo
也就是说我们想要隐藏光标,需要这样:
#include <stdio.h> #include <Windows.h> #include <stdbool.h> int main() { system("mode con cols=60 lines=20"); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//让handle具有能够操作控制台标准输出设备的能力/权限 CONSOLE_CURSOR_INFO CursorInfo;//这个结构体就是定义光标信息的结构体 GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息 CursorInfo.bVisible = false;//隐藏控制台光标的操作 SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态 return 0; }
不要忘了在C语言中使用bool类型的话需要包含stdbool.h头文件
这样我们就成功隐藏光标了
可是你这个控制台还能够在任意位置打印数据啊,
这肯定是通过设置光标位置做到的,那么如何才能设置光标位置呢?
4.SetConsoleCursorPosition
实例:
COORD pos = {30, 10}; HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //设置标准输出上光标的位置为pos SetConsoleCursorPosition(handle, pos);
成功在指定位置打印了hello world
5.SetPos函数的实现
那么既然我们需要很多次调整光标位置以便能够在任意位置写入数据
那么我们不妨设计一个函数SetPos来实现调整光标位置的操作呢?
于是我们就可以写出这样的函数
void SetPos(short x, short y) { COORD pos = { x,y }; HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(handle, pos); }
6.GetAsyncKeyState
下面的问题来了:
我们想要玩这个游戏,就一定要能够接收我们的输入
我们既然是在电脑上玩,那就需要使用键盘去玩
那么就一定需要编译器能够在游戏运行的时候获取按键情况
因此微软WIN32API中就给了这么一个函数GetAsyncKeyState
作用是:获取按键情况
SHORT GetAsyncKeyState( int vKey );
因此我们就可以让这个返回值跟1进行按位与
如果得出来的值是1:那么就代表这个值的最低位是1,也就是说这个键被按过
如果得出来的值是0:那么就代表这个值的最低位是0,也就是说这个键没有被按过
因此我们可以写出如下的宏
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK) & 0x1) ? 1 : 0)
7.打印宽字符的实现
我们现在能够在屏幕上的任意位置打印数据,还能够隐藏光标,还能检测哪些键是否被按过
那不就可以了吗?
我们还漏了一点:
这个黑色原点:也就是蛇身
这个黑色五角星,也就是食物
这个白色方块:也就是墙体
这个是怎么打印出来的呢?
键盘上也没有啊
我们可以通过
搜狗输入法->输入方式->符号大全->里面就有
然后那不就行了吗?
是不行的
因为这三个字符属于宽字符(一个宽字符占2个字节,一个普通字符占1个字节),在VS的默认情况下我们是无法单独打印这些字符的
那么如何才能打印呢?
我们的准备工作终于做完了
下面就可以开始我们贪吃蛇游戏的具体实现了