0

わかりましたので、非常に単純なテキストのロールプレイング ゲームを作成しようとしていますが、問題が発生しています。このコードをループするために使用できるループの種類がわかりません。

getline(cin, response);
if(response == "Pick up the gun")
{
    cout << "You pick up the gun.\n";
    cout << "Knock down the door with it? (Y/N)\n";
    getline(cin, response);
    if(response == "Y")
    {
        cout << "The door opens.\n";
        cout << "You see a zombie.\n";
        cout << "You see an open window.\n";
        cout << "What do you do?\n";
        getline(cin, response);
        if(response == "Shoot the zombie")
        {
            cout << "The zombie dies and it attracts other zombies.\n";
            cout << "GAME OVER!\n";
            cin.get();
            return 0;
        }
        else if(response == "Jump out the window")
        {
            cout << "The zombie does not hear you and you safely make it out!\n";
            cout << "VICTORY!\n";
            cin.get();
            return 0;
        }
    }
    else if(response == "N")
    {
    }
}
else if(response == "Open the door")
{
    cout << "It appears to be locked.\n";
}

したがって、彼らが間違った場合(たとえば、「ドアを開ける」を選択すると、ロックされていると表示され、何らかの理由でプログラムが終了します。ユーザーが別の選択肢を選択できるようにしたいのですが、持っていません単に空白にするか、壊れるか、終了するなど)ループするだけですが、試してみると、プログラムが終了せず、入力できるようになり、何があっても何も起こらないか、100回のようにテキストを絶対にスパムし、私は何もできないなど、とても奇妙です。どうすればそれができますか?どうも!

4

2 に答える 2

2

これをたくさん行う場合は、読者が簡単に入力できるようにすることをお勧めします...ユーザーが何を入力すればよいかわからなくなるというよりは、パスを選択するようなものです。

int GetChoice( vector<string> & choices )
{
    cout << "Do you wish to:" << endl;

    // Output choices 1..N
    for( int i = 0; i < choices.size(); i++ ) {
        cout << "  " << i+1 << ". " << choices[i] << endl;
    }

    // Ask user for their choice.
    for(;;) {
        // This is pretty basic.  You could use getline instead...
        cout << "Enter your choice: ";
        cout.flush();
        int n;
        cin >> n;

        if( n < 1 || n > choices.size() ) {
            cout << "Invalid choice.\n";
            continue;
        }

        // Output the choice and clear the choices vector (so it can be used again)
        cout << "You " << choices[n-1] << endl;
        choices.clear();
        return n;
    }
 }

それで:

 vector<string> opts;
 int choice;

 cout << "You see a door and a gun.\n";
 do {
     opts.push_back( "try the door" );
     opts.push_back( "pick up the gun" );
     choice = GetChoice(opts);
     if( choice == 1 ) cout << "The door appears to be locked.\n";
 } while( choice == 1 );
 if( choice != 2 ) GameQuit();

 cout << "You are armed and dangerous.  Now what?\n";
 opts.push_back( "assault the door with the gun" );
 opts.push_back( "look down the barrel and pull the trigger" );
 choice = GetChoice(opts);

 if( choice == 1 ) {
    cout << "The door crashes from its hinges.\n";
    cout << "You see a zombie and an open window.\n";
    opts.push_back( "shoot the zombie" );
    opts.push_back( "jump out the window" );
    choice = GetChoice(opts);

    if( choice == 1 ) {
        cout << "The zombie explodes and it attracts hundreds more zombies.\n";
        GameOver();
    } else if( choice == 2 ) {
        cout << "You plummet 17 stories to a grisly death.\n";
        GameOver();
    } else {
        GameQuit();
    }
 } else if( choice == 2 ) {
    cout << "Your head explodes.\n";
    GameOver();
 } else {
    GameQuit();
 }

きれいとは言えませんが、この形式では、他のオプションをいつでも使用できます (たとえば、'q' で終了すると、0 が返される可能性があります)。

明らかに、この方法でゲームを実行すると、多くのネストされたブロックが発生することがifわかります...以前のコメントで提案されているように、ゲームをステートマシンとして配置する方がよいでしょう。最終的に、ゲーム全体を含む単純なテキスト ファイルを定義できます。

于 2012-11-18T22:25:47.377 に答える
0

FALSE に設定されたブール変数を作成します。ユーザーが「ウィンドウから飛び出す」を選択した場合は、ブール変数を TRUE に変更します。次に、コード全体をループに入れます。

while (myBooleanVariable == FALSE) {

  //insert game code

}
于 2012-11-18T21:32:29.573 に答える