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()程序返回不退出。这是输出示例,它解释了我的问题:

在此处输入图像描述

为什么,当WantToPlayAgain_ConsoleOnly为假时,程序不通过控制playConsole方法然后退出。而不是这种重复。

运行完成OutputWinner后,它会跳转到PlayConsole,然后返回到OutputWinner- 不知道为什么的 else 语句。

4

2 回答 2

2

因为您在“按任意键再次抛出”之后调用 PlayConsole()。一旦该调用返回,该程序将无条件地继续“您有 {0} 分,而计算机有 {1} 分”,无论通话期间发生了什么。

尝试将逻辑重写为迭代而不是递归?

于 2012-05-04T06:30:48.523 回答
0

正如前面的答案所说,你在投掷赔率时会遇到问题。因为此时您再次调用完全相同的方法,当该调用返回时,您会在分数显示处继续,并再次要求玩家玩。
因为你是PlayConsole递归调用,这意味着每次你抛出“奇数”时,你都会得到一个你没有要求的提示。

您可以像这样重组方法:

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

这也摆脱了递归。

于 2012-05-04T06:43:26.700 回答