C++键盘检测学习

本文介绍了在C++中实现键盘检测的两种方法,包括使用GetAsyncKeyState宏定义简化键盘状态检查,以及利用_conio.h_库中的_getch()函数获取键盘输入。通过示例代码,展示了如何检测特定按键,如wasd,以便于游戏控制或其他交互应用。
部署运行你感兴趣的模型镜像

因为想做游戏,就想得到键盘检测的功能。

在网上搜了许久,有两个可行的方法:

  1. GetAsyncKeyState(key_name)
  2. _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; 
	}
	}
}

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值