在按钮上随机排列问题/答案

本文关键字:问题 答案 排列 随机 按钮 | 更新日期: 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
            });
    }

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

  1. 显示的问题和
  2. 哪个答案在哪个按钮上。

我问这个是因为,在一分钟内,问题以完全相同的顺序显示(遍历数组并按其写入的顺序显示它们),正确的答案每次都在相同的按钮上。我想知道是否有一种方法来随机化/洗牌这些不会完全打破我的程序?

编辑:我现在有随机问题部分排序,只需要弄清楚如何随机化答案出现在按钮上的顺序。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
  • 使用BringToFrontSendToBack方法改变控件的z轴顺序
  • 使用事件通知客户端在用户控制中发生的事情。我创造了DifficultySelected事件去通知玩家使用所选择的难度。QuestionAnswered事件用于通知当前问题是否回答正确。
  • 使用自定义事件参数向事件处理程序传递额外的数据
  • 使用枚举。Difficulty.Medium2更具可读性。
  • 如果你的代码中有类似的方法,那么试着将通用逻辑提取到一个方法中。看看问题按钮点击的处理程序,我在代码中使用了四个不同的处理程序。
  • 使用控件的描述性名称代替label1button4

仍有改进的地方。例:我在DifficultySelectionControl中看到了重复-所有处理程序看起来都很相似。也有重复的按钮背景颜色。你应该有一个单独的地方来定义按钮的不同状态的颜色。还有一个丑陋的按难度过滤(我将enum强制转换为int)。我把答案随机移到了QuestionControl