贪吃蛇之按键

  贪吃蛇游戏中我们需要通过按键来控制贪吃蛇的前进方向,在代码中,我用到了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_CANCELCtrl + Break0x03
VK_MBUTTON鼠标中键0x04
VK_BACKBackspace 键0x08
VK_TABTab 键0x09
VK_RETURN回车键0x0D
VK_SHIFTShift 键0x10
VK_CONTROLCtrl 键0x11
VK_MENUAlt 键0x12
VK_PAUSEPause 键0x13
VK_CAPITALCaps Lock 键0x14
VK_ESCAPEEsc 键0x1B
VK_SPACE空格键0x20
VK_PRIORPage Up 键0x21
VK_NEXTPage Down 键 0x22
VK_ENDEnd 键0x23
VK_HOMEHome 键0x24
VK_LEFT左箭头键0x25
VK_UP上箭头键0x26
VK_RIGHT右箭头键0x27
VK_DOWN下箭头键 0x28
VK_SNAPSHOTPrint Screen 键0x2C
VK_InsertInsert 键0x2D
VK_DeleteDelete 键0x2E
‘0’ – ‘9’数字 0 - 90x30 - 0x39
‘A’ – ‘Z’字母 A - Z0x41 - 0x5A
VK_LWIN左WinKey(104键盘才有)0x5B
VK_RWIN右WinKey(104键盘才有)0x5C
VK_APPSAppsKey(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 – F240x70 - 0x87
VK_NUMLOCKNum Lock 键0x90
VK_SCROLLScroll Lock 键0x91
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值