gpt4 book ai didi

c - kbhit 和函数的多次调用

转载 作者:行者123 更新时间:2023-11-30 14:53:46 25 4
gpt4 key购买 nike

在制作小行星射击游戏时,我使用了 _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() 函数中)缓冲区上没有更多输入吗?

最佳答案

您的问题是您尝试使用此代码对您感兴趣的每个键读取一次:

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;
}

关于c - kbhit 和函数的多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47046581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com