我创建了一个问答游戏,我将我的问题存储在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
});
}
我想知道是否有一种随机化方式
我问这个是因为,在某一刻,问题以完全相同的顺序显示(通过数组并按字面顺序显示它们的顺序),每次都在同一个按钮上正确答案。我想知道是否有办法随机化/洗牌这些不会完全破坏我的程序?
编辑:我现在将随机问题部分排序,只需要弄清楚如何随机化答案在按钮上出现的顺序。 XML文件的示例:<question id="2" difficulty="1">
<text></text>
<answers>
</answers>
感谢您提供任何帮助和/或回复。
答案 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
答案相关的控件。BringToFront
和SendToBack
方法更改控件的Z顺序DifficultySelected
事件以通知使用选定的难度。 QuestionAnswered
事件用于通知当前问题是否得到正确回答。Difficulty.Medium
比2
更具可读性。label1
或button4
。还有改进的地方。例如。我在DifficultySelectionControl
看到重复 - 所有处理程序看起来都很相似。还有按钮背景颜色的重复。你应该有一个单独的位置,为不同的按钮状态定义颜色。还有难以过滤的丑陋黑客(我将枚举枚举到int)。我将答案随机分配到QuestionControl
。