Как игнорировать строку / блок кода, если условие выполнено? - PullRequest
1 голос
/ 05 мая 2020

Есть ли способ игнорировать строку / блок кода, если условие выполнено? Я делаю учебник C#. NET, и приложение представляет собой игру по угадыванию чисел.

Я добавил опцию подсказки, если пользователь вводит неправильный номер (иначе, если часть):

// While guess is not correct
            while (guess != correctNumber)
            {
                //Get users input
                string input = Console.ReadLine();

                // Make sure it's a number
                if (!int.TryParse(input, out guess))
                {
                    // Print error message
                    PrintColorMessage(ConsoleColor.Red, "Please use an actual number");

                    // Keep going
                    continue;
                }

                // Cast to int and put in guess
                guess = Int32.Parse(input);

                // Check if guess is close to correct number
                if(guess == correctNumber + 2 || guess == correctNumber - 2)
                {
                    // Tell the user that he is close
                    PrintColorMessage(ConsoleColor.DarkCyan, "You are close!!");

                }
                // Match guess to correct number
                else if (guess != correctNumber)
                {
                    // Print error message
                    PrintColorMessage(ConsoleColor.Red, "Wrong number, please try again");

                    AskForAHint(correctNumber);
                }
            }

            // Print success message 
            PrintColorMessage(ConsoleColor.Yellow, "You are CORRECT!");

Обычно я спрашиваю пользователя, хочет ли он подсказки, и если он напишет Y, подсказка будет отображаться. Однако есть ли возможность отображать этот вопрос только один раз , поскольку этот оператор if включен в while l oop? Было бы неприятно, если бы «Хочешь намек?» вопрос продолжает отображаться, даже если пользователь говорит Y.

Моя функция AskForAHint:

static void AskForAHint(int num)
    {
        // Ask user if he wants a hint
        Console.WriteLine("Do you want a hint? [Y/N]");

        // Take his answer
        string ans = Console.ReadLine().ToUpper();

        // If the user wants a hint
        if (ans == "Y")
        {
            // First hint number
            int beginning = (num - num % 10);
            // Second hint number
            int finish = beginning + 10;
            // Give user a hint
            Console.WriteLine("The correct number is somewhere betweer {0} and {1}", beginning, finish);
        }
        else if (ans == "N")
        {
            return;
        }
    }

Спасибо

Ответы [ 3 ]

2 голосов
/ 05 мая 2020

Я думаю, вы можете сделать «если» с помощью счетчика. Попробуйте

        Int cont = 0; //global
        // While guess is not correct
        while (guess != correctNumber)
        {
            //Get users input
            string input = Console.ReadLine();

            // Make sure it's a number
            if (!int.TryParse(input, out guess))
            {
                // Print error message
                PrintColorMessage(ConsoleColor.Red, "Please use an actual number");

                // Keep going
                continue;
            }

            // Cast to int and put in guess
            guess = Int32.Parse(input);

            // Check if guess is close to correct number
            if(guess == correctNumber + 2 || guess == correctNumber - 2)
            {
                // Tell the user that he is close
                PrintColorMessage(ConsoleColor.DarkCyan, "You are close!!");

            }
            // Match guess to correct number
            else if (guess != correctNumber)
            {
                // Print error message
                PrintColorMessage(ConsoleColor.Red, "Wrong number, please try again");
              if(cont == 0){
                AskForAHint(correctNumber);
              }
            }
        }

        // Print success message 
        PrintColorMessage(ConsoleColor.Yellow, "You are CORRECT!");

И в функции добавьте

static void AskForAHint(int num)
{
    // Ask user if he wants a hint
    Console.WriteLine("Do you want a hint? [Y/N]");

    // Take his answer
    string ans = Console.ReadLine().ToUpper();

    // If the user wants a hint
    if (ans == "Y")
    {
        cont = 1;
        // First hint number
        int beginning = (num - num % 10);
        // Second hint number
        int finish = beginning + 10;
        // Give user a hint
        Console.WriteLine("The correct number is somewhere betweer {0} and {1}", beginning, finish);
    }
    else if (ans == "N")
    {
        return;
    }
}
2 голосов
/ 05 мая 2020

Другой способ сделать это - сделать количество подсказок настраиваемым (позволяя вызывающему абоненту указать, сколько подсказок он хочет разрешить пользователю запрашивать), а затем отслеживать количество подсказок, заданных в самом методе .

Это потребует небольшого изменения метода AskForAHint, однако, поскольку мы не знаем, ответил ли пользователь «Y» или «N» на вопрос-подсказку. Поскольку AskForHint не имеет возвращаемого значения, мы могли бы вернуть bool, указывающее, как пользователь ответил на вопрос:

static bool AskForAHint(int num)
{
    var answer = GetUserInput("Do you want a hint? [Y/N]: ", ConsoleColor.Yellow);

    if (!answer.StartsWith("Y", StringComparison.OrdinalIgnoreCase))
    {
        return false;
    }

    var beginning = num - num % 10;
    var finish = beginning + 10;
    Console.WriteLine($"The correct number is somewhere between {beginning} and {finish}");

    return true;
}

Теперь мы можем отслеживать, сколько подсказок получил пользователь. путем увеличения счетчика в нашем методе «Игра»:

// Only ask for a hint if they have any hints (and guesses) remaining
if (hintCount < maxHints && guessCount < maxGuesses)
{
    // If they asked for a hint, increase the hint count
    if (AskForAHint(correctNumber)) hintCount++;
    // If they didn't want a hint, max out hint count so we don't ask again
    else hintCount = maxHints; 
}

Чтобы проверить пример кода выше, я использовал этот метод ниже, который также позволяет нам настроить, сколько всего предположений имеет пользователь , какими должны быть минимальные и максимальные значения диапазона, и нужно ли им давать "подсказку направления", например "слишком высоко!" или «слишком мало!»:

private static readonly Random Random = new Random();

private static void PlayGuessingGame(int maxHints = 1, int maxGuesses = 10, 
    int rangeMin = 1, int rangeMax = 100, bool giveDirectionalHint = true)
{
    if (rangeMax < rangeMin) rangeMax = rangeMin;
    var correctNumber = Random.Next(rangeMin, rangeMax + 1);
    var guessCount = 0;
    var hintCount = 0;

    WriteMessage("Welcome to the guessing game!", ConsoleColor.White);
    WriteMessage("-----------------------------\n", ConsoleColor.White);
    WriteMessage($"I'm thinking of a number from {rangeMin} to {rangeMax}. ", ConsoleColor.Green);
    WriteMessage("Let's see how many guesses it takes you to guess it!\n", ConsoleColor.Green);

    do
    {
        WriteMessage($"(You have {maxGuesses - guessCount} guesses left)");
        var input = GetUserInput("Enter the number I'm thinking of: ", ConsoleColor.White);

        int guess;

        if (!int.TryParse(input, out guess))
        {
            WriteMessage("Please enter a whole number", ConsoleColor.Red);
            continue;
        }

        // Only increment guesses if they entered an actual number
        guessCount++;

        if (guess == correctNumber) break;

        if (Math.Abs(guess - correctNumber) == 2)
        {
            WriteMessage("You are close!!", ConsoleColor.DarkCyan);
        }

        if (giveDirectionalHint)
        {
            WriteMessage("Wrong number - too " + (guess < correctNumber ? "low!" : "high!"),
                ConsoleColor.Red);
        }
        else
        {
            WriteMessage("Wrong number, please try again", ConsoleColor.Red);
        }

        // Only ask for a hint if they have any hints (and guesses) remaining
        if (hintCount < maxHints && guessCount < maxGuesses)
        {
            // If they asked for a hint, increase the hint count
            if (AskForAHint(correctNumber)) hintCount++;
            // If they didn't want a hint, max out hint count so we don't ask again
            else hintCount = maxHints; 
        }
    } while (guessCount < maxGuesses);

    WriteMessage("You are CORRECT!", ConsoleColor.Yellow);

    GetKeyFromUser("\nDone! Press any key to exit...");
}

Здесь используются вспомогательные функции:

public static void WriteMessage(string message, ConsoleColor color = ConsoleColor.Gray)
{
    Console.ForegroundColor = color;
    Console.WriteLine(message);
    Console.ResetColor();
}

private static string GetUserInput(string prompt, ConsoleColor color = ConsoleColor.Gray)
{
    Console.ForegroundColor = color;
    Console.Write(prompt);
    Console.ResetColor();
    return Console.ReadLine();
}

Вывод

Вы можете видеть в выводе ниже мне дали только одну подсказку. Однако это, в сочетании с подсказками, сделало игру легкой для победы:

enter image description here

0 голосов
/ 05 мая 2020

Используйте логическую переменную-член, это похоже на то, как вы можете избежать рекурсивных вызовов.

private bool alreadyHinted = false;
static void AskForAHint(int num)
    {
         if (alreadyHinted) return;
         alreadyHinted = true;

В какой-то момент вам нужно будет установить alreadyHinted обратно на false;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...