我正在为学校项目创建一个非常简单的猜数字游戏,但在重复主菜单时遇到了麻烦。我使用do-while循环创建了它,而我遇到的问题是菜单选择变量是一个int,因此当我(或用户)无意中从菜单中选择非整数输入时,在主循环末尾无法捕获,程序将无限重复。相反,如果您在菜单选择中输入了无效的int,程序将捕获该错误并显示“ invalid input”消息,然后重复主菜单。很难以书面形式确切解释我的意思,因此这里是带有相关星号的相关行的源代码。我将另存为.cpp,并使用}while(condition)在linux中进行编译。老师禁止在条件语句中进行硬编码,因此禁止使用全局常量。#include <iostream>#include <ctime>#include <cstdlib>using namespace std;const int PLAY = 1, HIGH_SCORE = 2, EXIT = 3;const char YES = 'y', NO = 'n';int main(){// Randomly generated value int randomNumber;// User input int userGuess, menuChoice; char repeat;// Calculated value int numberOfGuesses;// Place-holder values (to be replaced by calculated values) int score1 = 1000, score2 = 2000, score3 = 3000; cout << endl << endl; cout << "Greetings! This is a number guessing game where I think of" << endl << "a whole number between one and ten and you try to guess it!" << endl << "You can guess as many times as you like, so don't be afraid" << endl << "to use trial and error, but your score is based on the " << endl << "number of guesses you make (the lower the better) so don't " << endl << "guess too haphazardly. Remember, only guess whole numbers!" << endl << endl; do { cout << endl << "Main menu." << endl << "1. Play game" << endl << "2. Display high scores" << endl << "3. Exit game" << endl << "Please select an option: "; cin >> menuChoice; if (cin.fail()){ cout << "Please enter a valid choice" << endl; continue; } cin.ignore(); switch(menuChoice) { case PLAY: do { unsigned seed = time(0); srand(seed); randomNumber = 1 + rand() % 10; cout << endl << "Press enter when you're ready to begin!"; cin.ignore(); cout << "Ok I thought of one!" << endl << endl; numberOfGuesses = 0; do { numberOfGuesses++; cout << "Enter your guess: "; cin >> userGuess; cin.ignore();// Check user's guess if (userGuess == randomNumber) cout << "Correct! That was impressive!" << endl << endl; else if (userGuess < randomNumber) cout << "Not quite, you guessed low." << endl << endl; else if (userGuess > randomNumber) cout << "Not quite, you guessed high." << endl << endl; }while (userGuess != randomNumber); cout << "Your score for this game was " << numberOfGuesses << endl;// Determine if a high score was beaten if (numberOfGuesses <= score1) { score3 = score2; score2 = score1; score1 = numberOfGuesses; cout << "That's a new all time high score!" << endl; } else if (numberOfGuesses <= score2) { score3 = score2; score2 = numberOfGuesses; cout << "That's a new high score!" << endl; } else if (numberOfGuesses <= score3) { score3 = numberOfGuesses; cout << "That's a new high score!" << endl; } else { cout << endl; } cout << "Would you like to play again? y/n: "; cin.get(repeat); cin.ignore(); while (tolower(repeat) != YES && tolower(repeat) != NO) { cout << endl; cout << "Sorry, that is an invalid choice." << endl << "Please enter 'y' for yes or 'n' for no: "; cin.get(repeat); cin.ignore(); } }while (tolower(repeat) == YES); break; case HIGH_SCORE: cout << endl << "High Score 1: " << score1 << endl << "High Score 2: " << score2 << endl << "High Score 3: " << score3 << endl << endl; cout << "Press enter to continue. "; cin.ignore(); break; case EXIT: cout << endl << "Thanks for playing, I'll see you next time!" << endl << endl; break; default: cout << endl << "That is an invalid selection, please enter '1', '2' or '3'" << endl; break; } }while (menuChoice != EXIT); return 0;}关于当前答案的代码已编辑。如果您需要更多信息,请告诉我,谢谢! 最佳答案 像这样使用cin.fail()(而不只是cin >> menuChoice;)(在this post之后建模):cin >> menuChoice;if (cin.fail()) { cout << "Please enter a valid choice" << endl; cin.clear(); cin.ignore(); continue;}//Remove the cin.ignore() at this place!有关更多详细信息,请参见this SO thread关于c++ - 在do-while循环中发生输入验证的C++错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21368810/
10-12 05:49