0

私はプログラミングと C++ を初めて使用し、楽しみのために小さな文字列型のゲームを作成し始めました。これにより、プログラム全体でユーザーに 2 つのオプションが与えられますが、プログラムの最後の部分では、最終的な入力に対して一意のオプションを出力することができません。 (makeCure) - プログラム全体ではなく、最後に出力したいだけです。意味を成していることを願っています :/ .Iv は試行錯誤を繰り返しましたが、試行すればするほど、より多くの問題が作成されます。Iv は、問題があると確信している私のコードで以下に示されています。どんなアドバイスでも大歓迎です。

#include<iostream>
#include<string>

using std::string;

bool intro(void);
void room(bool enemy, bool data, bool cure, string description);

//player stats
string Name = "";

//enemy states
string enemyName = "";

//data stats
string dataName = "";

//Cure - Option in room7 only
string makeCure = "";

//room descriptions(string constructs)

const string room1 = "You enter the first town of infected Zombies.";
const string room2 = "You are overwelmed by Zombies, and plunder into the sewers to escape.";
const string room3 = "You make your way to safety and find yourself in the Central Town Hall.";
const string room4 = "You decide to venture into the local forest to find the finalingrediants";
const string room5 = "You venture further for the final ingrediant, into a nearby Cave.";
const string room6 = "Its time for you to face the Zombie General!!!";
const string room7 = "You work day and Night in the Labs to make the Cure.";


int main(void)
{
    if(intro())
        return 0;
    dataName = "First Ingrediant- Zombie Rags with infected DNA";
    enemyName = "Zombie Soldior";
    room(true, true, false, room1);

    enemyName = "Massive Zombie Rat";
    room(true, false, false, room2);

    dataName = "Seconed Ingrediant- StemCells";
    enemyName = "Mutated Scientists";
    room(true, true, false, room3);

    dataName = "Third Magic-Mushrooms";
    room(false, true, false, room4);

    dataName = "Fourth Final Ingrediant - Coffee Beans";
    enemyName = "Commander Zombie";
    room(true, true, false, room5);

    enemyName = "Zombie General";
    room(false, true, false, room6);
    return 0;


    makeCure = "Elixier to Save the World";
    room(false, false, true, room7);
    return 0;
}

bool intro(void)
{
    using std::cout;
    using std::cin;

    cout << "Brave Soul!!! What is your name?\n";
    cin >> Name;
    cout << "Ahh... " << Name << " You say.." << "How about Zombie Slayer?.. Good, glad we agree!\n";

    cout << "Humanity is in need of your Help, "
        << "The world is being infected by the\n"
        << "ZD1678 ZOMBIE VIRUS \n"
        << "And we need to send you to Cape Town to stop the central spread.\n"
        << "Your task will be tough, but we know you can do it \n"
        << "Will you accept the challenge?\n\n";

    cout << "1)Yes. \n"
        << "2)No. \n\n";
    int response;
    cin >> response;
    return !(response ==1);
}

void room(bool enemy, bool data, bool cure, string description)
{
    using std::cout;
    using std:: cin;

    while(true)
    {
        cout << description.c_str() << "\n\n";
        int response = 0;
        do
        {
            cout << "Shall Our Hero continue his Quest?\n";
            if(enemy)
                cout << "1) Attack the "             
                << enemyName.c_str() << "\n";
            else if(!enemy)
                cout << "1) venture further...."; 

            if(data)
                cout << "2)Pick up the "    
                << dataName.c_str() << "\n";
            cin >> response;

            /* Trying to create the last if that only kicks in at room7( string makeCure )
            * that displays the option to make the cure
            * This is where my Problem is.
            * Iv tried anouther if
            * and else
            * and while and nothing works, its just messes up everything..
            * badly
            */

        } while(response < 1 || response > 2);

        switch(response)
        {
        case 1:
            if(enemy)
            {
                enemy = !enemy;
                cout << "You slay the deadly "
                    << enemyName.c_str() << "\n";
            }
            else if(!enemy)
                return;
            break;
        case 2:
            data = !data;
            cout << "You pick up the "
                <<  dataName.c_str() << "\n";
            break;
        }
    }
}
4

2 に答える 2

1

おそらくやりたいことは、リストを書き出してユーザーに提示するたびに可能なイベントのリストを動的に生成することです。その後、リストへの応答を照合して、ユーザーがやりたいことを取得できます。このような:

enum EventType
{
    ET_Enemy,
    ET_Item,
    ET_Cure,
    ET_Continue,
    ET_MAX
};

void room(bool enemy, bool data, bool cure, string description)
{
 using std::cout;
 using std:: cin;

    int currentEventChoices[ET_MAX];
    int numEventChoices;

    while(true)
    {
        cout << description.c_str() << "\n\n";


        int response = 0;
        do
        {
            numEventChoices = 0;

            cout << "Shall Our Hero continue his Quest?\n";

            if(enemy)
            {
                cout << (numEventChoices+1) << ") Attack the "             
                        << enemyName.c_str() << "\n";
                currentEventChoices[numEventChoices] = ET_Enemy;
                numEventChoices++;
            }
            if(data)
            {
                 cout << (numEventChoices+1) << ") Pick up the "    
                        << dataName.c_str() << "\n";
                currentEventChoices[numEventChoices] = ET_Item;
                numEventChoices++;
            }
            if(cure)
            {
                cout << (numEventChoices+1) << ") cure related string "
                        << makeCure.c_str() << "\n";
                currentEventChoices[numEventChoices] = ET_Cure;
                numEventChoices++;
            }

            cout << (numEventChoices+1) << ") venture further....\n"; // note if this is only meant to be an option if there is no enemy, put it in an else after the if(enemy)
            numEventChoices++;

                cin >> response;



        } while(response < 1 || response > numEventChoices);

        switch(currentEventChoices[response-1])
        {


            case ET_Enemy:
                enemy = !enemy;
                    cout << "You slay the deadly "
                            << enemyName.c_str() << "\n";
                break;
            case ET_Item:
                 data = !data;
                cout << "You pick up the "
                        <<  dataName.c_str() << "\n";
                break;
            case ET_Cure:
                //do cure stuff
                break;
            case ET_Continue:
                return;
        }
   }
}

あなたが抱えている問題は、オプション番号をイベントに一致させるたびに非常に静的な次の if/else ステートメントを使用するだけで、非常に複雑で面倒になることです。敵の有無、データの有無。しかし今、あなたは治療法で別のブランチを追加しています。そのようにするのは本当に複雑です。

于 2013-06-03T04:17:33.623 に答える
0

必要なものを理解するのは少し難しいので、必要なものでない場合は教えてください。

中括弧とインデントを一貫して使用すると、これに非常に役立ちます。

do {
    cout << "Shall Our Hero continue his Quest?\n"; 
    if (enemy) {
        cout << "1) Attack the " << enemyName << "\n";
    } else {
        cout << "1) venture further...."; 
    }
    if (data) {
        cout << "2) Pick up the " << dataName << "\n";
    }
    if (cure) {
        cout << "2) take the " << makeCure << "\n";
    }
    cin >> response;
} while (response < 1 || response > 2);

スイッチ部分の「ケース 2」を修正します。

 case 2:
        if (data) {
            data = false;
            cout << "You pick up the " <<  dataName << "\n";
        } else if (cure) {
            // fill in ...
        }
        break;

ノート:

  1. 「\n」の代わりにendl(from )を使用できます。stdcout << "hello" << endl;
  2. 多くのグローバル変数を引数として渡すことができるので、それらをグローバルにする必要はありません (一般的に、グローバルは良くありません)。
  3. ゲームの大部分は、配列と構造体に圧縮できます。つまり、「データ駆動型」と「テーブル駆動型」です。すでにそこに到達したかどうかはわかりませんが、これらの部分を特定してみてください。
  4. if(enemy) ... else if(!enemy)その部分は必要ありません!enemy。によって暗示されますelse
于 2013-06-03T04:14:17.673 に答える