随机化按钮上的数组/答案中的问题

时间:2013-03-10 14:04:59

标签: c# winforms linq-to-xml

我创建了一个问答游戏,我将我的问题存储在XML文件中(一个xml文件用于简单,中等和难题)并创建了一个数组:

        var quiz = XDocument.Load(path);
        _questions = quiz.Descendants("question")
            .Select(q => new Question()
            {
                ID = int.Parse(q.Attribute("id").Value),
                Difficulty = int.Parse(q.Attribute("difficulty").Value),
                QuestionText = q.Element("text").Value,
                Answers = q.Element("answers")
                    .Descendants()
                    .Select(a => a.Value)
                    .ToArray(),
                CorrectAnswer = q.Element("answers")
                    .Descendants()
                    .Select((a, i) => new { node = a.Name, index = i })
                    .First(a => a.node == "correctAnswer").index
            });
    }

我想知道是否有一种随机化方式

  1. 显示的问题和
  2. 哪些答案在哪些按钮上。
  3. 我问这个是因为,在某一刻,问题以完全相同的顺序显示(通过数组并按字面顺序显示它们的顺序),每次都在同一个按钮上正确答案。我想知道是否有办法随机化/洗牌这些不会完全破坏我的程序?

    编辑:我现在将随机问题部分排序,只需要弄清楚如何随机化答案在按钮上出现的顺序。 XML文件的示例:

    <question id="2" difficulty="1">
    <text></text>
    <answers>
    
    </answers>
    

    感谢您提供任何帮助和/或回复。

1 个答案:

答案 0 :(得分:3)

从xml:

读取数据时,使用随机数排序
   var rand = new Random();
   var quiz = XDocument.Load(path);
    _questions = quiz.Descendants("question")
        .Select(q => new Question()
        {
            ID = (int)q.Attribute("id"),
            Difficulty = (int)q.Attribute("difficulty"),
            QuestionText = (string)q.Element("text"),
            Answers = q.Element("answers")
                .Descendants()
                .Select(a => (string)a)
                .OrderBy(a => rand.Next()) // randomizing answers
                .ToArray(),
            CorrectAnswer = (string)q.Element("answers")
                .Descendants("correctAnswer")
                .First() // use value instead of index
        })
        .OrderBy(q => rand.Next()); // randomizing questions

您的其他程序将保持原样。


我对你的项目进行了重构。结果你可以到这里来。你有很多重复的重复代码。尝试单独表示应用程序中的任何信息。这将使您的项目易于维护。

关于重构的要点:

  • 使用用户控件将相关控件组合在一起。我将与难度选择相关的控件提取到DifficultySelectionControl以及与显示问题和选择QuestionControl答案相关的控件。
  • 使用BringToFrontSendToBack方法更改控件的Z顺序
  • 使用事件通知客户端用户控制用户控件中发生的事情。我创建了DifficultySelected事件以通知使用选定的难度。 QuestionAnswered事件用于通知当前问题是否得到正确回答。
  • 使用自定义事件参数将其他数据传递给事件处理程序
  • 使用枚举。 Difficulty.Medium2更具可读性。
  • 如果您的代码中有类似的方法,那么尝试将常用逻辑提取到一个方法中。看看问题按钮点击的处理程序,我在代码中使用了四个不同的处理程序。
  • 使用控件的描述性名称,而不是label1button4

还有改进的地方。例如。我在DifficultySelectionControl看到重复 - 所有处理程序看起来都很相似。还有按钮背景颜色的重复。你应该有一个单独的位置,为不同的按钮状态定义颜色。还有难以过滤的丑陋黑客(我将枚举枚举到int)。我将答案随机分配到QuestionControl