我如何在 C 中使用 kbhit?
How do I use kbhit in C?
#include<stdio.h>
#include<Windows.h>
#include<conio.h>
#define Ukey 87
#define ukey 119
#define Dkey 115
#define dkey 83
#define Lkey 97
#define lkey 65
#define Rkey 100
#define rkey 68
int main(){
int x=0;
int y=0;
int prev=rkey;
while(true){
Sleep(50);
system("cls");
printf("x : %d\ny : %d",x,y);
if(!kbhit()){
if(prev==ukey){
y--;
}else if(prev==dkey){
y++;
}else if(prev==lkey){
x--;
}else if(prev==rkey){
x++;
}
}else if(getch()==ukey||getch()==Ukey){
y--;
prev=ukey;
}else if(getch()==dkey||getch()==Dkey){
y++;
prev=dkey;
}else if(getch()==lkey||getch()==Lkey){
x--;
prev=lkey;
}else if(getch()==rkey||getch()==Rkey){
x++;
prev=rkey;
}
}
}
所以基本上我的程序检测键盘键(我定义为 Ukey、Dkey、Lkey 和 Rkey 的 w、a、s 或 d)。该程序旨在通过按键检测方向,更改 x 和 y 值并保持它直到按下另一个键。
我的问题是,当程序 运行 和默认方向(右)被初始化时,当我按下另一个键时 while 函数就停止了。如果我按下该键几秒钟,它只会不断改变 x 和 y 值。
我的代码有什么问题?这是我第一次使用 kbhit,所以你的回答对我有很大的帮助。谢谢
我认为问题出在 else if(getch()==ukey||getch()==Ukey)
结构中,该结构对 getch
进行了多次调用。如果 kbhit
返回 true,那么对 getch
的第一次调用将是非阻塞的。但是,在按下新键之前,每个额外的调用都将被阻塞。
解决方案:重组您的程序,以便只有一次调用 getch
:
while (true) {
if (kbhit()) {
// A key was pressed. Find out which one.
prev = getch()
}
switch (prev) {
case ukey: y--; break;
case UKey: ...
...
}
}
此外,专门检测来自箭头键的双字符响应可能是有利的。我不记得它是如何工作的,但逻辑是这样的:
if (kbhit()) {
c = getch()
if (c indicates a control character) {
c = getch();
switch c: {
case up arrow: command = up;
...
}
}
}
您可能希望创建一个枚举来存储当前 "mode" 或最后一个命令。
#include<stdio.h>
#include<Windows.h>
#include<conio.h>
#define Ukey 87
#define ukey 119
#define Dkey 115
#define dkey 83
#define Lkey 97
#define lkey 65
#define Rkey 100
#define rkey 68
int main(){
int x=0;
int y=0;
int prev=rkey;
while(true){
Sleep(50);
system("cls");
printf("x : %d\ny : %d",x,y);
if(!kbhit()){
if(prev==ukey){
y--;
}else if(prev==dkey){
y++;
}else if(prev==lkey){
x--;
}else if(prev==rkey){
x++;
}
}else if(getch()==ukey||getch()==Ukey){
y--;
prev=ukey;
}else if(getch()==dkey||getch()==Dkey){
y++;
prev=dkey;
}else if(getch()==lkey||getch()==Lkey){
x--;
prev=lkey;
}else if(getch()==rkey||getch()==Rkey){
x++;
prev=rkey;
}
}
}
所以基本上我的程序检测键盘键(我定义为 Ukey、Dkey、Lkey 和 Rkey 的 w、a、s 或 d)。该程序旨在通过按键检测方向,更改 x 和 y 值并保持它直到按下另一个键。
我的问题是,当程序 运行 和默认方向(右)被初始化时,当我按下另一个键时 while 函数就停止了。如果我按下该键几秒钟,它只会不断改变 x 和 y 值。
我的代码有什么问题?这是我第一次使用 kbhit,所以你的回答对我有很大的帮助。谢谢
我认为问题出在 else if(getch()==ukey||getch()==Ukey)
结构中,该结构对 getch
进行了多次调用。如果 kbhit
返回 true,那么对 getch
的第一次调用将是非阻塞的。但是,在按下新键之前,每个额外的调用都将被阻塞。
解决方案:重组您的程序,以便只有一次调用 getch
:
while (true) {
if (kbhit()) {
// A key was pressed. Find out which one.
prev = getch()
}
switch (prev) {
case ukey: y--; break;
case UKey: ...
...
}
}
此外,专门检测来自箭头键的双字符响应可能是有利的。我不记得它是如何工作的,但逻辑是这样的:
if (kbhit()) {
c = getch()
if (c indicates a control character) {
c = getch();
switch c: {
case up arrow: command = up;
...
}
}
}
您可能希望创建一个枚举来存储当前 "mode" 或最后一个命令。