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