Как сбросить kbhit ()? - PullRequest
0 голосов
/ 02 мая 2018

Я занимаюсь набором текста, в котором случайные алфавиты падают сверху вниз, и пользователю нужно нажать эту клавишу, чтобы получить оценку. Для создания эффекта падения используются две вложенные циклы. Внешний цикл while генерирует случайный алфавит и случайную позицию на оси x, в то время как внутренний цикл for увеличивает координаты оси y и печатает символы для каждого значения координаты y, чтобы заставить его упасть. Теперь проблема в том, что когда я использую функцию kbhit () в цикле for для проверки, нажали ли пользователи какую-либо клавишу или нет, она возвращает false, когда пользователь не нажал ни одной клавиши. Но когда пользователь нажимает клавишу в первый раз, он возвращает истину, и пользователь получает оценку. Но когда 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 << " ";

            }

        }

1 Ответ

0 голосов
/ 02 мая 2018

На странице документации ReadConsoleInput рассказывается, как проверить, доступен ли ввод (ждать на дескрипторе консоли, возможно, в течение нулевого времени, если вы хотите опросить) и как снять его (вызывая ReadConsoleInput или FlushConsoleInputBuffer)

Используя исключительно консольный API, вы избежите любой десинхронизации между этим и kbhit(), особенно в случае, когда ожидают только события мыши, поэтому kbit() возвращает false, но вы все равно захотите очистить очередь.

...