M R
M R

Reputation: 23

How to ignore a line/block of code if the condition is met?

Is there a way to ignore a line/block of code if the condition is met? I'm doing a C# .NET tutorial, and the application is a number guessing game.

I added a hint option if the user enters a wrong number (else if part):

// 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!");

Basically I am asking a user if he wants a hint, and if he writes Y, the hint will be displayed. However, is there an option to display this question only once since this if statement is included in a while loop? It would be annoying if "Do you want a hint?" question keeps displaying even if the user says Y.

My AskForAHint function:

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;
        }
    }

Thanks

Upvotes: 1

Views: 1378

Answers (3)

Rufus L
Rufus L

Reputation: 37020

Another way to do it would be to make the number of hints configurable (allowing the caller to specify how many hints they want to let the user ask for), and then keep track of the number of hints given in the method itself.

This would require a slight change to the AskForAHint method, however, since we don't know if the user answered "Y" or "N" to the hint question. Since AskForHint has no return value, we could have it return a bool that indicates how the user responded to the question:

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;
}

Now we can keep track of how many hints the user has received by incrementing a counter in our "Game" method:

// 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; 
}

To test out the sample code above, I used this method below, which also allows us to configure how many total guesses the user has, what the min and max values of the range should be, and if they should be given a "directional hint", like "too high!" or "too low!":

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...");
}

This uses the helper functions:

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();
}

Output

You can see in the output below, I was only given a single hint. However that, combined with the directional hints, made the game easy to win:

enter image description here

Upvotes: 2

Jacopo Mosconi
Jacopo Mosconi

Reputation: 1052

I think you can do an "if" with a counter. Try It

        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!");

And in the function add

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;
    }
}

Upvotes: 1

Jeremy Thompson
Jeremy Thompson

Reputation: 65584

Use a Member Variable Boolean, its similar to how you can avoid recursive calls.

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

At some point you will need to set alreadyHinted back to false;

Upvotes: 0

Related Questions