kbhit和多个函数调用

时间:2017-11-01 00:40:44

标签: c kbhit

在制作小行星射击游戏时,我使用_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()函数中)?

1 个答案:

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