在制作一个小行星射击游戏的时候,我使用了_kbhit()和kbhit()。我不是专家,但我认为我遇到了以下问题:
int run = 1;
int main() {
while(run){
if(GetUserInput() == 2)
printf("W");
if(GetUserInput() == 1)
printf("S");
Sleep(50);
}
}
int GetUserInput(){
if(kbhit()){
char c = _getch();
if(c == 's')
return 2;
if(c == 'w')
return 1;
}
else
return 0;*
}那么,我认为发生了什么,它对GetUserInput()进行了第一次检查,并且由于getch()的性质,键盘被从缓冲区读取并丢弃?无论如何,我将值存储在c中,并且应该相应地返回。但它只做第一次检查。是不是因为在第一次检查(在main()函数中)之后缓冲区上没有更多的输入?
发布于 2017-11-01 10:48:18
你的问题是,你试图用这段代码读取你感兴趣的每个键一次:
if(GetUserInput() == 2)
printf("W");
if(GetUserInput() == 1)
printf("S");例如,我按下'S',你读取键,检查返回值是否为2。然后,您尝试读取另一个键,但我没有按下一个键,因此第二次检查“S”也会失败。
要解决这个问题,您需要对从GetUserInput()获得的值执行所有测试。
int val = GetUserInput();
if(val == 2)
printf("W");
else if(val == 1)
printf("S");您不需要使用else if,但是一旦找到匹配项,就没有必要一直检查所有的检查是否都是互斥的。您可以考虑使用switch语句和枚举,而不是硬编码的魔术值,或者甚至直接返回键值(如果按下一个键值)和一个与您感兴趣的任何键都不匹配的标记值(如0)。
下面是一个完整的例子,适用于我:
#include <conio.h>
#include <stdio.h>
int GetUserInput()
{
if (_kbhit())
{
char c = _getch();
switch (c)
{
case 's':
case 'S':
return 2;
case 'w':
case 'W':
return 1;
case 'x':
case 'X':
return -1;
}
}
return 0;
}
int main()
{
for (;;)
{
int c = GetUserInput();
switch (c)
{
case 1:
printf("W");
break;
case 2:
printf("S");
break;
case -1:
return 0;
}
}
return 0;
}https://stackoverflow.com/questions/47046581
复制相似问题