C ++暂停函数似乎不在do-while循环中工作

时间:2014-05-15 16:55:17

标签: c++ function while-loop do-while

我正在用c ++编写hangman,它也接受来自用户的命令(这样他们就可以看到线索并退出游戏)。

我目前正在实施这些命令,但似乎无法让它发挥作用。我被困在一个帮助命令上,该命令使用pause()函数让用户阅读文本。

暂停功能似乎不起作用,即使它在程序的早期工作。

代码到目前为止

以下是代码:HelloWorld.cpp

void pause( string msg = "Press enter to continue..." ){
    cout << msg;
    cin.ignore();
}

// game loop.
do {
    correctLetters = 0;

    nl();
    showLives(lives);
    nl(5);
    showWordGuessed(wordGuessed);
    nl(1);
    cout << "Guess a letter (type /help to see commands): ";
    cin >> guess;

    if (guess.size() == 1){
        for (int i = 0;i < 5;i++){
            if (word[i] == guess) wordGuessed[i] =  word[i];
        }
    } else if (guess[0] == '/'){
        if (guess == "/ans"){

        } else if (guess == "/clue"){

        } else if (guess == "/help"){
            nl();
            cout << "Typing /ans will show you the answer and quit the game.\n";
            cout << "Typing /clue will show you one unknown letter.\n";
            cout << "Typing /guess will allow you to guess the entire word.\n";
            cout << "Typing /hangman will quit the game.\n";
            cout << "Typing /help will show you this help message.\n\n";
            pause("Press enter to continue playing...");
        } else if (guess == "/guess"){

        } else if (guess == "/hangman"){
            return 0;
        } else {

        }
    } else {
        nl();

    }

    for (int i = 0;i < 5;i++){
        if (wordGuessed[i] ==  word[i]) correctLetters++;
    }

    win = ((correctLetters == 5) ? win = true : win = false);

} while (!win);

cout << "you win";

1 个答案:

答案 0 :(得分:3)

您的暂停功能并不能完全符合您的预期。

让我们想象从输入流中读取一些数据,如下所示:

int i;
std::cin >> i;

用户输入一个数字,然后点击返回。 operator>>会从cin中提取字符,直到找到无法转换为int的字符,然后才会离开\n。在普通用户输入的情况下,流上留下的字符是换行符(pause)。

当您来调用std::cin.ignore() 功能时,您会尝试执行此操作:

\n

将忽略输入流上的一个单个字符。从上次有人输入数据时,只有流上的pause流出!所以std::cin >> whatever会立即返回。

您需要采取措施在使用后清理输入流,可能是在您使用std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 后每次都这样做。

>>

这会将最后一个有效输入字符后的所有内容都删除到最终换行符。在那之后你的暂停功能可能会好一点。

或者,您可以使用getline代替使用std::string stuff; std::getline(std::cin, stuff); if (stuff.length() > 1) std::cout << "Easy, tiger.\n"; ,而getline用于处理以换行符结尾的文本字符串。

\n

pause会为您删除尾随的{{1}},这也有助于您的{{1}}功能更好地运作。