首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >kbhit和对函数的多次调用

kbhit和对函数的多次调用
EN

Stack Overflow用户
提问于 2017-11-01 08:40:44
回答 1查看 570关注 0票数 0

在制作一个小行星射击游戏的时候,我使用了_kbhit()kbhit()。我不是专家,但我认为我遇到了以下问题:

代码语言:javascript
复制
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()函数中)之后缓冲区上没有更多的输入?

EN

回答 1

Stack Overflow用户

发布于 2017-11-01 10:48:18

你的问题是,你试图用这段代码读取你感兴趣的每个键一次:

代码语言:javascript
复制
if(GetUserInput() == 2)
    printf("W");
if(GetUserInput() == 1)
    printf("S");

例如,我按下'S',你读取键,检查返回值是否为2。然后,您尝试读取另一个键,但我没有按下一个键,因此第二次检查“S”也会失败。

要解决这个问题,您需要对从GetUserInput()获得的值执行所有测试。

代码语言:javascript
复制
int val = GetUserInput();
if(val == 2)
    printf("W");
else if(val == 1)
    printf("S");

您不需要使用else if,但是一旦找到匹配项,就没有必要一直检查所有的检查是否都是互斥的。您可以考虑使用switch语句和枚举,而不是硬编码的魔术值,或者甚至直接返回键值(如果按下一个键值)和一个与您感兴趣的任何键都不匹配的标记值(如0)。

下面是一个完整的例子,适用于我:

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47046581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档