在用C语言写出的“贪吃蛇”小游戏中,可以自编以下这个intokey( )函数,用来获取方向键值以便控制蛇的拐弯。库函数kbhit( )是检测是否有按键被按下,Dir是代表方向的变量,整型变量flag用来获取键值,1、2、3、4分别表示方向的上下左右。要#include<conio.h>.
void intokey( )
{ int flag
if ( kbhit( ) ) //判断有键按下时才执行下面操作
{ flag = getch( ) //用flag来获取键值
if (flag==224) flag = getch( )//值为224是方向键,要再次获取才行
if (flag==72 &&dir != 2) dir = 1//方向键为“上”且原方向不为下时,让dir=1.
if (flag==80 &&dir != 1) dir = 2//方向键为“下”且原方向不为上时,让dir=2.
if (flag==75 &&dir != 4) dir = 3//方向键为“左”且原方向不为右时,让dir=3.
if (flag==77 &&dir != 3) dir = 4//方向键为“右”且原方向不为左时,让dir=4.
}
}
注:上下左右键按下后都会产生2个值,第一个是224,第二个才分别是72、80、75和
77.所以要用库函数getch( )两次获取键值。如果是ASDW来控制拐弯,flag可以定义为
字符型,获取一次键值即可。
#include<iostream>/*GetKeyState()函数是windows.h中的函数,当括号内的键被按下时,其值小于0,*/#include<windows.h>/*并且只要在只要键处于被按下的状态,其值都会小于0,当键被松开时,其值大于0*/
using namespace std
int main()
{
while(1){
if((GetKeyState(VK_CONTROL)<0)&&(GetKeyState('A')<0)){
cout<<"CONTROL+A"
while(GetKeyState(VK_CONTROL)<0&&GetKeyState('A')<0) //只要键被按下,就会有一定的持续时间。
}
}
}
//自己耗费1天半的呕心沥血之作,希望对你有用!
综观TC提供的键盘输入函数,以bioskey函数为最合适选择。int bioskey(int cmd)
使用BIOS中断0x16执行各种键盘操作。参数cmd确定实际得操作。
bioskey的返回值由cmd决定:
0:低8位非0,返回在队列中等待的下一输入键的ascii字符或键盘的下一次按键输入的ascii字符。低8位为0,则高8位为扩展键盘码。
1:测试是否有可读的输入键,为0,则没有。Ctrl_break 返回0xffff(-1)。否则,返回下一个输入键。键值还保存,供下次cmd=0时bioskey调用返回。
2:请求当前换档键状态。状态值由下列值相或(or)得到:
位70x80 Insert ON
60x40 Caps ON
50x20 Numlock ON
40x10 Scroll Lock ON
30x08 ALT
20x04 CTRL
10x02 <- SHIFT
00x01 ->SHIFT
为了方便起见,我们首先定义一些常用功能键的键值。
#define ReturnKey 0x0d
#define ESC 0x1b
#define Back 0x08
#define LeftArrow 0x4b00
#define RightArrow0x4d00
#define UpArrow 0x4800
#define DownArrow 0x5000
#define PageUp0x4900
#define PageDown 0x5100
#define Home 0x4700
#define End 0x4f00
#define F1 0x3b00
#define F2 0x3c00
#define F3 0x3d00
#define F4 0x3e00
#define F5 0x3f00
#define F6 0x4000
#define F7 0x4100
#define F8 0x4200
#define F9 0x4300
#define F100x4400
int GetKey(void)
{
int tKey
while(bioskey(1)==0)
tKey=bioskey(0)
if ((tKey &0xff)!=0)
tKey=tKey &0xff
return tKey
}
以上代码,可基本完成常用程序键盘读取操作。
但我们必须注意到,对于函数GetKey的定义中,bioskey函数的使用,我们只是对cmd=0,1的情况进行了处理,而对于cmd=2,也即换档键状态没有进行处理,因而诸如ctrl-home等等GetKey不能进行相应的接收,如果确实需要,须继续扩充GetKey函数。