C++关于利用_kbhit()函数持续获取键盘输入的一点心得。
#C++关于利用_kbhit()函数持续获取键盘输入的一点心得。
小白路过想写个贪吃蛇玩玩,当用链表把贪吃蛇结构连起来后自然就想到了移动控制的问题。写来写去代码总是出错,贪吃蛇只有一直按着方向键才能移动,停止按键就不能移动,显然这是违背了游戏规则,于是乎上网搜索kbhit与getch连起来获取用户输入的资料(多线程暂时没想用),但是发现绝大部分都是单次使用,用于一次性判断是否否有按键输入,几乎没有循环判断,所以自己也是搞了好久才明白的。
#######不过后来我发现,这个是VS2017版遗留的一个问题, 在我2019年更新了VS之后,就没有了,这篇文章也不准备删,就留着当研究报告了,笑哭。。。。。。#########
先上个代码:
#include<iostream>
#include<conio.h>
#include<windows.h>
using namespace std;
char direction;
int main()
{direction = 'd';int i = 1;//这里的i用于测试按一次键读取的次数while (1){Sleep(1000);if (_kbhit()){direction = _getch();char take = _getch();//这一步非常重要,千万不能少!cout << i << "test" << endl;i++;}cout << i << "*" << direction << endl;}/*cout << i << endl;cout << "END";*/system("pause");return 0;
}
运行结果就像下面这样
实现了按一次键改一次方向。
如果去掉
char take = _getch();//这一步非常重要,千万不能少!
的话,情况就非常不友好了:
就像这样。。。
先是读取了我键入的值,然后立刻又读了一次,而且还吞掉了之前键入的键值,输出全是空格!!!
非常魔性。。。。
当时我自己看的就是一脸大写的懵逼。
然后自己上网搜了一堆资料,得出了我觉得可能是比较正确的解释
(萌新路过,有问题还请大佬指正,指点迷津,感激不尽QAQ)
:当一个键被按下时,会生成一个键值留在键盘缓冲区等待被读取,当松开按键的时候,又会生成一个键值表示此按键已经松开了留在键盘缓冲区等待被读取,而_kbhit()函数这两种值都能读取,也就是说在while(1)循环体中,如果按下了一次键,则kbhit会读取两次!!
而_kbhit()和_getch()都会在读取完后清掉他所读取的键盘缓冲区,所以如果我们只需要按键的信息而不需要松开键的信息(绝大部分都不要),那么就要在kbhit后一个来读取按键赋值给所需的变量,一个读取松开键释放键盘缓冲区。也就是多了刚刚上面的那一行代码。
顺路再说一哈kbhit和getch
kbhit:非阻断函数,运行时不会暂停程序,作用是若有键盘输入,则返回输入的值(应该是键值转换),若没有则返回0。
getch:阻断函数。等待键盘输入,并在输入后立即返回第一个字符,无需按下回车,和cin不一样。
欢迎各位大大在评论区留言交流呀。
C++关于利用_kbhit()函数持续获取键盘输入的一点心得。相关推荐
- GetAsyncKeyState()函数获取键盘输入
C++ GetAsyncKeyState()函数获取键盘输入 GetAsyncKeyState()可以异步获取按键输入,GetAsyncKeyState(某个键的虚拟键码) 可以得到这个键的状态,然后 ...
- Go 获取键盘输入,进制转换
#### Go 获取键盘输入,进制转换 最近爱上<<珂矣的心灵独语>> 连续听一下礼拜也不觉得厌: 喜欢她的宁静与安然,喜欢她的坦荡与欢喜,喜欢她的禅意与智慧; ***撑着一苇 ...
- MFC学习 —— 使用RawInput获取键盘输入
获取接盘输入 最彻底的是钩子,能获取.拦截系统的消息,包括按键输入消息. 最常用的是重载PreTranslateMessage,只获取拦截本程序本窗口的消息.例如: BOOL CxxxDlg::Pre ...
- python 获取键盘输入、同时有超时的功能_python 获取键盘输入,同时有超时的功能示例...
如下所示: ''' ###get keyboard input and timeout =5 import sys, time, msvcrt def readInput( caption, defa ...
- 利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字以及Map函数讲解
利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字. 输入:['adam', 'LISA', 'barT']. 输出:['Adam', 'Lisa', 'Bart'] ...
- 利用map()函数,把用户输入的不规则的英文名字,变为首字母大写,其他小写。
1.map()函数接收两个参数,一个是函数,另一个是Iterable,map将传入的函数依次作用到序列的每一个元素,并把结果作为新的Iterable返回. 2.map()传入的第一个参数是r,即函数对 ...
- 廖雪峰python.pdf-74 利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。
练习 利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字.输入:['adam', 'LISA','barT'],输出:['Adam', 'Lisa', 'Bart'] ...
- 【廖雪峰 python教程 课后题改编】利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字
原题目: # -*- coding: utf-8 -*- #输入名字,变成首字母大写,其他字母小写的标准格式 def normalize(name):str1 = ''for i, ch in enu ...
- 利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']:
利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字.输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']: ...
最新文章
- OpenCV 贝叶斯分类器示例
- linux then命令不识别,Linux终端提示符(prompt)不如期生效的原因分析与解决
- 机器学习-数据科学库(第二天)
- 类型全部为string_python小讲堂丨学了这么久的,这6种基本数据类型你真的理解了吗...
- java写入carbondata_Carbondata使用过程中遇到的几个问题及解决办法
- hive数据导入导出和常用操作
- paip.提升安全---网站登录密码明文传输的登录高危漏洞解决方案
- 用DOSBox运行老游戏
- MySQL配置root远程连接mysql授权远程
- linux中unzip命令无法使用解决方法
- 中标麒麟安装mysql教程_中标麒麟操作系统安装MySQL5.7.22的步骤教程
- ubuntu防火墙,ufw命令
- Web App - MUI框架实战
- matlab imwareaopen,李祎 副教授
- swf to html5 movie maker,楠妈妈教大家用windowsxp自带的Movie maker软件做视频
- Pointer Networks简介及其应用
- UEFI版制作U盘启动盘重装系统
- 青蛙的约会(poj 1061)exgcd基础题
- U8无法完成MDAC组件的安装解决方法
- 基于SSH开发物业管理信息系统