Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

C#

David Murumbi
David Murumbi
1,442 Points

C# ending while loop after x number of times

So I am building a project just to test what I've learned so far in c# after completing the basics course. I am trying to ask the user to solve a riddle but they only have 3 tries to solve it then that riddle skips to the next one. I haven't figured out a way to end a while loop after an x amount of times even after doing some research on stack overflow and Microsoft. Please help. Also if you have suggestions to make my code look cleaner you can add that in as well thx!!!

using System;

class MainClass 
{
  public static void Main (string[] args) 
  {
    //Prompt user to play or quit(done) the game

    Console.Write("Welcome to our Quiz!\n");

    Console.Write("Start now by typing 'Play' or 'Done' to quit:  ");
    string start;
    start = Console.ReadLine();


    if(start.ToLower() == "play")
    {
        Console.WriteLine("\nAwesome let's start");
    }

    else
    {
        Console.Write("Than You! Goodbye");
        System.Environment.Exit(0);

    }
    //Ask first riddle

    Console.WriteLine("\nQ1: What has a head, a tail, is brown, and has no legs?  ");

    while (true)
    {
        string answerOne;
        answerOne = Console.ReadLine();

        if (answerOne == "a coin")
        {
            Console.WriteLine("A1: {0}", answerOne);
            Console.WriteLine("YES! You got it!!!");
        }

        else if (answerOne != "a coin")
        {
            Console.WriteLine("Nop! Nice try... give it another shot: ");

        }


    }


    //It must keep track of how many they get wrong, 
  }
}
David Murumbi
David Murumbi
1,442 Points

I know how to end while loops but it's really just ending after "x" number of times I can't figure out what to do.

2 Answers

Steven Parker
Steven Parker
231,236 Points

You can have a counter in your loop, and an extra condition for a wrong answer to determine whether to end the loop or give another try. You also don't need to test for the opposite of a previously tested condition, the "else" handles that for you:

int tries = 0;             // keep a count of tries
while (true)
{
    string answerOne = Console.ReadLine();

    if (answerOne == "a coin")
    {
        Console.WriteLine("A1: {0}", answerOne);
        Console.WriteLine("YES! You got it!!!");
        break;             // end the loop on win
    }
    else if (++tries < 3)  // increment tries and check against limit
    {
        Console.Write("Nope! Nice try... give it another shot: ");
    }
    else                   // too many tries
    {
        Console.WriteLine("Sorry, you didn't get that one.");
        break;             // end the loop
    }
}
David Murumbi
David Murumbi
1,442 Points

Thank you so much for your help!

Steven Parker
Steven Parker
231,236 Points

David Murumbi — Glad to help. You can mark a question solved by choosing a "best answer".
And happy coding!

A more complete example

If I got you right you want to let the user solve riddles, which are asked randomly, and if the user answers a specific number of question wrong the game ends. The user wins the game when all questions a answered right.

To build such a game you need some kind of game loop (most of the times a while loop is best suited) to

  1. ask a random question
    • get a random number between 0 and the length of questions available
    • use the random number to get a random item from a questions store
  2. get the users input
  3. compare expected result to the user input
    • if they equal delete the question from the store so it won't get asked again and use the continue keyword to jump to the next loop cycle
    • if they don't equal increment a failure counter which gets checked in the while condition
  4. check that the user hasn't exceeded the failure threshold (lost) and that the user hasn't answered all question (win) via the while condition
var failureCounter = 0;   // initialize counter, threshold, and QAs
var failureThreshold = 3;
Dictionary<string, string> qaStore = new Dictionary<string, string>() {  // All QAs are stored in a Dictionary 
    new KeyValuePair() 
    { 
       Key = "What has a head, a tail, is brown, and has no legs?", // where the key is the question 
       Value="a worm" // and the Value is the answer
    }
};
var rnd = new Random();

while (failureCounter <= failureThreshold && qaStore.length > 0)  // checks for every cycle that the failure count has not exceed the threshold and that there are questions in the Dictionary
{
    var randomIndex = rnd.Next(0, qaStore.length); // get a random index for the qaStore (bewteen zero and the qaStores length)
    var qa = qaStore.ToList()[randomIndex];

    Console.WriteLine(qa.Key.ToString());
    var userAnswer = Console.ReadLine();
    if(userAnswer.ToLower() == qa.Value) {
        Console.WriteLine("Correct!!!!");
        qaStore.Remove(qa); // remove the question from the qaStore dictionary so it won't get asked again
        continue; // skips the rest in THIS loop cycle but starts a new cycle in this while loop
    }
    else
    {
        Console.WriteLine("That was wrong!!");
        failureCounter++; // increases the failure count by 1
    }
}

if(failureCounter > failureThreshold) {
  // if the user has exceed the failureThreshold and the while loop ends
  Console.WriteLine("You lost!");
}
else if(qaStore.length < 0) {
 // if the user has answered all questions and the while loop ends
  Console.WriteLine("You won!");
}

Hope that this is not too complex;

Steven Parker
Steven Parker
231,236 Points

It doesn't look like the question is ever "asked" (shown to the user). And the loop ends when you lose, but what if you win? Wouldn't it just repeat over and over?

If you add more questions to the question Dictionary and add a random index than it won't.

Steven Parker
Steven Parker
231,236 Points

I just thought you might want to show a more complete example .

Thanks. I added the abillity to win the game and upated the answer.

David Murumbi
David Murumbi
1,442 Points

Hey thank a lot what you wrote is a little advanced for me but will definitely review for the future