我正在用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";
答案 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}}功能更好地运作。