Как очистить текущее содержимое входного буфера, но НЕ игнорировать следующие несколько входов

Я делаю игру для печати. На экране будет отображаться случайное слово, и вы должны его напечатать. Я использую 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

0 ответов

Другие вопросы по тегам