简体   繁体   中英

my guessing game is not working and i don´t know why

I'm working on a guessing game that I need to improve for school, and I need to make it so that my game can make more rounds. But I hav a problem, the program doesn´t want to quit, it only starts a new round even if I "make the quit command". The problem now is that my game doesn´t even want to start and I have no idea why. I have tried so many things to try to fix it and nothing works and I need to make it to a do while loop instead. And I think I know how to do that without big problems. Here is my code

using System;

 namespace MyFirstProgram
 {
     class Program
     {
         static void Main(string[] args)
         {
             Random random = new Random();
             bool playAgain = true;
             int min = 1;
             int max = 100;
             int guess;
             int number;
             int guesses;
             String response;

             while (playAgain)
             {
                 guess = 0;
                 guesses = 0;
                 response = "";
                 number = random.Next(min, max + 1);

                 while (guess != number)
                 {
                     //opening quote
                     Console.ForegroundColor = ConsoleColor.Green;
                     Console.WriteLine("gissa talet\nDu ska nu gissa ett tal mellan 1 
 ocn 100, så varsågod..\nskriv in ett tal");
                     guess = Convert.ToInt32(Console.ReadLine());
                     Console.WriteLine("Guess: " + guess);

                     //when guess is over 100
                     if (guess > 100)
                     {
                          Console.ForegroundColor = ConsoleColor.DarkRed;
                          Console.WriteLine("Du måste skriva in ett tal mellan 1 och 
 100!");
                     }
                     else
                     {

                         //if guess is to small
                         if (guess > number)
                         {
                             Console.ForegroundColor = ConsoleColor.DarkRed;
                             Console.WriteLine("Ditt tal är för litet. gissa på ett 
 större tal");
                         }

                         //if guess is to large
                         else if (guess < number)
                         {
                             Console.ForegroundColor = ConsoleColor.DarkRed;
                             Console.WriteLine("Ditt tal är för stort. gissa på ett 
 mindre tal.");
                         }

                         //when your guess is close but not right
                         if (Math.Abs(guess - number) <= 3)
                         {
                             Console.ForegroundColor = ConsoleColor.Red;
                             Console.WriteLine("Du är dock nära och det bränns");
                         }
                     }
                         guesses++;
                 }
                 //when you won
                 Console.ForegroundColor = ConsoleColor.Yellow;
                 Console.WriteLine("Grattis du gissa rätt,\n talet är" + " " + number);
                 Console.WriteLine("gissning" + " " + guesses);

                 //playagain command
                 Console.ForegroundColor = ConsoleColor.Cyan;
                 Console.WriteLine("vill du spela igen? (Ja/Nej): ");
                 response = Console.ReadLine();
                 response = response.ToUpper();

                 if (response == "Ja")
                 {
                     playAgain = true;
                 }
                 else
                 {
                     playAgain = false;
                 }
             }
             //end quote
             Console.WriteLine("tack för att du spela");

             Console.ReadKey();
         }
     }
 }    

The reason that it doesn't work is that you convert the response to upper case. However you don't check for the upper case version of the word.

So if (response == "Ja") should be if (response == "JA")

Just for the record, usually when you compare string in C#, seek for ways that let you also provide StringComparison .

For example, if I want to check if a string is Ja , but without considering character case, I can write something like this:

    public static void Main()
    {
        string input = "JA";

        if (input.Equals("Ja", StringComparison.InvariantCultureIgnoreCase))
        {
            Console.WriteLine("They're the same!");
        }
    }

// result: They're the same!

By the way, C# Dictionary also supports this.

    public static void Main()
    {
        Dictionary<string, string> dict = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
        
        dict.Add("Ja", "Peko");
        
        Console.WriteLine(dict["JA"]);
    }

// result: Peko

You have line breaks in your strings, which make your code unable to compile. In C#, you can't break strings like this:

// This does not compile
string str = "my string on
several lines";

I tagged involved lines with /* here ---> */ comments below:

using System;

namespace MyFirstProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            Random random = new Random();
            bool playAgain = true;
            int min = 1;
            int max = 100;
            int guess;
            int number;
            int guesses;
            String response;

            while (playAgain)
            {
                guess = 0;
                guesses = 0;
                response = "";
                number = random.Next(min, max + 1);

                while (guess != number)
                {
                    //opening quote
                    Console.ForegroundColor = ConsoleColor.Green;
/* here ---> */     Console.WriteLine("gissa talet\nDu ska nu gissa ett tal mellan 1 ocn 100, så varsågod..\nskriv in ett tal");
                    guess = Convert.ToInt32(Console.ReadLine());
                    Console.WriteLine("Guess: " + guess);

                    //when guess is over 100
                    if (guess > 100)
                    {
                        Console.ForegroundColor = ConsoleColor.DarkRed;
/* here ---> */         Console.WriteLine("Du måste skriva in ett tal mellan 1 och 100!");
                    }
                    else
                    {
                        //if guess is to small
                        if (guess > number)
                        {
                            Console.ForegroundColor = ConsoleColor.DarkRed;
/* here ---> */             Console.WriteLine("Ditt tal är för litet. gissa på ett större tal");
                        }
                        //if guess is to large
                        else if (guess < number)
                        {
                            Console.ForegroundColor = ConsoleColor.DarkRed;
/* here ---> */             Console.WriteLine("Ditt tal är för stort. gissa på ett mindre tal.");
                        }
                        //when your guess is close but not right
                        if (Math.Abs(guess - number) <= 3)
                        {
                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.WriteLine("Du är dock nära och det bränns");
                        }
                    }
                    guesses++;
                }
                //when you won
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Grattis du gissa rätt,\n talet är" + " " + number);
                Console.WriteLine("gissning" + " " + guesses);

                //playagain command
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.WriteLine("vill du spela igen? (Ja/Nej): ");
                response = Console.ReadLine();
                response = response.ToUpper();

                if (response == "JA")
                {
                    playAgain = true;
                }
                else
                {
                    playAgain = false;
                }
            }
            //end quote
            Console.WriteLine("tack för att du spela");

            Console.ReadKey();
        }
    }
}

You could however write it with verbatim string literal ( @"myText" ):

// This compiles
Console.WriteLine(@"gissa talet
Du ska nu gissa ett tal mellan 1 ocn 100, så varsågod..
skriv in ett tal");

Side note: if you guess the right number, you still enter the " guess is close " part (as guess-number == 0 which is <= 3 ).

See red line in below screenshot:

不错的猜测

Besides your other problems you have a infinite loop hidden somewhere here...

    //if guess is to small
if (guess > number)
{
    Console.ForegroundColor = ConsoleColor.DarkRed;
    Console.WriteLine("Ditt tal är för litet. gissa på ett större tal");
}

//if guess is to large
else if (guess < number)
{
    Console.ForegroundColor = ConsoleColor.DarkRed;
    Console.WriteLine("Ditt tal är för stort. gissa på ett mindre tal.");
}

//when your guess is close but not right
if (Math.Abs(guess - number) <= 3)
{
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("Du är dock nära och det bränns");
}

I am sure you can figure it out by yourself from here on!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM