2017-06-10 4 views
0

現在、私はC++クラス用のテキストベースのゲームを作成しようとしていますが、if-elseを作成する方法を理解できないようですストーリーが意味をなさせるために、以前に収集されたアイテムがある場合にのみステートメントが実行されます。アイテムがインベントリにない場合は、プレイヤーのオプションが再びループされ、別の選択肢が選択されます。私はやってみた:else if(input6 == "rub" || inventory[0] == "Purple Fruit")しかし、それはプレイヤーがアイテムを持っているかどうかにかかわらず、文を実行するだけです。御時間ありがとうございます!!私は本当にそれを意味します。If-Elseステートメントに "inventory [0]"を実装するには

do { 
    cout <<"You gotta start doing something quick before the swelling gets worse" <<endl; 
    cout <<"Options are: \"rub\" the random substances oozing from your purple fruit onto your swelling neck, \"keep\" following the tracks until you could get help from the humans if those tracks actually belong to a human, or \"look\" around for anything to help cure your swelling neck\""<<endl; 
    cin >>input6; 

    if (input6 == "keep") 
    { 
     cout << "" <<endl; 
     return 0; 
    } 

    else if (input6 == "look") 
    { 
     cout <<"Good luck" <<endl; 
    } 

    else if (input6 == "rub" || inventory[0] == "Purple Fruit") 
    { 
     cout << ".." <<endl; 
     return 0; 
    } 

} while (input6 != "grab"); 

cout <<"Out"<<endl; 
inventory[1] = "Pink Sap"; 
cout<< inventory[1] <<endl; 
+1

どのように文字列を比較しますか? –

+6

[mcve]を投稿してください。 – Quentin

答えて

0

"="を使用して文字列を比較することはできません。文字列を比較するには、strcmp関数を使用する必要があります。

+1

質問にはタグが付けられています。C++では、OPが 'char'配列や' std :: string'を使っているかどうかわかりません。 – HolyBlackCat

+0

私は実際にすることができます。 == – kevin

+0

を使用して文字列を比較するときにプログラムを実行するのに問題はありませんコード内の文字列をどのように比較しているのかわかりません。Quentinはソースを含めてみれば誰でも確認できます。 – krish

0

else if (input6 == "rub" || inventory[0] == "Purple Fruit") "rub"コマンドを使用するには、ユーザーの最初のインベントリスロットに「紫色の果物」を入れる必要がある場合は、else if (input6 == "rub" && inventory[0] == "Purple Fruit")にする必要があります。ユーザーが "Purple Fruit"も持っていない場合、 "rub"コマンドを処理する別のケースを追加する必要があります。代わりに、あなたは名前で問い合わせることができインベントリ項目の順序なしコレクションを持つことができるようになる、std::setのように、クラスの「設定」のいくつかの種類を使用してに見て、また

else if (input6 == "rub") 
{ 
    if(inventory[0] == "Purple Fruit") 
    { 
     // user has item 
    } 
    else 
    { 
     // user does not have item 
    } 
} 

:このような何かを考えてみましょうアイテムが占有する在庫状況を心配する必要があります。

// assume inventory is std::set<std::string> and is already initalized and populated 
if(inventory.find("Purple Fruit") != inventory.end()) 
{ 
    // item is in the inventory 
} 
else 
{ 
    // item is not in the inventory 
} 
+0

!= inventory.end())の略ですか? – kevin

+0

説明するのはちょっと複雑ですが、標準のライブラリコードにはイテレータというものがあります。 'for(int i = 0; i <5; i ++)のような' for'ループに慣れているなら、イテレータは変数 'i'のようなものです。 'std :: set'には配列のような順序はありません。言い換えれば、' set'には "第2の項目"という概念はありません。セット内の各アイテムを「歩く」ために、 'for(std :: set :: iterator it = inventory.begin(); it!= inventory.end(); ++ itのようなイテレータを使用します) 'にアクセスし、ループの中で'(* it) 'を使って' std :: string'にアクセスすることができます。(下のパート2) – ozeanix

+0

'std :: set'を使用しているとき、セットに指定された値があるかどうかを判断するのは非常に高速で便利です。それが['std :: set :: find'](http://www.cplusplus.com/reference/set/set/find/)のことです。 'find'が返すものは反復子で、' .end() 'を返すと探していたものを見つけられませんでした。ここで' 'はあなたのセットを保持する変数です。それは上記のようにループ内で使用すると「それ以上のアイテム」を意味する特別なイテレータ値であり、「あなたが求めたものは見つけられませんでした。それは理にかなっていますか? – ozeanix

0

これは、あなたがそれがないと思う何をしません:input6を想定し

if (input6 == "keep") 

がある項目は、このようなあなたのインベントリにある場合は、テストすることができstd::set::findを使用して例えば

charの配列として定義され、指定された入力を保持するのに十分な大きさである場合、配列input6のアドレスを比較します(配列はほとんどのコンテキストで最初の要素へのポインタに減衰するため)。文字列定数のアドレスは"keep"です。これは常にfalseと評価されます。 、文字列の内容を比較strcmp機能を使用するには

:両方のオペランドが同じヌル終了文字列を含んでいる場合

if (strcmp(input6, "keep") == 0) 

この関数は0を返します。

関連する問題