设计一个简单的控制台琐事应用程序



我们的任务是设计一个C#琐事应用程序作为文件I/O练习。到目前为止,我有一个良好的开端,但演示步骤有点难倒我

我从一个具有以下数据的分隔文件开始:

Question;CorrectAnswerA;AnswerB;AnswerC;AnswerD;AnswerExplanation

例如

 What color is the sky?;Blue;White;Green;Yellow;The sky is blue.

游戏将显示用户可以选择的问题和四个答案。

What Color is the Sky?
A. Blue
B. White
C. Green
D. Yellow
Select A, B, C, or D: 

不幸的是,为了便于填充数据集,A始终是正确的答案。我想随机化四个答案的显示顺序,但程序仍然需要知道哪个是正确的答案。我还需要将ABCD的用户输入绑定到答案的特定实例,以将selectedAnswerStringcorrectAnswerString进行比较。

我一直在玩一个由四个答案组成的数组,这些答案是随机填充的,但我无法理解如何根据用户的选择将某个问题标记为正确的;我的执行或分配逻辑似乎总是超出范围,或者在数组中的所有四个记录中重复。

与我交谈过的其他学生表示,他们创建的数据集的答案是预先加扰的(这样他们就可以按阅读顺序打印),并为正确答案提供第五个答案字段。虽然这绝对是一种简单的实现方式,但我不认为它像我的策略那样优雅。

我应该只更改输入数据集吗?有人对我的随机化想法有什么想法吗?

创建一个名为Question的类,属性为:int Idstring QuestionTextList<string> Answersstring CorrectAnswer

或者,作为前进的一步,还使用IdValue创建类Answer并引用它

   public class Question
    {
        public int Id;
        public string QuestionText;
        public List<Answer> Answers;
        public Answer CorrectAnswer;
    }
    public class Answer
    {
        public int Id;
        public string Value;
    }

然后填充此结构并在打印时随机化

使用单独的变量跟踪正确答案。然后使用Fisher Yates洗牌你的阵列:

Random random = new Random();
void Shuffle(string[] answers) {
   for (int i = 0; i < answers.Length - 1; i++) {
      int j = random.Next(i, answers.Length);
      string temp = answers[j];
      answers[j] = answers[i];
      answers[i] = temp;
   }
}

用户响应后,只需将他们的选择与您保存的正确答案进行比较。

试着用这种方式定义问题的数据结构:

public class Question
{
    public string Question;
    public string[] Answers;
    public int CorrectAnswer;
    public string CorrectAnswerExplanation
}

通过这种方式,您可以对数组Answers中的字符串进行加扰,同时仍然跟踪CorrectAnswer中正确答案的索引。

或者,如果你不能使用单独的类来建模问题(这是一个家庭作业问题,所以你可能还没有学会),你可以使用数组中的预定位置(第一个或第五个元素)来保存正确答案的索引。所以你的答案数组看起来像:

"Blue", "White", "Green", "Yellow", "0"

步骤1:定义数据结构。其他人已经给了你一个结构,所以使用它。

步骤2:填充数据结构。你可以System.IO.File.ReadLines并解析每一行——我想你已经处理好了这个位。

第三步:随机排列你的答案。为此,假设您有自己的结构:

public static void RandomiseAnswers(IEnumerable<Question> questions)
{
    var rand = new Random((int)DateTime.Now.Ticks);
    foreach (var question in questions) 
    {
        question.Answers = question.Answers.OrderBy(x => rand.Next()).ToArray();
    }
}

步骤4:从老师那里获得金星,以表彰你的杰出工作

就我个人而言,我会在Answer类中放入一个布尔值,默认为false。这样,当选择答案时,你就可以判断它是否正确。

public class AskQuestion
{
    public int Id;
    public string Question;
    public string Explanation;
    public List<Answer> Answers = new List<Answer>();
}
public class Answer
{
    public bool Correct = false;
    public string Value;
}

现在,当你随机化列表时,正确的答案会自动识别为

使用这些类的一种方法如下:

    static void Main(string[] args)
    {
        StreamReader sr = new StreamReader("text.txt");
        List<AskQuestion> Questions = new List<AskQuestion>();
        Random rnd = new Random(DateTime.Now.Millisecond);
        //Loop through the file building a list of questions
        while(!sr.EndOfStream)
        {
            AskQuestion NewQuestion = new AskQuestion();
            string[] input = sr.ReadLine().Split(';');
            NewQuestion.Question = input[0];
            NewQuestion.Explanation = input[5];
            for(int i = 1; i < 5; i++)
            {
                Answer NewAnswer = new Answer();
                NewAnswer.Value = input[i];
                NewQuestion.Answers.Add(NewAnswer);
            }
            //The first question is always correct so set its boolean value to true;
            NewQuestion.Answers[0].Correct = true;
            //Now ranmdomize the order of the answers
            NewQuestion.Answers = NewQuestion.Answers.OrderBy(x => rnd.Next()).ToList();
            Questions.Add(NewQuestion);
        }
        //Generate menu and get response for each question
        foreach(AskQuestion q in Questions)
        {
            Console.WriteLine(q.Question + ":ntA - " + q.Answers[0].Value + "ntB - " + q.Answers[1].Value + "ntC - " + q.Answers[2].Value + "ntD - " + q.Answers[3].Value + "n");
            char input = '0';
            while(input < 'A' || input > 'D')
            {
                input = char.ToUpper(Console.ReadKey().KeyChar);
                if(input >= 'A' && input <= 'D')
                {
                    //Use the boolean value in the answer to test for correctness.
                    if(q.Answers[input - 'A'].Correct)
                    {
                        Console.WriteLine("nCorrectn");
                    }
                    else
                        Console.WriteLine("nWrongn");
                    Console.WriteLine(q.Explanation);
                }
            }
        }
        Console.ReadLine();
    }

相关内容

  • 没有找到相关文章

最新更新