我有一个基本的do while循环,一旦变为false就不会退出。我已经完成了调试,事实上它确实被返回为假。然而循环继续运行。
其次,在我最后一个if / else语句的最后,我知道selectnumber应该返回一个新的随机数并开始游戏。但它只是从最初运行的程序返回相同的数字。我在那里做错了什么?
主要课程:
class HighLowApp
{
static void Main(string[] args)
{
Admin startup = new Admin();
startup.ConsoleSetup();
startup.Instructions();
Control startGame = new Control();
startGame.LetsPlay();
}
}
namespace mellon_HighLow
{
class Control
{
public static int selectedNumber = 0;
public static Random num = new Random();
public static bool playAgain = true;
public Control()
{ }
public void LetsPlay()
{
//variables
int userGuess;
selectedNumber = num.Next(1, 501);
do
{
Console.WriteLine("Guess a number between 1 and 500.");
userGuess = Convert.ToInt32(Console.ReadLine());
UI output = new UI();
output.CompareNumbers(userGuess, selectedNumber, playAgain);
} while (playAgain == true);
}
}
}
NEXT CLASS ::
class UI
{
public static Random num = new Random();
public static int keepGoing;
public static int numGuesses;
public UI()
{ }
public void CompareNumbers(int userGuess, int selectedNumber, bool playAgain)
{
Console.WriteLine(selectedNumber);
if (userGuess > selectedNumber)
{
Console.Beep(600, 300);
Console.WriteLine("\nToo High! Guess Again!");
numGuesses++;
}
else if (userGuess < selectedNumber)
{
Console.Beep(300, 300);
Console.WriteLine("\nToo Low! Guess Again!");
numGuesses++;
}
else
{
Console.Beep(350, 300);
Console.Beep(380, 200);
Console.Beep(380, 100);
Console.Beep(500, 1100);
numGuesses++;
Console.WriteLine("\n\nCongrats! It took you " + numGuesses + " guesses to win.");
numGuesses = 0;
Console.WriteLine("Press 1 to play again or 2 to quit.");
keepGoing = int.Parse(Console.ReadLine());
while (keepGoing != 1 && keepGoing != 2)
{
Console.WriteLine("\n\nPlease type either 1 or 2 only!");
keepGoing = int.Parse(Console.ReadLine());
}
if (keepGoing == 2)
playAgain = false;
else
{
Console.Clear();
selectedNumber = num.Next(1, 5001);
}
}
}
}
}
答案 0 :(得分:2)
如果方法参数不是bool
,则无法更改ref
等值类型参数。
所以你可以使用它(在bool和int参数之前注意ref
):
public void CompareNumbers(int userGuess, ref int selectedNumber, ref bool playAgain)
{...}
...
output.CompareNumbers(userGuess, ref selectedNumber, ref playAgain);
但是当你想要停止时,方法更容易就是return false
。
if (keepGoing == 2)
return false;
else
{
Console.Clear();
selectedNumber = num.Next(1, 5001);
}
当然,您必须将void
更改为bool
。
答案 1 :(得分:0)
你的问题在于playAgain布尔变量。在C#中,布尔值是按值传递的。 CompareNumbers方法中名为playAgain的参数变量具有局部范围,因此当您更改它时,这不会影响主类中名为playAgain的变量(恰好具有相同的名称)。
您可以选择方法:
使CompareNumbers返回一个布尔值,并使用playAgain时使用它。
OR:
在方法参数中使用ref关键字,如下所示:
public void CompareNumbers(int userGuess, int selectedNumber, ref bool playAgain)
在这种情况下,您的代码将按照您的预期运行。
就随机数而言。您正在代码的每个循环中创建一个新的Random对象。这使用相同的种子并生成相同的数字。你应该避免重新创建对象,但每次想要一个新的数字时都要调用.Next。
答案 2 :(得分:0)
您正在调用CompareNumbers方法并传递参数selectedNumber,playAgain。由于这些参数不是通过引用传递的,因此这些参数只在CompareNumbers方法中更改,而不是在调用方法中更改。
重要的是要理解传递的变量是与调用方法中的变量不同的变量!
你可以尝试这样的事情,但请注意,在我看来,这不是一个好的代码风格:
public void CompareNumbers(int userGuess, ref int selectedNumber, ref bool playAgain)
您应该重新考虑使用Method CompareNumbers的原因!