贪吃蛇游戏中我们需要通过按键来控制贪吃蛇的前进方向,在代码中,我用到了kbhit() 函数来实现这一功能。kbhit() 函数是一个用于非阻塞的响应键盘输入事件的C语言函数,下面我们就来简单介绍一下这个函数的功能和用法。
直接来一个表格吧~
函数名 | kbhit() |
---|---|
函数原型 | int kbhit(void); |
头文件 | conio.h |
函数功能 | 检查当前是否有键盘输入(仅此而已) |
返回值 | 若有键盘输入返回一个非0值,否则返回0 |
非阻塞函数是一种无论是否执行相关操作都会返回的函数,与之对立的是阻塞函数,如 scanf()、getch() 等,如果不操作,函数就会一直等着,不返回。
贪吃蛇实现方向控制的代码框架如下
if(kbhit()) //有按键按下
{
str=getch();//str为char类型,用A、W、D、S 控制方向
}
判断 str 的值,进而确定方向
上面的方法先要判断是否有按键按下,进而需要接收键入的字符,最后再进行方向的判断。这实在是一种麻烦的方法。
那么有木有一个在确定有键按下的同时也能确定是哪一个按键被按下的函数呢?答案是YES!
即下面介绍的 GetAsyncKeyState() 函数
函数名 | GetAsyncKeyState() |
---|---|
函数原型 | SHORT GetAsyncKeyState(int vKey); |
头文件 | windows.h |
函数功能 | 确定用户当前是否按下了键盘上的某一个键 |
返回值 | 表示两个内容,一个是最高位bit的值,代表这个键(自上次引用此函数以来)是否被按下,按下为1,抬起为0;一个是最低位bit的值 |
GetAsyncKeyState() 函数预 kbhit() 函数一样是个非阻塞函数。
控制方向的代码可以改写为
if( GetAsyncKeyState(VK_LEFT) & 0x8000 ) //左 ←
if( GetAsyncKeyState(VK_RIGHT) & 0x8000 ) //右 →
if( GetAsyncKeyState(VK_UP) & 0x8000 ) //上 ↑
if( GetAsyncKeyState(VK_DOWN) & 0x8000 ) //下 ↓
此时不是用AWDS来控制方向了,当然如果想用的话只需要改一下GetAsyncKeyState()函数里的参数值
说一下为什么GetAsyncKeyState要 ‘与’上 0x8000这个常数
答案:获取按键状态,屏蔽掉其他的可能状态
不‘与’的话,对于虚键而言这样写逻辑是不对的,虽然结果一样。。。。。。
GetAsyncKeyState() 函数是在按下的同时被引用的,怎么理解呢?下面的代码会很好的帮助你理解
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>
#include<time.h>
int main()
{
while(1)
{
if(GetAsyncKeyState(VK_DOWN)& 0x8000) //按键了
printf("A\n");
}
return 0;
}
结果:如果你按着 ‘↓’ 不放,则会一直输出 ‘A’
附常用键位:
VK_LBUTTON | 鼠标左键 | 0x01 |
---|---|---|
VK_RBUTTON | 鼠标右键 | 0x02 |
VK_CANCEL | Ctrl + Break | 0x03 |
VK_MBUTTON | 鼠标中键 | 0x04 |
VK_BACK | Backspace 键 | 0x08 |
VK_TAB | Tab 键 | 0x09 |
VK_RETURN | 回车键 | 0x0D |
VK_SHIFT | Shift 键 | 0x10 |
VK_CONTROL | Ctrl 键 | 0x11 |
VK_MENU | Alt 键 | 0x12 |
VK_PAUSE | Pause 键 | 0x13 |
VK_CAPITAL | Caps Lock 键 | 0x14 |
VK_ESCAPE | Esc 键 | 0x1B |
VK_SPACE | 空格键 | 0x20 |
VK_PRIOR | Page Up 键 | 0x21 |
VK_NEXT | Page Down 键 0x22 | |
VK_END | End 键 | 0x23 |
VK_HOME | Home 键 | 0x24 |
VK_LEFT | 左箭头键 | 0x25 |
VK_UP | 上箭头键 | 0x26 |
VK_RIGHT | 右箭头键 | 0x27 |
VK_DOWN | 下箭头键 0x28 | |
VK_SNAPSHOT | Print Screen 键 | 0x2C |
VK_Insert | Insert 键 | 0x2D |
VK_Delete | Delete 键 | 0x2E |
‘0’ – ‘9’ | 数字 0 - 9 | 0x30 - 0x39 |
‘A’ – ‘Z’ | 字母 A - Z | 0x41 - 0x5A |
VK_LWIN | 左WinKey(104键盘才有) | 0x5B |
VK_RWIN | 右WinKey(104键盘才有) | 0x5C |
VK_APPS | AppsKey(104键盘才有) | 0x5D |
VK_NUMPAD0 | 小键盘 0 键 | 0x60 |
VK_NUMPAD1 | 小键盘 1 键 | 0x61 |
VK_NUMPAD2 | 小键盘 2 键 | 0x62 |
VK_NUMPAD3 | 小键盘 3 键 | 0x63 |
VK_NUMPAD4 | 小键盘 4 键 | 0x64 |
VK_NUMPAD5 | 小键盘 5 键 | 0x65 |
VK_NUMPAD6 | 小键盘 6 键 | 0x66 |
VK_NUMPAD7 | 小键盘 7 键 | 0x67 |
VK_NUMPAD8 | 小键盘 8 键 | 0x68 |
VK_NUMPAD9 | 小键盘 9 键 | 0x69 |
VK_F1 - VK_F24 | 功能键F1 – F24 | 0x70 - 0x87 |
VK_NUMLOCK | Num Lock 键 | 0x90 |
VK_SCROLL | Scroll Lock 键 | 0x91 |