Как реализовать в консольной викторине удаление опции каждые t2 секунды (t2 - PullRequest
1 голос
/ 05 февраля 2020

Я новичок в C# и пытаюсь построить консольный тест.

Вот моя проблема:

Для каждого удаленного параметра мне нужно уменьшить один параметр (скажем, всего 100 баллов).

Если удаляется одна опция, мне нужно уменьшить общее количество баллов на 25 (т.е. теперь общее количество баллов будет равно 75).

JSON data:

{
  "question": [
    {
      "level": "Easy",
      "cat": "sports",
      "description": "Who is the Highest run getter in 2019",
      "Option1": "Rohit Sharma",
      "Option2": "Virat Kohli",
      "Option3": "Kl Rahul",
      "Option4": "S Dhawan",
      "Answer":"1"
    }]
}

Программа:

using System;
using System.Timers;
namespace CProgram
{
    class EasyQuestion
    {
        private string mLevel;
        private string mCat;
        private string mDescription;
        private string mOption1;
        private string mOption2;
        private string mOption3;
        private string mOption4;
        private string mAnswer;

        public string MDescription { get => mDescription;  }
        public string MOption1 { get => mOption1; }
        public string MOption2 { get => mOption2; }
        public string MOption3 { get => mOption3; }
        public string MOption4 { get => mOption4; }
        public string MAnswer { get => mAnswer; }
        public string MLevel { get => mLevel;  }
        public string MCat { get => mCat; }
        public static int sQcount=1;

        public  int sPlayerScore=0;
        public int mNoOfQuesAnswerd=0;

        static Timer questionTimer = new Timer(60000) ;


        private static void QuestionTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
             Console.WriteLine("Time up!");
             System.Console.WriteLine("Lets Move on to Next Question");
                questionTimer.Stop();
        }

        public EasyQuestion(string level,string cat,string description,string Option1,string Option2,string Option3,string Option4,string Answer)
        {
            this.mLevel=level;
            this.mCat=cat;
            this.mDescription=description;
            this.mOption1=Option1;
            this.mOption2=Option2;
            this.mOption3=Option3;
            this.mOption4=Option4;
            this.mAnswer=Answer;
        }

        public EasyQuestion()
        {

        }


        public void AskEasyQues(EasyQuestion easyQuestion)
        {

            System.Console.WriteLine("Here is Your:"+sQcount+" Question:");
            System.Console.WriteLine("***********************************");
            System.Console.WriteLine("Question is of The Category:"+easyQuestion.MCat);
            System.Console.WriteLine("***********************************");
            System.Console.WriteLine(easyQuestion.MDescription);
            System.Console.WriteLine("--------------------------------------");
            System.Console.WriteLine("1:"+easyQuestion.MOption1+"         "+"2:"+easyQuestion.MOption2);
            System.Console.WriteLine();
            System.Console.WriteLine("3:"+easyQuestion.MOption3+"         "+"4:"+easyQuestion.MOption4);
            System.Console.WriteLine();
            questionTimer.Elapsed += QuestionTimer_Elapsed;
            questionTimer.Enabled = true;
            questionTimer.Start();
            System.Console.WriteLine("Enter your Choice:");
            /*for (int a = 60; a >= 0; a--)
            {
                Console.Write("\rGenerating Preview in {0:00}", a);

                System.Threading.Thread.Sleep(1000);
            } */

            string ans=Console.ReadLine();

            if(ans==easyQuestion.MAnswer)
            {
                questionTimer.Stop();
                mNoOfQuesAnswerd++;
                System.Console.WriteLine();
                System.Console.WriteLine("------Well Played Champion!!!!!!-----");
                sPlayerScore=sPlayerScore+100;


            }
            else
            {
                System.Console.WriteLine();

               System.Console.WriteLine("------Wrong Choice Lets Move On--------");
            }
            System.Console.WriteLine();
            System.Console.WriteLine("Press any Key To Continue For Next Question");
            Console.ReadLine();
            System.Console.WriteLine();
            System.Console.WriteLine("----------------------------");
            sQcount=sQcount+1;
            Console.Clear();
        }
    }
}

У меня таймер на 60 секунд, и мне приходится удалять опцию каждые 15 секунд.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Здесь; Я написал это для вас, чтобы показать вам, почему вы не можете легко сделать то, что вы просите:

    static void Main(string[] args)
    {
        string[] answers = new[] { "answer one", "answer two", "answer three", "answer four" };
        Random r = new Random();

        int rightAnswer = 2;

        Console.Write("\r" + string.Join(", ", answers));

        for (int i = 1; i < 60; i++)
        {

            if (i % 15 == 0)
            {
                //randomly remove an answer that is not the right one
                int a = r.Next(answers.Length);
                while (a == rightAnswer || answers[a][0] == ' ') // dont remove the right answer! dont pick an answer that is already blanked
                    a = r.Next(answers.Length);

                answers[a] = new string(' ', answers[a].Length); //replace answer with spaces

                //return to the start of the line and overwrite 
                Console.Write("\r" + string.Join(", ", answers));
            }

            System.Threading.Thread.Sleep(100);

        }

        Console.Write("\nQuit");
    }

Это «работает» в том смысле, что удаляет один параметр каждые 1,5 секунды (если вы хотите 15, продлите сон), но вопрос не может быть дан ответ на консоли. Как только вы вставите ReadLine (), чтобы получить ответ, программа остановит ожидание в этот момент, пока пользователь не введет ответ. Вы можете принять это и найти другой очень сложный способ получения ответа, например, открыв порт прослушивания и пригласив пользователя te lnet в программу и отправив свой ответ таким образом et c ...

Но верно; сыграйте и посмотрите, что я и Крис говорим, а затем сделайте это в windows GUI

0 голосов
/ 05 февраля 2020

Таймеры и консоли не очень хорошо сочетаются. Или действительно вообще. В консоли обычно вы go переходите от одного запроса блокирующего ввода к следующему (ReadLine() и ReadKey()) с нечетной фазой обработки между ними.

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

Остальное просто очистить + перепечатка или настройка курсор назад и перезапись. Лично я предпочитаю метод clean + rewrite для такого случая.

Подсчет времени можно выполнить с помощью DateTime.Now и .AddSeconds(). Но я могу только повторить, что с Windows Forms или другим GUI это было бы невероятно тривиально. Было бы просто добавить таймер и установить одну кнопку скрытой.

...