程序的流程不是预期的

时间:2012-05-04 05:51:52

标签: c#

在这里构建一个简单的应用程序;有问题的方法:

静态硬币类

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"); 
        }

如果falseWantToPlayAgain_ConsoleOnly()返回,则程序不会退出。这是输出的一个例子,它解释了我的问题:

enter image description here

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

OutputWinner运行完毕后,它会跳转到PlayConsole,然后返回OutputWinner的else语句 - 不知道原因。

2 个答案:

答案 0 :(得分:2)

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

尝试重写逻辑是迭代的而不是递归的吗?

答案 1 :(得分:0)

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

您可以像这样重构方法:

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

这也消除了递归。