2016-08-16 21 views
2

バッチと式2の経験が少しあり、C#(1週間前に学習を始めました)が新しく、テキストベースのゲームに取り組んできました。もっと詳しく知る。私は最初にgoto文を使用しましたが、私が見つけたすべての人によると、goto文は死と絶望のいくつかのアマルガムなので、同じ効果を達成するために、よりクリーンで邪悪な方法を学びたいと思います。ここで私は私が何を意味するかを証明するために作られた安っぽくサンプルスクリプトは次のとおりです。goto文に代わるもの

using System; 

namespace TestScript 
{ 
class Program 
{ 
    public static void Main(string[] args) 
    { 
     string ConsoleReadinator; 
     string ConsoleReadinator2; 
     int Go = 0; 

    mainmenu: 
     do 
     { 
      Go = 0; 
      Console.Clear(); 
      Console.WriteLine("Main Menu:"); 
      Console.WriteLine("Store or something"); 
      ConsoleReadinator = Console.ReadLine().ToUpper(); 
      if (ConsoleReadinator == "STORE") { Go = 1; } 
     } while (Go == 0); 

     // In-game store example 

     { 
      Go = 0; 
      do 
      { 
       Console.Clear(); 
       Console.WriteLine("In-game store I guess"); 
       Console.WriteLine("Stuff you can buy, etc"); 
       ConsoleReadinator2 = Console.ReadLine().ToUpper(); 
       if (ConsoleReadinator2 == "GO") { Go = 1; } 
      } while (Go == 0); 
      goto mainmenu; 
     } 
    } 
    } 
} 

このスクリプトは機能的ですが、私は多分、メニューをナビゲートし、するために戻って、前の文に移動するための方法として、gotoを使用しないようしたいのですがターンベースのゲームのアルゴリズムを繰り返す。私はAlternative to using goto statement in C#(これは基本的に私が持っているのと同じ質問ですが、もっと曖昧ですが)のメソッドを使っていますが、そこで作られたGregの例は、おそらく試してみる価値がないその特定の例が機能するようにする。

+1

私はこの質問のためのより適切なサイトがサイトであると思うhttp://codereview.stackexchange.com/ – BWA

+1

ええ、gotoステートメントを使用しないでください、 – Liam

+0

@Liam投稿の全ポイントは使用しないこれまでどおりに文章を書く。 –

答えて

0

あなたがに再帰を使用することができます限り、私はあなたが無限ループを望む見ることができるように

-1

一般に、メソッドやラムダ式を使用します。したがって、メインメニューは、コードの最後にもう一度呼び出すメソッドになります。

... 
    while (true) 
    { 
     do 
     { 
     ... 
     } while (Go == 0); 

     Go = 0; 

     do 
     { 
     ... 
     } while (Go == 0); 
    } 
3

戻り、コードをもう一度実行してください。この目的のためには、別のメソッドにコードを移動することができ、それが必要なときはいつでも、それの内側からそれを呼び出す:

class Program 
{ 
    public static void Main(string[] args) 
    { 
     string ConsoleReadinator; 
     string ConsoleReadinator2; 
     Method(0); 
    } 

    private static void Method(int Go) 
    {  
     do 
     { 
      .. 
     } while (Go == 0); 

     // In-game store example 

     do 
     { 
      ... 
     } while (Go == 0); 
     Method(Go); 
    } 
} 

それとも、より適切な方法でループを使用することができます。ノーあり、

public static int EnterNumber() 
    { 
     Console.Clear(); 
     Console.Write("Please enter some integer number: "); 

     // if number is successfully parsed return number else run method again 
     return int.TryParse(Console.ReadLine(), out num)? 
        num : EnterNumber(); 
    } 

    public static void Main(string[] args) 
    { 
     int num = EnterNumber(); 
    } 

我々はメソッドを使用することができます場合はループと再帰:

public static void Main(string[] args) 
    { 
     int num; 

     // This loop ends only when user enters proper integer number 
     do 
     { 
      Console.Clear(); 
      Console.Write("Please enter some integer number: "); 
     } while(!int.TryParse(Console.ReadLine(), out num));      
    } 

これは再帰で、他の方法で行うことができます。私たちは、整数番号を入力するようにユーザーをしたいときの例を見てみましょうもはやGO TOを使用するための現実的な必要性。

+0

私は数分前にこれがうまくいっているとコメントしましたが、この例ではそうしましたが、複数の選択肢があると言いました。店だけではありません。このような無限ループを使用すると、ループをたくさん使用していない限り、すべてのメニューを循環させる必要があると思います。 –

+0

@Rowan Tarshis:もう一つのメニュー項目を追加しないでください。なぜなら、 'break;(上の無限ループを残す)または' return; '(' Main'関数とプログラムを残すために) )? –

+0

あなたは何を意味するのか分かりません。 「別のメニュー項目」とは、店舗などの別のメニューを意味しますか?さらに、「Exit」を呼び出すだけで、(「無限ループを上にする」)、「2番目の無限ループに壊れることを意味するのですか、それとも私はそれを誤解していますか? –

0

1つの提案は、このように構成するスイッチケースを使用することです:

static void Main(string[] args) 
{ 
    string ConsoleReadinator; 
    string MENU_TEXT = "Main Menu:"; 
    string ADDITIONAL_INFO = "Store or something"; 

    bool endProg = false; 


    ConsoleReadinator = printMenu(MENU_TEXT, ADDITIONAL_INFO); 

    // as long "EXIT" is not typed 
    while (!endProg) 
    { 

     switch (ConsoleReadinator) 
     { 
      case "STORE": 
       // Do your Store Stuff 
       // maybe change MENU_TEXT and ADDITIONAL_INFO 
       // and print a new Menu 
       ConsoleReadinator = printMenu(MENU_TEXT, ADDITIONAL_INFO); 
       break; 
      case "GO": 
       // Do your Go Stuff 
       break; 
      case "EXIT": 
       endProg = true; // set exit condition to true 
       break; 

      default:       
       break; 
     } 
    } 

    Console.ReadKey(); 
} 

// one Method to use for Menu display 
public static string printMenu(string menuText, string additionalInfo) 
{ 
    Console.Clear(); 
    Console.WriteLine(menuText); 
    Console.WriteLine(additionalInfo); 

    return Console.ReadLine().ToUpper(); 

}