如何重置kbhit()?

时间:2018-05-02 18:25:52

标签: c++ console-application kbhit

我正在制作打字游戏,其中随机字母从屏幕顶部下降到底部,用户需要按下该键才能获得分数。有两个嵌套循环用于使这种下降效果。外部while循环生成随机字母和x轴上的随机位置,而内部for循环增加y轴坐标并打印每个y坐标值的字符以使其下降。现在的问题是,当我在for循环中使用kbhit()函数来检查用户是否按下了任何键时,当用户没有按任何键时它返回false。但是当用户第一次按下某个键时,它返回true并且用户获得该分数。但是当再次为下一个随机字母调用kbhit()时,无论用户是否按下了键盘,它都会返回true,因为用户先前按了一下键。可能是我需要清除键盘缓冲区,但我不知道该怎么做。这是

 while (true) {
        ch = rand() % 26 + 65;
        xPos = rand() % (x_end - x_start - 1) + x_start + 1;
        for (int i = y_start + 1; i < y_end - 1 && !kbhit(); i++) {
            cur_pos.X = xPos;
            cur_pos.Y = i;
            SetConsoleCursorPosition(console_handle, cur_pos);
            Sleep(150);
            cout << " ";
            cur_pos.X = xPos;
            cur_pos.Y = i + 1;
            SetConsoleCursorPosition(console_handle, cur_pos);
            cout << ch;
            if (i == y_end - 2) {
                cur_pos.X = xPos;
                cur_pos.Y = i + 1;
                SetConsoleCursorPosition(console_handle, cur_pos);
                cout << ch;
                Sleep(150);
                cur_pos.X = xPos;
                cur_pos.Y = i + 1;
                SetConsoleCursorPosition(console_handle, cur_pos);
                cout << " ";

            }

        }

2 个答案:

答案 0 :(得分:0)

ReadConsoleInput documentation page告诉您如何检查输入是否可用(等待控制台句柄,如果要轮询则可能是零时间)以及如何将其取消(通过调用!!! 5 %html{:lang => "en"} %head = render partial: 'common/html_head' %body#static{ class: body_css_class } = content_for?(:base_content) ? yield(:base_content) : yield 或{ {1}})

通过独占使用控制台API,您将避免它与ReadConsoleInput之间的任何不同步,特别是只有等待鼠标事件的情况,因此FlushConsoleInputBuffer返回false但您仍然希望冲洗队列。

答案 1 :(得分:0)

使用 kbhit() 检测按键按下,如果按键被按下,使用 getch() 重置 kbhit()。例如,

#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
char ch;
for (int i = 0; i < 100000; i++){
cout << i << endl;
if (kbhit()){
ch = '#';
getch();
}
else{
ch = '_';
}
cout << ch << endl;
usleep(100000);
gotoxy(0, 0);
}
}