2013-03-10 91 views
1

我创建了一个问答游戏,我已经储存在我的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. 的方式,回答是哪个按钮。

我问这个是因为,在一分钟,这些问题都显示在以相同的顺序(穿过阵列和字面显示他们在他们的书面命令)和正确的答案是同一个按钮上每次。我想知道是否有一种方法来随机/洗牌这些不会完全破坏我的程序?

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

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

</answers> 

感谢您的帮助和/或响应。

回答

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

+0

非常感谢!有没有什么办法用按钮的答案来做到这一点?在XML文件中,正确的答案有环绕它们,错误的答案有缠绕它们 – user2141272 2013-03-10 14:17:25

+0

@ user2141272只有你应该改变的事情是正确的答案验证。通过价值而不是索引 – 2013-03-10 14:30:19

+0

那么我该怎么做呢?更改部分?对于问题抱歉,但我认为最好问问 – user2141272 2013-03-10 14:35:37