使用C ++中的函数输入用户输入的程序

时间:2015-05-23 17:36:16

标签: c++

我目前正在编写游戏版本" 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中是否是处理此问题的最有效方法?

2 个答案:

答案 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
    }
}