在这里构建一个简单的应用程序;有问题的方法:
静态硬币类
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
为false时,程序不通过控制playConsole
方法然后退出。而不是这种重复。
OutputWinner
运行完毕后,它会跳转到PlayConsole
,然后返回OutputWinner
的else语句 - 不知道原因。
答案 0 :(得分:2)
因为您在“按任意键再次投掷”后调用PlayConsole()。一旦该呼叫返回,程序将无条件地继续“你有{0}分,计算机有{1}分”,无论通话期间发生了什么。
尝试重写逻辑是迭代的而不是递归的吗?
答案 1 :(得分:0)
正如之前的答案所说,当你投掷赔率时你会遇到问题。
因为此时您再次调用完全相同的方法,当该调用返回时,您将在分数显示处继续,并再次要求玩家进行游戏。
因为你以递归方式调用PlayConsole
,这意味着每次抛出“奇数”,你都会得到一个你没有要求的提示。
您可以像这样重构方法:
public static void OutputWinner() {
do {
// Game code
}
while (WantToPlayAgain_ConsoleOnly());
}
这也消除了递归。