Как очистить текущее содержимое входного буфера, но НЕ игнорировать следующие несколько входов
Я делаю игру для печати. На экране будет отображаться случайное слово, и вы должны его напечатать. Я использую getch() в цикле. Каждую итерацию он проверяет введенную букву и, как только вы совершите ошибку, вычитает очки, воспроизводит звуковой эффект и переходит к следующему слову.
Я пытаюсь игнорировать вводимые данные во время воспроизведения звукового эффекта. Естественно, требуется некоторое время, чтобы осознать, что я допустил ошибку, поэтому, если я не добавлю это, я в конечном итоге совершу несколько ошибок, поскольку следующие несколько слов вспыхивают, пока я все еще печатаю старое слово. (Я думаю, что другие люди будут иметь такую же проблему, или, может быть, это только я?: P)
Я пытался поместить cin.ignore(std::numeric_limits::max(), '\n') перед входным циклом, но они что-то напортачили, и getch() перестает работать. Вы можете печатать как обычно, поскольку getch() больше не захватывает его. Я также должен нажать Enter дважды, чтобы двигаться дальше. Мне нужно очистить только то, что находится в буфере, и больше ничего я не пробовал, но все они дают схожие результаты.
Есть ли способ сделать то, что я планирую?
while (1){
randword = "youtube";
cout << endl << endl << "The word is " << randword;
cout << endl << "<< ";
//some code here to clear ONLY whats IN the buffer (so it doesnt eat the next few inputs and etc)
cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
int poscounter = 0; // counts how many letters typed so far, and if all typed then of course gives total number of letter in word
for (std::string::iterator it = randword.begin(); it != randword.end(); ++it){ // allows input loop to cycle thru letters of the word until the end. but doesnt count them, so have to manually do that with poscounter
poscounter = poscounter + 1;
randwordcurrent = *it; // get letter of word at current iterator position
playertempanswer = _getch(); // get player answer. no need for enter! however _getch() does not display the input, so must output manually.
cout << playertempanswer; // manual output since getch() does not display user input
if (playertempanswer == randwordcurrent){ // correct answer
PlaySound(TEXT("rightfx.wav"), NULL, SND_FILENAME | SND_ASYNC);
playeranswerstate = 1;
}
else if ((playertempanswer != randwordcurrent) && (playertempanswer != "|")){ // incorrect answer, but not exit game trigger either
playeranswerstate = 0;
break; // break out of for loop early
}
} // end of randword input loop
if (playeranswerstate == 1){ // actions for right answer
std::this_thread::sleep_for(milliseconds(160)); // give time for rightfx to finish before playing the wordrightfx
PlaySound(TEXT("wordrightfx.wav"), NULL, SND_FILENAME | SND_ASYNC);
}
else if (playeranswerstate == 0){ // actions for wrong answer
PlaySound(TEXT("wrongfx.wav"), NULL, SND_FILENAME | SND_ASYNC);
std::this_thread::sleep_for(milliseconds(500)); // give time for wrongfx to finish ()
}
} //end of infinite while loop
урезанная версия проекта, показывающая только необходимые части: https://onedrive.live.com/redir?resid=EE70CC84F483296F!1864&authkey=!ABLuRHvr_SNlaKs&ithint=folder%2C