我目前正在编写游戏版本" Mastermind"并且希望在用户输入字母“Q”时退出,无论是来自主菜单还是在游戏中被要求猜测时。
我遇到的问题是所选的用户输入是在一个函数中进行评估的,通常在另一个函数中调用,我不确定如何在不忽略当前堆栈清理的情况下正确退出游戏。
我假设我可以尝试进行自定义异常(虽然我不确定如何在C ++中完成此操作,仍然在学习),然后将每个调用放在main()中,稍后可以调用menuSelection()函数抓住,但我不知道这是否是最佳的。
我将尝试快速总结一下我的程序示例。显然要留下很多,只是为了显示我的程序在退出场景时的位置。
void printMainMenu(){
cout<<"blah blah blah... Enter a selection: ";
string input;
getline(cin, input);
menuSelection(input);
}
void menuSelection(string input){
if(input == 'Q')
Exit Program; // <-- Need to exit when here
else
(other options);
}
int main(){
printMainMenu(); // <-- menuSelection called here
while(cin >> solution){
GameBoard currentGame = GameBoard::GameBoard(solution);
cout>>"Please make a guess or enter 'Q' to quit: ";
string guess;
getline(cin, guess);
if(guess.size() == 1)
menuSelection(guess); // <-- and here
else
currentGame.checkGuess(guess);
}
}
将每个menuSelection或printMenu调用置于try catch中是否是处理此问题的最有效方法?
答案 0 :(得分:0)
我这样做的方法是拥有一个管理整个游戏的课程。如果它应该退出,这将有一个bool
sigalling。所有这些功能都将成为这一类的成员。
class GameLogic {
bool should_quit = false;
void mainLoop() {
while (!should_quit) {
// call whatever you need
}
}
void someDeepNestedCalledFunction() {
if (whatever_reason) {
should_quit = true;
return;
}
}
};
答案 1 :(得分:0)
最简单的解决方案是退出(0)(我不推荐,因为它不会展开堆栈)或抛出在程序顶层捕获的异常。
编辑:代码
void menuSelection(string input){
if(input == 'Q')
throw std::runtime_error; // Maybe use another exception class
主要功能将成为
int main(){
printMainMenu(); // <-- menuSelection called here
try {
while(cin >> solution){
GameBoard currentGame = GameBoard::GameBoard(solution);
cout>>"Please make a guess or enter 'Q' to quit: ";
string guess;
getline(cin, guess);
if(guess.size() == 1)
menuSelection(guess); // <-- and here
else
currentGame.checkGuess(guess);
}
}
catch (const std::exception& e)
{
// Quit
}
}