C#でクイズゲームのアプリをつくります。
クイズの問題文、選択肢、解答を格納するオブジェクトをつくる
クイズを表示する
選択肢が選択されたら正解かどうかを表示する
次または前の問題に移動できるようにする
ではさっそくはじめてみましょう。
まずQuizクラスを作成します。クイズの問題文、選択肢、解答をフィールド変数にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Quiz { public Quiz(string question, string[] choices, string answer) { Question = question; Choices = choices; Answer = answer; } public string Question = ""; public string[] Choices = null; public string Answer = ""; } |
1 2 3 4 5 |
public partial class Form1 : Form { List<Quiz> Quizes = new List<Quiz>(); int QuizIndex = 0; // 現在のクイズ } |
最初にクイズの問題と選択肢、解答をつくります。
ネタ元はこれです。
https://quiz-daisuki.com/2020-9-30-miracle-3-4taku/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); InitQuizes(); if(Quizes.Count > 0) ShowQuiz(0); } void InitQuizes() { Quizes.Add(new Quiz("スウィーツでモンブランの「モン」フランス語の意味は?", new string[] { "果実", "山", "海", "雪" }, "山")); Quizes.Add(new Quiz("慣用句「鶴の一声」の前につくのは「○の千声」?", new string[] { "はと", "きじ", "すずめ", "からす" }, "すずめ")); Quizes.Add(new Quiz("メロドラマの「メロ」の元々の意味は?", new string[] { "歌", "思い出", "浮気", "キス" }, "歌")); } } |
ShowQuiz(int i)はクイズを表示するためのメソッドです。4択まで対応していますが、選択肢が3以下の場合はいらない選択肢を非表示にしています。最初にすべて非表示にし、選択肢として存在する場合だけ文字列をセットして表示させています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
public partial class Form1 : Form { void ShowQuiz(int i) { Quiz quiz = Quizes[i]; LabelsUnVisible(); labelQuestion.Text = quiz.Question; if(quiz.Choices.Length >= 1 && quiz.Choices[0] != "") { labelChoices1.Text = quiz.Choices[0]; labelChoices1.Visible = true; } if(quiz.Choices.Length >= 2 && quiz.Choices[1] != "") { labelChoices2.Text = quiz.Choices[1]; labelChoices2.Visible = true; } if(quiz.Choices.Length >= 3 && quiz.Choices[2] != "") { labelChoices3.Text = quiz.Choices[2]; labelChoices3.Visible = true; } if(quiz.Choices.Length >= 4 && quiz.Choices[3] != "") { labelChoices4.Text = quiz.Choices[3]; labelChoices4.Visible = true; } } void LabelsUnVisible() { labelChoices1.Visible = false; labelChoices2.Visible = false; labelChoices3.Visible = false; labelChoices4.Visible = false; } } |
選択肢がクリックされたら正解かどうかを判定して結果を表示させます。
クリックされたときのイベントハンドラを作成し、どのラベルがクリックされたのか? その文字列はクイズの答えと一致しているのかをしらべます。そして正解なら「正解!」、不正解なら「残念!」と表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); InitQuizes(); if(Quizes.Count > 0) ShowQuiz(0); SetClickEventHandlers(); EnableButtons(); } void SetClickEventHandlers() { labelChoices1.Click += LabelChoices_Click; labelChoices2.Click += LabelChoices_Click; labelChoices3.Click += LabelChoices_Click; labelChoices4.Click += LabelChoices_Click; } private void LabelChoices_Click(object sender, EventArgs e) { Label label = (Label)sender; labelResult.ForeColor = Color.White; if(Judg(QuizIndex, label.Text)) { labelResult.BackColor = Color.Red; labelResult.Text = "正解!"; } else { labelResult.BackColor = Color.Black; labelResult.Text = "残念!"; } labelResult.Visible = true; } bool Judg(int i, string choice) { if(Quizes[i].Answer == choice) return true; else return false; } } |
結果が表示されたら次の問題にすすみます。EnableButtons()メソッドは次の問題が存在しない場合は[次へ]ボタンを無効にする、前の問題が存在しない場合は[前へ]ボタンを無効にするためのものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public partial class Form1 : Form { private void buttonNext_Click(object sender, EventArgs e) { if(Quizes.Count > QuizIndex +1) { QuizIndex++; ShowQuiz(QuizIndex); } EnableButtons(); // 次の問題が表示されるので、前の問題の結果は非表示にする labelResult.Visible = false; } private void buttonPrev_Click(object sender, EventArgs e) { if(0 < QuizIndex) { QuizIndex--; ShowQuiz(QuizIndex); } EnableButtons(); // 次の問題が表示されるので、前の問題の結果は非表示にする labelResult.Visible = false; } void EnableButtons() { if(QuizIndex > 0) buttonPrev.Enabled = true; else buttonPrev.Enabled = false; if(QuizIndex < Quizes.Count-1) buttonNext.Enabled = true; else buttonNext.Enabled = false; } } |
次の問題が表示されません。何が考えられますか?
返事がおくれてすみません。
ボタンがクリックされたときのイベントハンドラを追加していますか?
デザイナで追加するか、以下のようにしてください。
実行した際、
例外がスローされました
System.NullReferenceException:’オブジェクト参照がオブジェクトインスタンスに設定されていません。’
quiz.Choicesがnullでした
とShowQuiz関数にエラーがでます。
どういったミスが考えられまでしょうか、、
記事に書いているコードをそのままコピペしてエラーが出るか試してみましたが、確認できませんでした。
quiz.Choicesがnullということなので、コンストラクタ内でInitQuizes();を呼び出さずにShowQuiz(0);を呼び出していないとか、そのあたりを確認していただけないでしょうか?
失礼します。この記事を参考に打ってみたんですけど動作がうまくいかないので ソースファイルの配布をお願いできますでしょうか?
>ソースファイルの配布をお願いできますでしょうか?
これをどうぞ
https://github.com/mi3w2a1/simple-quiz
このコードで出てくるquizは何を表したいますか?
>このコードで出てくるquizは何を表したいますか?
「何を表していますか」の入力ミスだと思いますが、
クイズの問題文と選択肢を表示させています。
Quiz quiz Quizes[i];の意味を教えてください
QuizIndexとは何ですか?