C++检测键盘输入
C/C++检测键盘输入,可以用kbhit()函数和或getch()函数。
kbhit()的用法
头文件包括“conio.h”。
程序执行到kbhit()时,等待输入,但是不会停止而是继续运行,有输入时kbhit()才就返回一个非零值,否则返回0。下面是一个例子。
#include <iostream> #include "conio.h" using std::cout; int main() { int times = 5; cout<<"Press any key:\n"; while(times) { if(!kbhit()) { cout<<"No input now!\n"; } times--; } return 0; }
输出:
程序执行到 if(!kbhit()) 时,因为当前没有输入,所以会连续打印“Now input now!”五次结束。中间的时间根本来不及打断。
如果写个下面的例子,更加直观。
#include <iostream> #include "conio.h" using std::cout; int main() { while(!kbhit()) { cout<<"Now input now!\n"; } return 0; }
程序会不断地打印“Now input now!”,直到随便按下一个按键,程序跳出循环,执行结束。
getch()的用法
头文件包括“conio.h”。
程序执行到getch(),会保持等待状态,请求用户输入。按下一次按键后,读取一个字符,然后程序继续执行。这个字符可以赋值给其它变量。
举个例子:
#include <iostream> #include "conio.h" using std::cout; int main() { int n; char c; cout<<"Press any key:\n"; getch(); cout<<"You pressed a key.\n"; cout<<"Press another key:\n"; c = getch(); cout<<"You pressed "<<c<<"\n"; cout<<"Press another key again:\n"; n = getch(); cout<<"You pressed "<<n<<"\n"; //ASCII return 0; }
三次输入,按下的都是“a”。最后输出:
结合以上特点,下面写个小游戏练习键盘输入检测。
练习
程序运行后,会显示一个密码盘,有0-9总共10个数字,并显示一个能由用户操控的光标(*),开始时居中,形式如下。
按下a键和d键控制光标分别向左和向右移动(称为key)。密码自由设定,有先后顺序。在下面的例程中,用户需要先向左转到1,再向右转到8,依次打开两道锁。每次打开锁后,会输出一行提示。
效果:
两道锁都打开后,按下任意按键退出。
代码中用了system(“cls”)来清屏,用了Sleep()来让系统等待特定的时间。(引用头文件“windows.h”)
#include <iostream> #include "windows.h" //for system("cls") and Sleep() #include "conio.h" //for getch() #include <string> //for string using std::cout; using std::string; //此处定义光标的图案和密码位置 const char key = '*'; const int pw1 = 2; const int pw2 = 16; //显示密码锁的界面 void show() { string numbers = "0 1 2 3 4 5 6 7 8 9\n"; string lines = "| | | | | | | | | |\n"; cout<<numbers; cout<<lines; } //输出空格 void space(int i) { char space = '\0'; for(;i>0;i--) { cout<<space; } } //核对密码 bool check_key_1(int k) { return k == pw1; } bool check_key_2(int k) { return k == pw2; } void move_key() { int place = 9; //空格数,定位用 char p; //用户的键盘输入 int counts = 0; //解锁次数统计 show(); //显示界面 space(place); cout<<key; //定位并显示光标 p = getch(); //获取键盘输入 int flag = 1; //用于保持循环的标志 while(flag) { system("cls"); //清屏刷新 show(); if( p == 'a') { place--; //光标左移一格 space(place); cout<<key<<"\n"; } else if( p == 'd') { place++; //光标右移一格 space(place); cout<<key<<"\n"; } else { break; //按下的不是a和d就退出 }; switch(counts) { case 0: { if(check_key_1(place)) { cout<<"First lock Unlocked!\n"; Sleep(1000); //等待一秒 counts ++; } else{} break; } case 1: { if(check_key_2(place)) { cout<<"Second lock Unlocked!\n"; Sleep(1000); counts ++; } else{} break; } default: { cout<<"All locks have been unlocked.\n"; cout<<"Press any key to continue..."; Sleep(1000); flag = 0; break; } } p = getch(); //获取下一次键盘输入 } } int main() { move_key(); return 0; }