2016-12-10 3 views
1

私はちょうどC#で始まりました。私はここで少しのプログラムを作っています。私はちょうどgotoが私のコードの特定のセクションに戻る正しい方法であるのか、それがより適切で実践的な方法であるのか疑問に思っています。初級C#実践例

namespace Section5Tests 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Start: 
      var number = new Random().Next(1, 10); 
      int secret = number; 

      Console.WriteLine("Secret Number is between 1 and 10. "); 
      for (var i = 0; i < 10; i++) 
      { 
       Console.WriteLine("Guess the secret number you only have 3    attempts!"); 
       Middle: 
       var guess = Convert.ToInt32(Console.ReadLine()); 

       if (guess == secret) 
       { 
        Console.WriteLine("WoW! You got it! Well done!"); 
        goto Playagain; 
       } 
       else 
       { 
        Console.WriteLine("Incorrect! Try again"); 
        goto Middle; 
       } 

      } 
      Console.WriteLine("Sorry you lost =("); 
      Playagain: 
      Console.WriteLine("Try Again? Y/N"); 
      var answer = Console.ReadLine(); 

      if (answer.ToLower() == "y") 
      { 
       goto Start; 
      } 
      else 
      { 
       Console.WriteLine("Thankyou for playing =)"); 
      } 
     } 
    } 
} 
+0

尋ねる必要がある場合は、GOTOの準備ができていません。それを使用しないでください。代わりにループ、条件、関数を使用してください。 –

+1

私は1980年代半ばからコードを書いてきましたが、(アセンブリコードの外で)1つのgotoを書かなかったのです。ほとんどの場合、常に良い方法があります。 –

+0

よく私のためにそれらのより良い方法でいくつかの光を出す気がします –

答えて

1

あなたはGOTOの準備ができていません。それを使用しないでください。代わりにループと関数を使用します。あなたはgoto Start;声明近くダウンしているループをクローズアップする必要があります。もちろん、

string answer = "y"; 
while (answer = "y") 
{ 

が、これは私が停止されますコースのようになります。

Start:するのではなく、作業を開始するには、これを使用しますここに。これはあなたに行く必要があります。

+0

ありがとうございました –

2

C#では、このようなことを行うより良い方法は、プログラムを一意でわかりやすい名前を持つ個々のメソッドにリファクタリングすることです。これは、99.9%の症例でgotoを使用するよりもはるかに良い解決策です。

あなたのコードはすべて、通常、mainという1つの方法になることは望ましくありません。代わりに、ゲームそのものを独自の方法でリファクタリングします。次に、メインループでは、ユーザーが再生しているかどうかだけを確認できます。

static void Main (string[] args) 
{ 
    var isPlaying = true; 
    while (isPlaying) 
    { 
     isPlaying = PlayGame(); 
    } 

    Console.WriteLine("Thankyou for playing =)"); 
} 

そのように、あなたはPlayGame方法は、ユーザーがまだ再生されているかどうかを指定するブール値を返すことができます。代わりにgotoを使用して、あなたはチェック変数とスマートなコーディングを使用して、プログラムの流れを制御することができます。

static bool PlayGame() 
{ 
    int number = new Random().Next(1, 10); 
    var userWon = false; 

    Console.WriteLine("Secret Number is between 1 and 10. "); 
    for (var numOfAttempts = 10; numOfAttempts > 0; numOfAttempts--) 
    { 
     Console.WriteLine($"Guess the secret number you only have {numOfAttempts} attempts!"); 

     var guess = Convert.ToInt32(Console.ReadLine()); 
     if (guess == number) 
     { 
      userWon = true; 
      break; 
     } 

     Console.WriteLine("Incorrect! Try again"); 
    } 

    if (userWon) 
     Console.WriteLine("WoW! You got it! Well done!"); 
    else 
     Console.WriteLine("Sorry you lost =("); 

    Console.WriteLine("Try Again? Y/N"); 
    var answer = Console.ReadLine(); 

    return answer.ToLower() == "y"; 
} 
0

後藤は、特定のセクションに私のコードの

を返す の有効な方法である場合には不思議

いいえ、それはと決してです。

深く入れ子になったループのうちを先に飛び越すだけで、breakが十分に進まない場合は、が有効です。 (そしてそれでも多くの人がぶつかる...)

他のすべての使い方は、コードを読み、デバッグするのが難しいです。

代わりに、という意味のある条件を書きます。あなたのループに!そして、あなたの目標を破壊

は仕事の小型でシンプルなチャンクにトップダウン方法 .. 、あなたが達成したいものをに集中しないようにしよう程度「プログラムの流れ」を考えることさえ近づく防ぐことができますとなり、代わりに「解決の問題」について考えてみましょう。