Игра в угадывание чисел с использованием TryParse - PullRequest
1 голос
/ 09 октября 2019

У меня проблемы с тем, чтобы заставить мой код работать, когда я использую TryParse, чтобы определить, нужно ли пользователю вводить строку вместо int. Если я использую его так, как он выглядит сейчас, я получу базовое значение 0, только если введено что-то отличное от int. Я хочу, чтобы он показывал пользователю сообщение об ошибке.

Попытался возиться с рядом различных способов использования TryParse, но ни один из них действительно не помог.

    static void Main(string[] args)
    {

        Random r = new Random();
        int speltal = r.Next(1,21);
        bool play = false;
        int myNum;

        while (!play)
        {
            Console.Write("\n\tGuess a number between 1 and 20: ");
            Int32.TryParse(Console.ReadLine(), out myNum);

            if (myNum < guessNum)
            {
                Console.WriteLine("\tThe number you have guessed is to low");
                Console.ReadLine();
            }

            if (myNum > guessNum)
            {
                Console.WriteLine("\tThe number you have guessed is to high");
                Console.ReadLine();
            }

            if (myNum == guessNum)
            {
                Console.WriteLine("\tCongratulations you guessed the right number!");
                Console.ReadLine();
            }

Iхотите, чтобы он показывал пользователю сообщение об ошибке, если он вставил что-то кроме int. Он также должен включать TryParse в соответствии с моим Teatcher

Ответы [ 4 ]

4 голосов
/ 09 октября 2019

Вы не захватываете вывод bool для TryParse, поэтому вы не знаете, было ли введено нечисловое значение. Попробуйте что-то вроде этого:

bool isValid;
do
{
     Console.Write("\n\tGuess a number between 1 and 20: ");
     isValid = Int32.TryParse(Console.ReadLine(), out myNum);
     if(!isValid)
     {
         Console.WriteLine("\n\tInvalid input detected. Please try again.");
     }
} while(!isValid)
1 голос
/ 09 октября 2019

Метод TryParse может помещать только целые числа в переданную переменную (как это имеет тип int), поэтому, если переданное ему значение не может быть проанализировано в целое число, значение по умолчанию int(0) будет присвоено переменной.

Способ TryParse сообщить вам, успешно ли он проанализировал число, - вернуть логический индикатор.

Вы можете попробовать это:

while (true)
{
    bool valid = int.TryParse(Console.ReadLine(), out myNum);
    if(valid)
        break;
    Console.WriteLine("Input invalid. Please try again");
}
0 голосов
/ 09 октября 2019

TryParse возвращает логическое значение, которое указывает, была ли входная строка успешно проанализирована или нет. Оба ответа выше верны о том, как обрабатывать недопустимые данные, но вот более чистая версия, которая также поддержит правило , between 1 and 20:

while (true)
{    
    Console.Write("\n\tGuess a number between 1 and 20: ");

    //Checks to see if the input was successfully parsed to a integer also, performs a Trim on the input as to remove any accidental white spaces that a user might have typed in, e.g. "1000 "
    if (int.TryParse(Console.ReadLine().Trim(), out myNum))
    {
        //Checks to see if the parsed number is in the specified range
        if ((myNum > 0) && (myNum < 21))
        {
            break;
        }
        Console.WriteLine("\tThe input number was out of the specified range.");
    }
    else
    {
        Console.WriteLine("\tFailed to parse the input text.");
    }
    //Optional, makes the thread sleep so the user has the time to read the error message.
    Thread.Sleep(1500);

    //Optional, clears the console as to not create duplicates of the error message and the value of Console.Write
    Console.Clear();
}

// Continue here, if (myNum < guessNum) . . .
0 голосов
/ 09 октября 2019

Вы должны использовать bool, возвращаемое TryParse. Что-то похожее на это:

Обновленный ответ:

        static void Main(string[] args)
        {
            Random random = new Random();
            int guessNum = random.Next(1, 21);

            while(true)
            {
                Console.WriteLine("Guess the number between 1 and 21.");

                if (Int32.TryParse(Console.ReadLine(), out int input))
                {
                    if (input == guessNum)
                    {
                        Console.WriteLine($"You guessed it right. The number is {input}");
                        if(ShouldContinue())
                        {
                            guessNum = random.Next();
                            continue;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (input < guessNum)
                        Console.WriteLine("The number you guessed is smaller.");
                    else
                        Console.WriteLine("The number you guessed is bigger");

                }
                else
                {
                    Console.WriteLine("Please enter a number between 1 and 21 as your guess");
                }
            }
        }

        static bool ShouldContinue()
        {
            while (true)
            {
                Console.WriteLine($"Do you want to continue playing? (y/n)");
                string continueInput = Console.ReadLine().Trim().ToLower();
                if (continueInput == "y")
                    return true;
                else if (continueInput == "n")
                    return false;
                else
                    Console.WriteLine("Invalid input!. Please choose 'y' or 'n'.");
            }
        }

Старый ответ:

while (true)
{
    if (Int32.TryParse(inputInt, out int myNum))
    {
       // your logic goes here, too low/high or correct answer.   
    }
}
...