在制作小行星射击游戏时,我使用_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()
函数中)?
答案 0 :(得分:1)
您的问题是,您尝试使用此代码对您感兴趣的每个密钥阅读一次:
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");
如果您没有使用其他内容,但是一旦找到匹配项,检查所有支票是否互相排斥是没有意义的。您可以考虑使用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;
}