2016-07-21 4 views
1

私はプログラミングが初めてで、gotoをコード内に使用しない方法があるかどうかを知りたいと思います。goto'sを取り除くには?

using System; 

namespace project1 

{ 
    class MainClass 
{ 
    public static void Main() 
    { 
     start: 

     Console.Clear(); 

     Console.ForegroundColor = ConsoleColor.Green; 

     int rannum; 
     int input; 

     Random r = new Random(); 
     rannum = r.Next (1, 1001); 

     Console.WriteLine ("Guess the number!"); 

     game: 
     input = Convert.ToInt32 (Console.ReadLine()); 

     if (input == rannum) 
     { 
      Console.WriteLine ("Congrats!"); 
      Console.WriteLine ("Press any key to go again..."); 
      Console.ReadKey(true); 
      goto start; 
     } 
     else if (input <= rannum) 
     { 
      Console.WriteLine ("Guess higher!"); 
      goto game; 
     } 
     else if (input >= rannum) 
     { Console.WriteLine ("Guess lower!"); 
      goto game; 
     } 
    } 
} 

私はgoto sが悪いことを知っている(明らかに)ので、私は彼らなしでこれをどのように行うのですか?

+6

まあ、whileループは良いスタートになるでしょう...コードの少なくともいくつかを別の方法に抽出することを検討することもできます。 (ヒント "1つのゲームをプレイする"というのは私にとって妥当な方法のように聞こえる) –

+0

終了条件は何ですか?いつゲームが終了するのですか? –

+0

ありがとう、私はwhileループに関するいくつかのチュートリアルを調べます。 終了条件については、私はちょうど学んでいる、これは実際のゲームではないことを私ができることのプレビューです。デバッグビルドのような並べ替え。 – user6567601

答えて

3

私はこの回答を形成している間にコメントしましたが、明らかに偉大な心は似ています。あなたが同様の方法でgoto gameを取り除くことができ、今

public static void Main() 
{ 
    Random r = new Random(); 
    string again; 
    do { 
     PlayOneGame(r.Next(1, 1001)); 
     Console.WriteLine("Play again?"); 
     again = Console.ReadLine(); 
    } while (!again.ToLower().StartsWith('n')); 
} 

public static void PlayOneGame(int rannum) 
{ 
    Console.Clear(); 

    Console.ForegroundColor = ConsoleColor.Green; 

    int input; 



    Console.WriteLine ("Guess the number!"); 

    game: 
    input = Convert.ToInt32 (Console.ReadLine()); 

    if (input == rannum) 
    { 
     Console.WriteLine ("Congrats!"); 
     return; // goes back to the caller, Main, but without using goto 
    } 
    else if (input <= rannum) 
    { 
     Console.WriteLine ("Guess higher!"); 
     goto game; 
    } 
    else if (input >= rannum) 
    { Console.WriteLine ("Guess lower!"); 
     goto game; 
    } 
} 

とにかくは、ここにあなたがgoto startを排除することができる方法ですか?私も物事を配置しました

注意が一つだけRandomオブジェクトを作成して再生されますどのように多くのゲームに関係なく、それを使用しないように続ける - それは新しいのRNGを作成しておくことは良い考えではありません、開始状態はひどくランダムではありません。

0

私はちょうどこのようなことをして、それが動作している、私はまだ何か間違っている?

public static void Main() 
    { 
     PlayGame(); 

     Console.WriteLine ("Press 'n' key to exit the application, press any other key to play again."); 
     string again = Convert.ToString(Console.ReadKey()); 
     if (again == "n") { 
      Environment.Exit (0); 
     } 

     PlayGame(); 
    } 

    public static void PlayGame() 
    { 
     Console.Clear(); 

     Console.ForegroundColor = ConsoleColor.Cyan; 

     int randomNumber; 
     int userInput; 
     int gameover = 0; 

     Random number = new Random(); 
     randomNumber = number.Next (1, 1001); 

     Console.WriteLine ("Guess the number!"); 

     while (gameover != 1) 
     { 
      userInput = Convert.ToInt32(Console.ReadLine()); 

      if (userInput == randomNumber) { 
       Console.Clear(); 
       Console.WriteLine ("Congrats!"); 
       return; 
      } else if (userInput <= randomNumber) { 
       Console.Clear(); 
       Console.WriteLine ("Guess Higher!"); 
      } else if (userInput >= randomNumber) { 
       Console.Clear(); 
       Console.WriteLine ("Guess Lower!"); 
      } 
     } 
    } 
+0

あなたはオリジナルの投稿への回答として質問を続ける必要はありません。 。このコードはオリジナルの投稿よりもはるかに優れています。ほとんどの場合、gotoコマンドは含まれていません;-) – jonaglon

+0

'Main()'にループがないので、ゲームは2回あなたが再びプレイするように頼むことはありません)。必要な乱数ごとに新しいRNGを作成していますが、これはお勧めできません。私の答えの一部が理解できなかったのですか?最後に、 'gameover!= 1'状態からではなく' return'ステートメントからループが抜け出るので、あなたの変数 'gameover'は役に立たない。 –

関連する問題