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