【问题标题】:Guessing Game where user selects max value用户选择最大值的猜谜游戏
【发布时间】:2016-09-22 18:01:46
【问题描述】:

我在课堂上的任务是使用 c# 和 do/while、if/else 循环创建一个随机数生成猜谜游戏。这项任务似乎很容易;但是,我遇到了问题,因为我应该通过提示用户“输入要猜测的最大值”来开始游戏。 我无法让我的程序正常工作,因为每次运行它时,无论我输入什么值,它都会说“选择一个介于 1 和 0 之间的值”

我已附上我的 exe。

        Random generator = new Random();
        bool truth = true;
        int MaxRange = Convert.ToInt32(truth); ;
        int userguess = 0;
        int outputnumber = generator.Next(MaxRange);

        do
        {
            Console.WriteLine(" Enter a max number you want to guess from!", MaxRange);
            Console.ReadLine();

            Console.WriteLine("please make a guess between 1 and {0}", outputnumber);

            if (userguess != outputnumber)
            {
                userguess = Convert.ToInt32(Console.Read());

                if (userguess < outputnumber)
                {
                    Console.WriteLine("That is not correct, Guess again");
                    Console.ReadLine();
                }
                if(userguess > outputnumber)
                {
                    Console.WriteLine("That is not correct, Guess again");
                    Console.ReadLine();
                }
                else if (userguess == outputnumber)
                {
 console.writeline("That is correct, the number is {0}, outputnumber);
                }
            }
        } while (truth == false);
        }
    }
}

【问题讨论】:

  • 因为您在任何类型的 if 块中都没有该代码。它每次都会打印。
  • 也许我是盲人..但我看不到您将truth 设置为false 的任何地方。让我去拿我的另一副眼镜
  • 我没有看到您设置用户响应的最大数量。我不确定您如何将 bool 转换为 int 以获得最大范围。我建议在 maxrange 和用户进行的猜测上都使用 TryParse,以确保他们输入了一个 int。
  • 如何使用调试器并学习如何使用它?单步执行代码并检查变量通常比在 SO 上询问要容易很多
  • 除了其他人所说的之外,Console.ReadLine()(请参阅here)返回一个字符串,这是用户键入的内容。您实际上并不是每个人都试图从中获取价值,因此猜测和最大值永远不会被修改。您需要userguess = Convert.ToInt32(Console.ReadLine()) 之类的东西(并且还需要处理用户键入非整数的情况,但这是一个不同的主题)。一般来说,如果你使用 C#,MSDN 是你的朋友。

标签: c# linq oop random


【解决方案1】:

您的代码中有很多错误,但我将通过在它们旁边编写 cmets 来复习我看到的主要错误。

Random generator = new Random();
bool truth = true;

//extra semicolon on next line, 
//doesn't make sense to convert a boolean to get your initial max range,
//just give it an initial value, perhaps 0
int MaxRange = Convert.ToInt32(truth); ;
int userguess = 0;

//the generator can't get the correct outputnumber yet because MaxRange hasn't
//been set by the user's input yet
int outputnumber = generator.Next(MaxRange);

do
{
    //this won't get the user input because the parameters in WriteLine() 
    //that come after the string are for inserting into the string, not recieving input
    Console.WriteLine(" Enter a max number you want to guess from!", MaxRange);

    //need to set Console.ReadLine() to a variable for it to be saved
    //should be MaxRange = Console.ReadLine(); (though that will throw an error if the user inputs anything except numbers)
    Console.ReadLine();

    //outputnumber hasn't been set to a true generated number yet
    Console.WriteLine("please make a guess between 1 and {0}", outputnumber);

    //outputnumber could be renamed to be more clear, I would suggest randomNumber
    //userguess is still 0 during the first loop, need to get the user's guess before comparing to the random number
    //also, could simplify these if/else statements to just a couple of them
    //you're also going to need a while loop somewhere in here to continue having the user
    //guess until they get it right
    if (userguess != outputnumber)
    {
        //should use Console.ReadLine()
        userguess = Convert.ToInt32(Console.Read());

        if (userguess < outputnumber)
        {
            Console.WriteLine("That is not correct, Guess again");
            Console.ReadLine();
        }
        if(userguess > outputnumber)
        {
            Console.WriteLine("That is not correct, Guess again");
            Console.ReadLine();
        }
        else if (userguess == outputnumber)
        {
//not indented correctly, missing correct capitalization and missing the right quotes on the string to be wrote
console.writeline("That is correct, the number is {0}, outputnumber);
        }
    }
//should just be while (true);
} while (truth == false);
}

}

}

【讨论】:

    【解决方案2】:

    刚接触开发可能会让您不知所措,很明显您还没有完全考虑问题和解决方案。在开发新算法时,有时对您将使用的步骤进行注释然后开始开发会有所帮助。它们可以是模糊的指导或更详细的步骤,但您会发现这是一种有用的做法,尤其是在处理复杂问题时。

    这是一个您可以用来重写代码并重试的示例。我还建议使用 int.TryParse() 而不是 convert。

    // loop 1
    // get users expected max range
    //   if not int
    //      display message about invalid input
    //   if int
    //      break loop 1 to start guessing
    // end loop 1
    // generate random number for user to guess
    // loop 2
    // prompt user for their guess
    // parse input and verify int
    //   if not int
    //      display message about invalid input
    //      continue loop 2 skipping eval code to reprompt for input
    // evaluate their guess
    //   if matches
    //      show success message
    //      break loop 2
    //   else
    //      show failure message
    

    【讨论】:

      【解决方案3】:

      这有很多问题。

      您正在使用“真相”作为最大值生成一个数字,而不是在您接受用户输入后生成数字。

      你还需要在得到正确的数字后将true设置为false。

      您可能还希望他们对同一个数字进行多次猜测,因此您需要将最大范围的输入移动到“do”开头的上方

      花时间逐行​​阅读您的代码,并考虑如何在不同点设置变量等。

      【讨论】:

        【解决方案4】:

        谢谢大家!我做了一些小的调整,现在我几乎已经完美了。我仍然得到的唯一错误是成功运行它时,询问用户是否要再次播放。如果他们说是,游戏会让他们从之前选择的最大值开始游戏,而不是输入新的最大值。

        命名空间再试一次 { 课堂节目 {

            public static int SelectedNumber = 0;
            public static Random ran = new Random();
            public static bool GameOver = false;
            public static int UserMaxValue = 0;
        
        
        
            static void Main(string[] args)
        
            {
                int UserNumber;
                SelectedNumber = ran.Next(0, UserMaxValue);
        
                do
                {
        
        
                    Console.WriteLine("Enter a max number you want to guess from!");
                    UserMaxValue = Convert.ToInt32(Console.ReadLine());
        
                do
                    {
        
        
                        Console.WriteLine("Select a number between 1 and {0}!", UserMaxValue);
                        UserNumber = Convert.ToInt32(Console.ReadLine());
                        GuessNumber(UserNumber);
        
                } while (GameOver == false);
                } while (GameOver == false);
        
            }
        
        
        
        
            public static void GuessNumber(int UserNumber)
        
            {
        
                int playagain = 0;
        
                if (UserNumber < SelectedNumber)
                    Console.WriteLine("Your Number is Wrong! Please try Again!");
                else if (UserNumber > SelectedNumber)
                    Console.WriteLine("Your Number is Wrong! Please Try Again!");
                else
                {
        
                    Console.WriteLine("Yay! You got the right number! Press 1 to play again press 2 to quit");
                    playagain = Convert.ToInt32(Console.ReadLine());
        
                    while (playagain != 1 && playagain != 2)
        
                    {
                        Console.WriteLine("Please Only Select 1 to play again or 2 to quit!");
                        playagain = Convert.ToInt32(Console.ReadLine());
        
                    }
        
                    if (playagain.Equals(2))
                        GameOver = true;
        
                    else
                        SelectedNumber = ran.Next(0, UserMaxValue);
                }
            }
        }
        

        }

        【讨论】:

        • 经过进一步检查,似乎随机值通常为 0,这是不允许的。此外,当您再次播放时,您输入的最大值通常是您需要从中猜测的“随机数”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-15
        • 2020-11-22
        • 2014-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多