0

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

4

1 回答 1

1

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

if(GetUserInput() == 2)
    printf("W");
if(GetUserInput() == 1)
    printf("S");

比如我按'S',你读key,检查返回值是不是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;
}
于 2017-11-01T02:48:17.963 回答