科技系列 - 1 :判断键盘上的某个键按下 :KEY_DOWN

如何判断键盘上的某个键按下

同机房的 : luogu_yydfj

KEY_DOWN 函数是一个特别强有力的函数,它可以检测键盘及鼠标的状态(松开、点击),通常用于检查用户是否按了键盘上指定的键,也常用于做游戏,快捷键等等。

不过一开始必须有一个声明来启用KEY_DOWN函数。只有一个参数,keycode:KeyCode枚举类型或integer类型,指明要检测的按键或某个键的ASCII值返回值Boolean。

如果用户按了keycode参数指定的按键,函数返回TRUE,否则返回FALSE。

其实 KEY_DOWN 是一个自定义函数,他的原函数是如下

WINUSERAPI SHORT WINAPI GetAsyncKeyState(int vKey);

如何使用?

实际上,假如说我们判断 Enter 键是否按下,我们只需要知道它的keycode码就行了

#include<windows.h>

#include<cstdio> 

int main()
{
	while( ! ( GetAsyncKeyState( 13 ) & 0x8000 ) ) ;
	
	printf("检测到您按下了 Enter 键,已退出程序!");

	return 0;
}

我们为了方便使用,我们把它用 define 改成如下:

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)

#include<windows.h>

#include<cstdio> 

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)

int main()
{
	while( ! KEY_DOWN( 13 ) ) ;
	
	printf("检测到您按下了 Enter 键,已退出程序!");

	return 0;
}

有了 KEY_DOWN 这个函数,我们是不是发现黑科技又多了一分呢?


不仅仅是 KEY_DOWN 可以判断键盘按下,__getch() 函数也可以判断键盘按下,用法如下:

#include<conio.h>

#include<cstdio> 

int main()
{
	while(getch() == 10);
	
	printf("检测到您按下了 Enter 键,已退出程序!");

	return 0;
}

注意:getch 码与 KEY_DOWN 码有少许不同,更多内容可以转此链接


最后附上 KEY_DOWN 码
按键对应十进制数
BackSpace BackSpace8
Tab Tab9
Clear12
Enter13
Shift16
Control (Ctrl)17
Alt18
Pause19
Caps_Lock20
Escape Escape27
space32
Prior33
Next34
End35
Home36
Left37
Up38
Right39
Down40
Select41
Print42
Execute43
Insert45
Delete46
Help47
048
149
250
351
452
553
654
755
856
957
a A65
b B66
c C67
d D68
e E69
f F70
g G71
h H72
i I73
j J74
k K75
l L76
m M77
n N78
o O79
p P80
q Q81
r R82
s S83
t T84
u U85
v V86
w W87
x X88
y Y89
z Z90
f1112
f2113
f3114
f4115
f5116
f6117
f7118
f8119
f9120
f10121
f11122
f12123
f13124
f14125
f15126
f16127
f17128
f18129
f19130
f20131
f21132
f22133
f23134
f24135
鼠标左键VK_LBUTTON
鼠标右键VK_RBUTTON

如果这里未能找到你想要的 keycode 码,你可以使用下面这个代码试试点击按键


#include<cstdio>

#include<windows.h>

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? (1) : (0))

int main()
{
	while(1)
	
		for(int i = 1;i <= 300;i ++)
		
			if( KEY_DOWN(i) )
			
				printf("%d\n",i); 
 } 

关于DEV-C++的黑科技系列,以后会持续更新,大家可以收藏作为资料使用!

又是很 囧 的一天,这个我打这个列表打了半天…

  • 18
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的贪吃蛇C++代码,使用了ncurses库来实现界面绘制: ```cpp #include <iostream> #include <vector> #include <ncurses.h> #include <stdlib.h> #include <time.h> using namespace std; const int WIDTH = 30; const int HEIGHT = 20; const int SNAKE_SIZE = 5; struct Point { int x; int y; Point(int x, int y) : x(x), y(y) {} }; class Snake { public: Snake(int x, int y) { head = new Point(x, y); body.push_back(head); for (int i = 1; i < SNAKE_SIZE; i++) { body.push_back(new Point(x-i, y)); } direction = KEY_RIGHT; } void move() { Point* next = new Point(head->x, head->y); switch (direction) { case KEY_UP: next->y--; break; case KEY_DOWN: next->y++; break; case KEY_LEFT: next->x--; break; case KEY_RIGHT: next->x++; break; } body.insert(body.begin(), next); if (next->x == food->x && next->y == food->y) { generate_food(); } else { body.pop_back(); } head = next; } bool check_collision() { if (head->x < 0 || head->x >= WIDTH || head->y < 0 || head->y >= HEIGHT) { return true; } for (int i = 1; i < body.size(); i++) { if (head->x == body[i]->x && head->y == body[i]->y) { return true; } } return false; } void set_direction(int dir) { if ((direction == KEY_UP && dir == KEY_DOWN) || (direction == KEY_DOWN && dir == KEY_UP) || (direction == KEY_LEFT && dir == KEY_RIGHT) || (direction == KEY_RIGHT && dir == KEY_LEFT)) { return; } direction = dir; } void generate_food() { int x = rand() % WIDTH; int y = rand() % HEIGHT; food = new Point(x, y); } Point* head; vector<Point*> body; Point* food; int direction; }; int main() { srand(time(NULL)); initscr(); noecho(); cbreak(); keypad(stdscr, TRUE); nodelay(stdscr, TRUE); curs_set(0); Snake* snake = new Snake(WIDTH/2, HEIGHT/2); snake->generate_food(); while (true) { clear(); mvprintw(snake->food->y, snake->food->x, "*"); for (int i = 0; i < snake->body.size(); i++) { mvprintw(snake->body[i]->y, snake->body[i]->x, "O"); } refresh(); int ch = getch(); if (ch == KEY_UP || ch == KEY_DOWN || ch == KEY_LEFT || ch == KEY_RIGHT) { snake->set_direction(ch); } snake->move(); if (snake->check_collision()) { break; } usleep(100000); } mvprintw(HEIGHT/2, WIDTH/2-5, "Game Over!"); refresh(); getch(); endwin(); return 0; } ``` 这段代码使用了ncurses库来实现控制台界面,使用了vector来存储贪吃蛇的身体,使用了Point结构体来表示坐标。在Snake类中实现了贪吃蛇的移动、碰撞检测、食物生成等功能。在主函数中使用循环来不断刷新界面,读取用户输入,并调用Snake类的方法来更新状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值