1

ここで簡単なアプリを構築します。問題のメソッド:

静的コイン クラス

public static void SetUpCoins() {
        coin1 = new Coin(); 
        coin2 = new Coin();
    }

 public static void PlayConsole() {
        SetUpCoins();
        OutputWinner();            
    }


      public static void OutputWinner() {

        if (coin1.ToString() == "Heads" && coin2.ToString() == "Heads") {
            Console.WriteLine("You threw Heads - you win");
            ++point_player;
        } else if (coin1.ToString() == "Tails" && coin2.ToString() == "Tails") {
            Console.WriteLine("You threw Tails - I win");
            ++point_comp;
        } else {
           Console.WriteLine("You threw Odds");
           WaitForKey_ConsoleOnly("Press any key to throw again");
           PlayConsole();
        }

        Console.WriteLine("You have {0} points and the computer has {1} points", point_player, point_comp);

        if (WantToPlayAgain_ConsoleOnly()) { // ask user if they want to play again; return bool
            PlayConsole();
        }
      }

 private static bool WantToPlayAgain_ConsoleOnly() {
            string input;
            bool validInput = false;
            do {
                Console.Write("Play Again? (Y or N): ");
                input = Console.ReadLine().ToUpper();
                validInput = input == "Y" || input == "N";
            } while (!validInput);

            return input == ("Y"); 
        }

falseプログラムから戻る場合はWantToPlayAgain_ConsoleOnly()終了しません。私の問題を説明する出力の例を次に示します。

ここに画像の説明を入力

が false の場合、プログラムがメソッドにWantToPlayAgain_ConsoleOnly制御を渡さずに終了するのはなぜですか。playConsoleこの繰り返しの代わりに。

の実行が終了OutputWinnerすると、 にジャンプしPlayConsole、次に の else ステートメントに戻りますOutputWinner- 理由は不明です。

4

2 に答える 2

2

「Press any key to throw again」の後に PlayConsole() を呼び出しているためです。その呼び出しが返されると、呼び出し中に何が起こったかに関係なく、プログラムは無条件に「You have {0} points and the computer has {1} points」を続行します。

ロジックを再帰的ではなく反復的に書き直してみてください。

于 2012-05-04T06:30:48.523 に答える
0

前の回答が言ったように、オッズを投げるときに問題があります。その時点でまったく同じメソッドを再度呼び出し、その呼び出しが返されると、スコア表示から再開し、プレイヤーは再びプレイするように求められるためです。
再帰的に呼び出しているためPlayConsole、つまり、「Odd」をスローするたびに、要求していないプロンプトがもう 1 つ表示されます。

次のようにメソッドを再構築できます。

  public static void OutputWinner() {
    do {
        // Game code
    }
    while (WantToPlayAgain_ConsoleOnly());
  }

それはまた再帰を取り除きます。

于 2012-05-04T06:43:26.700 に答える