Как сбросить kbhit()?
Я создаю игру, в которой случайные алфавиты падают сверху вниз, и пользователю нужно нажать эту клавишу, чтобы получить оценку. Для создания эффекта падения используются две вложенные петли. Внешний цикл 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 << " ";
}
}
2 ответа
ReadConsoleInput
На странице документации рассказывается, как проверить, доступен ли ввод (дождаться дескриптора консоли, возможно, в течение нулевого времени, если вы хотите опросить) и как снять его (вызвав ReadConsoleInput
или же FlushConsoleInputBuffer
)
Используя исключительно консольный API, вы избежите любой десинхронизации между этим и kbhit()
особенно в случае, когда ожидают только события мыши, поэтому kbit()
возвращает false, но вы все равно хотите очистить очередь.
используйте 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);
}
}