在按钮上随机排列问题/答案
本文关键字:问题 答案 排列 随机 按钮 | 更新日期: 2023-09-27 18:03:16
我创建了一个测验游戏,我已经将我的问题存储在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("answerswers")
.Descendants()
.Select(a => a.Value)
.ToArray(),
CorrectAnswer = q.Element("answerswers")
.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>
感谢您的帮助和/或回复。
从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("answerswers")
.Descendants()
.Select(a => (string)a)
.OrderBy(a => rand.Next()) // randomizing answers
.ToArray(),
CorrectAnswer = (string)q.Element("answerswers")
.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
中看到了重复-所有处理程序看起来都很相似。也有重复的按钮背景颜色。你应该有一个单独的地方来定义按钮的不同状态的颜色。还有一个丑陋的按难度过滤(我将enum强制转换为int)。我把答案随机移到了QuestionControl
。