简体   繁体   English

如何重构我的 C# 代码,以免重复自己?

[英]How can I refactor my C# code so I do not repeat myself?

I have built a multiplication project that asks the user a difficulty level and the number of questions they want to answer and then the user will answer the random multiplication questions!我建立了一个乘法项目,询问用户难度级别和他们想要回答的问题数量,然后用户将回答随机乘法问题!

But I am trying to refactor the code so I don't repeat myself too many times.但我正在尝试重构代码,所以我不会重复太多次。

Can anyone please help me make the code less repeatable?任何人都可以帮我减少代码的可重复性吗?

Here is the code:这是代码:

using System;

namespace mathstester
{
    class Program
    {
        public static void Main(string[] args)
        {
            string userDifficulty = "";
            do
            {
                Console.WriteLine("What difficulty level would you like to do! Please type E for Easy, N for Normal and H for hard");
                userDifficulty = Console.ReadLine().ToUpper();
            }while (userDifficulty != "E" && userDifficulty != "N" && userDifficulty != "H");

            int numberOfQuestions = 0;
            int numberOfQuestionsLeft = 0;
            do
            {
                Console.Write("How many questions would you like to answer?Please type a number divisible by 10");
                int.TryParse(Console.ReadLine(), out numberOfQuestions);
                numberOfQuestionsLeft = numberOfQuestions;
            } while (numberOfQuestions % 10 != 0);

            Random random = new Random();
            int easyNumber1 = random.Next(10);
            int easyNumber2 = random.Next(10);
            int normalNumber1 = random.Next(100);
            int normalNumber2 = random.Next(100);
            int hardNumber1 = random.Next(10, 1000);
            int hardNumber2 = random.Next(10, 1000);
            int score = 0;

            while (numberOfQuestionsLeft > 0)
            {
                if (userDifficulty == "E")
                {
                    Console.Write($"What is {easyNumber1} * {easyNumber2} =");
                    int correctAnswer = easyNumber1 * easyNumber2;
                    int userAnswer = Convert.ToInt32(Console.ReadLine());
                    if (correctAnswer == userAnswer)
                    {
                        Console.WriteLine("Well Done!");
                        score++;
                    }
                    else
                    {
                        Console.WriteLine("Your answer is incorrect!");
                    }
                    numberOfQuestionsLeft--;
                    easyNumber1 = random.Next(10);
                    easyNumber2 = random.Next(10);
                }
                else if (userDifficulty == "N")
                {
                    Console.Write($"What is {normalNumber1} * {normalNumber2} =");
                    int correctAnswer = normalNumber1 * normalNumber2;
                    int userAnswer = Convert.ToInt32(Console.ReadLine());
                    if (correctAnswer == userAnswer)
                    {
                        Console.WriteLine("Well Done!");
                        score++;
                    }
                    else
                    {
                        Console.WriteLine("Your answer is incorrect!");
                    }
                    numberOfQuestionsLeft--;
                    normalNumber1 = random.Next(100);
                    normalNumber2 = random.Next(100);
                }
                else if (userDifficulty == "H")
                {
                    Console.Write($"What is {hardNumber1} * {hardNumber2} =");
                    int correctAnswer = hardNumber1 * hardNumber2;
                    int userAnswer = Convert.ToInt32(Console.ReadLine());
                    if (correctAnswer == userAnswer)
                    {
                        Console.WriteLine("Well Done!");
                        score++;
                    }
                    else
                    {
                        Console.WriteLine("Your answer is incorrect!");
                    }
                    numberOfQuestionsLeft--;
                    hardNumber1 = random.Next(10, 1000);
                    hardNumber2 = random.Next(10, 1000);
                }
            }
            Console.WriteLine($"You got a score of {score} out of {numberOfQuestions}");
        }
    }
}

Thank You in advance!先感谢您!

Just move the part that defines the numbers away from the rest, and don't use different variables for each difficulty.只需将定义数字的部分从其余部分移开,不要为每个难度使用不同的变量。 Also, it is enough to initialize their values before the question, no need to do it before and afterwards.另外,在问题之前初始化它们的值就足够了,不需要前后都这样做。

using System;

namespace mathstester
{
    class Program
    {
        public static void Main(string[] args)
        {
            string userDifficulty = "";
            do
            {
                Console.WriteLine("What difficulty level would you like to do! Please type E for Easy, N for Normal and H for hard");
                userDifficulty = Console.ReadLine().ToUpper();
            } while (userDifficulty != "E" && userDifficulty != "N" && userDifficulty != "H");

            int numberOfQuestions = 0;
            int numberOfQuestionsLeft = 0;
            do
            {
                Console.Write("How many questions would you like to answer? Please type a number divisible by 10");
                int.TryParse(Console.ReadLine(), out numberOfQuestions);
                numberOfQuestionsLeft = numberOfQuestions;
            } while (numberOfQuestions % 10 != 0);

            Random random = new Random();
            int score = 0;

            while (numberOfQuestionsLeft > 0)
            {
                // Here we define two variables for the numbers
                // and set their values based on the difficulty.
                // Everything else is the same in all cases!
                int number1 = 0;
                int number2 = 0;

                if (userDifficulty == "E") {
                  number1 = random.Next(10);
                  number2 = random.Next(10);
                } else if (userDifficulty == "N") {
                  number1 = random.Next(100);
                  number2 = random.Next(100);
                } else if (userDifficulty == "H") {
                  number1 = random.Next(10, 1000);
                  number2 = random.Next(10, 1000);
                }

                // This code is the same for all difficulty levels!
                Console.Write($"What is {number1} * {number2} =");
                int correctAnswer = number1 * number2;
                int userAnswer = Convert.ToInt32(Console.ReadLine());
                if (correctAnswer == userAnswer)
                {
                    Console.WriteLine("Well Done!");
                    score++;
                }
                else
                {
                    Console.WriteLine("Your answer is incorrect!");
                }
                numberOfQuestionsLeft--;
           }
            Console.WriteLine($"You got a score of {score} out of {numberOfQuestions}");
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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