1

クイズ ゲームを作成し、質問を XML ファイル (簡単、中、難しい質問用に 1 つの 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>

助けや反応をありがとう。

4

1 に答える 1

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
  • コントロールの Z オーダーを変更する使用方法BringToFrontと方法SendToBack
  • イベントを使用して、ユーザー コントロールで発生したことをユーザー コントロールのクライアントに通知します。DifficultySelected選択した難易度を使用したことを通知するイベントを作成しました。そしてQuestionAnswered、現在の質問が正しく回答されたかどうかを通知するためのイベント。
  • カスタム イベント引数を使用して追加データをイベント ハンドラーに渡す
  • 列挙型を使用します。Difficulty.Mediumよりもはるかに読みやすいです2
  • コードに同様のメソッドがある場合は、共通のロジックを 1 つのメソッドに抽出してみてください。質問ボタン クリックのハンドラーを見てください。代わりに、コードで 4 つの異なるハンドラーを使用しました。
  • label1またはの代わりに、コントロールのわかりやすい名前を使用しますbutton4

まだまだ改善の余地あり。たとえば、重複が見られDifficultySelectionControlます - すべてのハンドラが似ています。また、ボタンの背景色が重複しています。ボタンのさまざまな状態に対して色を定義する単一の場所が必要です。また、難易度でフィルタリングするための醜いハックもあります (私は enum を int にキャストしました)。そして、ランダム化する回答を に移動しましQuestionControlた。

于 2013-03-10T14:09:54.353 に答える