2016-11-21 11 views
-1

私は間違ったコマンドを入力すると "command"関数にループバックする非常に簡単なプログラムを考えました。 テキストベースのRPGゲームの開発を続け、これをベースとして使用する前に、私が以下で行ったようにメインループを大部分のループとして含めることは悪い考えか、 "goto"オプションを使わずに文字列の比較をチェックするために、関数を呼び出してメインの先頭に戻すより簡単な方法はありますか?ご期待いただきありがとうございます!コマンドC++へのループバック

std::string command() 
{ 
    std::string input; 
    std::cout << "$home: "; 
    std::cin >> input; 
    return input; 
} 

int main() 
{ 
    while (true) 
    { 
     if (!command().compare("help")) 
     { 
      std::cout << "Command HELP exists!\n"; 
     } 
     else 
     { 
      std::cout << "You have entered an unrecognized command.\n"; 
     } 
     continue; 
    } 
} 
+0

あなたエルスIfが入力されていない場合はすぐに別のループを実行するので、必要ありません。 –

+0

私は少し明確にするためにコードを変更しました。それは最初のものが実行された後にプレーヤーが次のコマンドを入力すると常に最初にループバックします。コマンドが存在するかどうかを示すその他の情報が必要です。これは悪い習慣ですか?通常は「true」を使用しないでください。この場合は問題なく動作します。 –

+0

それは本当に議論ができる、人々に依存しています。あなたのプログラムが無限に動くと本当に言いたいのであれば容認できます。終了条件が必要と思われる場合は、exitコマンドのように変更する必要があります。 –

答えて

0

明らかにあなたの例は非常に単純化され(例えば、あなたが「終了」コマンドのいくつかの種類を提供する必要がある)、それが示しパターンは完全に罰金です。このようなループは、ゲーム開発者が通常「ゲームループ」と呼ぶものの本質であり、GUIプログラマは「イベントループ」と呼んでいます。明示的にその作業を行うのとは対照的に停止してから自動的に終了するまで、実行し続ける必要のあるすべてのプログラムの基本パターンです。

プログラムが大きくなると、メインループの前にスタートアップコードがあり、後でティアダウンコードが表示され、ループ自体がおそらくmain()から別のファイルに移動します。 GUIメインループを示すQtフレームワークを使ったベアボーンの例です。

#include <QApplication> 
#include <MainWindow.hpp> 

int main() 
{ 
    QApplication app; 
    MainWindow win; 
    win.show(); 
    return app.exec(); // <-- main loop happens here 
} 

Offtopic:

if (!command().compare("help")) 

ラインについて...これら本当にバグ私のような行。 ;)そのように書いてはいけません!直感的に - とくにコードをすばやくスキャンするときに - が "help"でない場合、 "Command HELP exists!";自然な反応は:WTF !?必ずあなたは何が起こっているか、それを明確にすることに対して比較している値を綴る:

if (command().compare("help") == 0) // ... 

またはイベント良く、この場合にはあなたが必要なすべての情報が等しいかではないので:

if (command() == "help") // ... 
+0

Offtopicの部分を削除します。それは完全に意見に基づいています。彼がそれを書いた方法は完全に受け入れられ、読みやすい。 –

関連する問題