因为想做游戏,就想得到键盘检测的功能。
在网上搜了许久,有两个可行的方法:
- GetAsyncKeyState(key_name)
- _getch()
1,一般用宏定义简化一下用&运算得到键盘是否摁下。例如:
#define key_down(key_name) ((GetAsyncKeyState(key_name))?1:0)
key_down就是自己定义的简单函数,你也可以用an_xia(key_name),jian_pan(key_name)
然后()里的key_name是代指键盘字符的,因为我的需要,我记下了键盘字母对应大写。例如按下A,用key_down('A')就可以检测到了。
//这个函数好像一直检测键盘,我不知道怎么按一下检测一下,用Sleep()也不好用。
//然后,有人用这个检测键盘弹起,就是把1:0改成0:1,
#define key_down(key_name) ((GetAsyncKeyState(key_name))?0:1)
我试了下,感觉不太明显。
2,这个在conio.h中,con是console的缩写,io是输入输出,控制台输入输出的函数。
_getch(),得到的是一个int,你可以int 一个变量接受键盘输入,例如:
int a;
a=_getch();
if(a==97)
{
cout<<"按下了键盘A"<<endl;
}
当你按下键盘A,a会受到一个_getch()返回的数字97,然后打印“按下了键盘A”。
数字有ASCII判定,a~97,A~65,
//我喜欢用第二种方法,更简单。w,a,s,d,就是119,97,115,100,总算可以用wasd控制方向了。
//写了一个丑陋的程序,不对,下面这个丑陋的程序是我一个朋友写的。
#include<iostream>
#include<conio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
using namespace std;
#define len 15//我定义了移动的区域大小
void show(char a[len][len]){//打印移动区域用的
for(int i=0;i!=len;i++){
for(int j=0;j!=len;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
int randint(){//产生随机数
int res;
srand((unsigned)time(NULL));
res=rand()%4;
return res;
}
int main(){
char a[len][len];//建立移动区域
for(int i=0;i!=len;i++){
for(int j=0;j!=len;j++){
a[i][j]=' ';
}
}
int x=0,y=0;
a[x][y]='@';
int m=5,n=5;
a[n][m]='*';
show(a);cout<<"\n\n"<<"wasd控制@移动,注意我为了省事边界未检测,移动到边界在动超出屏幕的话会EXCEPTION !" <<endl;
int ch;
while(ch=_getch()){//键盘控制响应
int ee=randint();
switch(ee){//这个是产生一个敌人*,并每次按下键盘是随即一个方向移动,0123判定上下左右
case 0:{
a[n][m]=' ';
if(n>0)
n-=1;
a[n][m]='*';
}
case 1:{
a[n][m]=' ';if(m>0)
m-=1;
a[n][m]='*';
}
case 2:{
a[n][m]=' ';if(n<10)
n+=1;
a[n][m]='*';
}
case 3:{
a[n][m]=' ';if(m<10)
m+=1;
a[n][m]='*';
}
}
if(ch==100){//下面四个if判断wasd控制
a[y][x]=' ';if(x<10)
x+=1;
if(x==m&&y==n){
a[n][m]='X';
system("cls");
show(a);
cout<<"---------------------You are Win!-------------------"<<endl;
break;
}
a[y][x]='@';
system("cls");
show(a);cout<<"\n\n"<<"wasd控制@移动,注意我为了省事边界未检测,移动到边界在动超出屏幕的话会EXCEPTION !" <<endl;
}
if(ch==115){
a[y][x]=' ';if(y<10)
y+=1;
if(x==m&&y==n){
a[n][m]='X';
system("cls");
show(a);
cout<<"---------------------You are Win!-------------------"<<endl;
break;
}
a[y][x]='@';
system("cls");
show(a);cout<<"\n\n"<<"wasd控制@移动,注意我为了省事边界未检测,移动到边界在动超出屏幕的话会EXCEPTION !" <<endl;
}
if(ch==97){
a[y][x]=' ';if(x>0)
x-=1;
if(x==m&&y==n){
a[n][m]='X';
system("cls");
show(a);
cout<<"---------------------You are Win!-------------------"<<endl;
break;
}
a[y][x]='@';
system("cls");
show(a);cout<<"\n\n"<<"wasd控制@移动,注意我为了省事边界未检测,移动到边界在动超出屏幕的话会EXCEPTION !" <<endl;
}
if(ch==119){
a[y][x]=' ';if(y>0)
y-=1;
if(x==m&&y==n){
a[n][m]='X';
system("cls");
show(a);
cout<<"---------------------You are Win!-------------------"<<endl;
break;
}
a[y][x]='@';
system("cls");
show(a);cout<<"\n\n"<<"wasd控制@移动,注意我为了省事边界未检测,移动到边界在动超出屏幕的话会EXCEPTION !" <<endl;
}
if(ch==27){//按下esc退出
break;
}
}
}
本文介绍了在C++中实现键盘检测的两种方法,包括使用GetAsyncKeyState宏定义简化键盘状态检查,以及利用_conio.h_库中的_getch()函数获取键盘输入。通过示例代码,展示了如何检测特定按键,如wasd,以便于游戏控制或其他交互应用。
1万+

被折叠的 条评论
为什么被折叠?



