虽然循环不会退出一次False,并且随机数生成器每次输出相同的数字

时间:2017-11-07 16:15:56

标签: c# do-while

我有一个基本的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);
                            }

                }

        }



}

}

3 个答案:

答案 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的原因!