• ベストアンサー

VB2008にて4択クイズ作成

質問させていただきます。 現在VB2008にて4択クイズを作成しています。 以下のサイトを参考に作成しているのですが、不明な点がありますのでご回答お願い致します。 http://www.microsoft.com/japan/msdn/student/challengeV2/chap2_vb/ 上記のページでは、Web用?に開発されてるみたいで一部ないコントロールがあります。私はVB2008のwindowsアプリケーションフォームというテンプレートから開始しているのですが、これが問題なのでしょうか。 私の開発環境では「Literal」というコントロールが見当たりません。私が見落としているだけなのかも知れませんが。。 とりあえず、コントロールはURL先とほぼ同様にしています。テーブルの作成(テーブルの挿入の仕方も分かりませんでした)とLiteral、imageコントロールは省いています。 そして、プログラムの内容は最後の項の「さらに一歩進んだテクニック」のものをほとんどそのまま使っています。 以下にそのまま貼り付けます。 Public Class Form1 '正解のボタンを表す変数を定義 Dim Answer As Button Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged ' 問題文を設定する TextBox1.Text = "Web ブラウザと Web サーバーの間で Web ページなどをやり取りする際に用いられる通信プロトコルは?" ' 回答の選択肢を設定する ButtonA.Text = "HTML" ButtonB.Text = "HTTP" ButtonC.Text = "XML" ButtonD.Text = "URL" ' 正解のボタンを設定する Answer = ButtonB End Sub Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonA.Click, ButtonD.Click, ButtonC.Click, ButtonB.Click ' 押されたボタンが正解のボタンかどうか調べる Dim senderButton As Button = CType(sender, Button) ' 正解のボタンを赤くする Answer.BackColor = System.Drawing.Color.Red End Sub End Class 以上です。 上記のプログラムに追加したい項目を挙げます。 1.問題文を複数用意し、ランダムに出題する。(ランダムに出題するという機能は乱数を使えば実現できるのはなんとなく分かるのですが、実際のプログラムが分かりません。 2.用意した問題全てを解答したら終わり。 以上のような流れにしたいのですが、実際にはどのようにプログラミングすれば良いのでしょうか?部分でも良いのでご指摘お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.2

参考にされているサイトは#1さんのおっしゃるとおり、Webページを作成するサンプルですので、リテラルコントロールのようにweb専用のコントロールはVBで使うことはできません。 literalコントロールはVBではlabelコントロールと類似しています。 違いとしてはスタイルシートに関するプロパティの有無です。 literalはWebページのデザインや基本設定を定義するスタイルシートに関するプロパティを持っていますが、labelにはないといったところです。 基本的には文字を表示したいというだけですのでほぼ同じものです。 サンプルを作ってみましたので掲載します。 フォームにLabelコントロールを追加してください。 内容がわからない場合はお礼欄に御質問ください。 Public Class Form1 '正解のボタンを表す変数を定義 Private Const QuestionCount As Integer = 5 Private Answer As Button Private QuestionNum() As Integer Private Question() As String = {"Web ブラウザと Web サーバーの間で Web ページなどをやり取りする際に用いられる通信プロトコルは?", _ "問2", "問3", "問4", "問5"} Private AnswerValue() As String = {"HTML,HTTP,XML,URL,1", "答え1,答え2,答え3,答え4,3", _ "答え1,答え2,答え3,答え4,3", "答え1,答え2,答え3,答え4,3", _ "答え1,答え2,答え3,答え4,3"} Private ButtonArray As New System.Collections.ArrayList Private NowQuestionNum As Integer = 0 Private Point As Integer = 0 Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonA.Click, ButtonD.Click, ButtonC.Click, ButtonB.Click ' 押されたボタンが正解のボタンかどうか調べる Dim senderButton As Button = DirectCast(sender, Button) ' 正解のボタンを赤くする Answer.BackColor = System.Drawing.Color.Red If senderButton.BackColor = System.Drawing.Color.Red Then MessageBox.Show("正解!!") Point += 1 Else MessageBox.Show("はずれ") End If Answer.BackColor = System.Drawing.SystemColors.Control If NowQuestionNum = QuestionCount - 1 Then MessageBox.Show(Point & "門正解です、お疲れ様でした。") End End If NowQuestionNum += 1 Call SetQuestion() End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load QuestionNum = GetRandoms(0, QuestionCount - 1) '配列にボタンを格納 ButtonArray.Add(Me.ButtonA) ButtonArray.Add(Me.ButtonB) ButtonArray.Add(Me.ButtonC) ButtonArray.Add(Me.ButtonD) Call SetQuestion() End Sub Private Sub SetQuestion() ' 問題文を設定する Label1.Text = "問" & StrConv(NowQuestionNum + 1, VbStrConv.Wide) TextBox1.Text = Question(QuestionNum(NowQuestionNum)) Dim Answers() As String = AnswerValue(NowQuestionNum).Split(",") ' 回答の選択肢を設定する For i As Integer = 0 To ButtonArray.Count - 1 ButtonArray(i).text = Answers(i) Next ' 正解のボタンを設定する Answer = ButtonArray(Answers(4)) End Sub Public Function GetRandoms(ByVal L As Integer, ByVal U As Integer) As Integer() 'LからUの範囲の重複の無い乱配列を返す。 Dim M As Integer Dim a() As Integer Dim i As Integer Dim N As Integer Dim V As Integer M = U - L ReDim a(M) For i = 0 To M a(i) = i + 1 Next Randomize() For i = M To 2 Step -1 N = Int(Rnd() * i) V = a(N) a(N) = a(i) a(i) = V Next For i = 0 To M a(i) = a(i) + L - 1 Next GetRandoms = a End Function End Class

test0821
質問者

お礼

ご回答ありがとうございます。 まず、リテラルとラベルについての解説ありがとうございます。 非常に分かりやすかったです。 この解説だけでも本当に有難かったのですが、わざわざサンプルまで本当にありがとうございます。 乱数の部分以外は丁寧なコメントを頼りに概ね読むことはできました。 そして、試しにサンプルプログラムをそのままコピーし、動かしてみました。わざわざ、正答数を数えて、終了後表示する部分まで用意していただきありがとうございます。 実行すると問題文は確かにランダムに変わっていったのですが、選択肢に関してはAnswerValueの0番目の要素から順に取り出されているようでした。 しばらく、回答の選択肢を設定する部分と問題文を設定する部分を見比べて、ここに何かあるんじゃないかなぁと見ていたのですが、どうしてもこれ!というところまで理解できません。 私の知識と理解力が不足しているため、具体的に分からないポイントも指すことができない状況です。 とりあえず、現在は問題文はランダムで出題されているのに、なぜ選択肢は要素の順番通りなのだろう、どうすればランダムな問題と対応させた選択肢になるのだろうか、という部分でモヤモヤしているところです。 この部分だけでもご回答をお願いしたいと思います。 よろしくお願い致します。

その他の回答 (2)

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.3

Private Question() As String = {"Web ブラウザと Web サーバーの間で Web ページなどをやり取りする際に用いられる通信プロトコルは?", _ "問2", "問3", "問4", "問5"} Private AnswerValue() As String = {"HTML,HTTP,XML,URL,1", "答え1,答え2,答え3,答え4,3", _ "答え1,答え2,答え3,答え4,3", "答え1,答え2,答え3,答え4,3", _ "答え1,答え2,答え3,答え4,3"} について説明すればもやもやも解消していただけることと思います。 配列に固定の文字列を設定しています。 今回はQuestionが問題文、AnswerValueが答えの組み合わせになります。 問題文と答えの組み合わせになりますのでどちらの変数も配列数が同じになるようにしてあります。 次は設定されている内容の説明です。 Questionは問題文がそのままの形で設定されています。 AnswerValueですが、ボタンAのTEXT,ボタンBのTEXT,ボタンCのTEXT,ボタンDのTEXT,答え(0~3,0=ボタンA,1=ボタンB) といった構成になっています。 StringクラスのSpritメソッドを使用して配列に,区切りで格納して使用しています。 その部分にご指摘のように間違いがありました。 TextBox1.Text = Question(QuestionNum(NowQuestionNum)) Dim Answers() As String = AnswerValue(NowQuestionNum).Split(",") となっていますが、同じでなければいけないはずのインデックスが異なっています。 QuestionはQuestionNum(NowQuestionNum) AnswerValueはNowQuestionNum これではだめですね。 Dim Answers() As String = AnswerValue(QuestionNum(NowQuestionNum)).Split(",") としなくてはいけませんでした。 NowQuestionNumは現在の出題数-1が記録されています。 QuestionNumは出題する順番が設定されている配列です。

test0821
質問者

お礼

回答ありがとうございます。 >配列に固定の文字列を設定しています。 今回はQuestionが問題文、AnswerValueが答えの組み合わせになります。 問題文と答えの組み合わせになりますのでどちらの変数も配列数が同じになるようにしてあります。 これは仮に変数が0の場合は1番最初の問題と1番最初の問題の選択肢が格納された部分を指すということになるんですよね。良く分かりました。 >AnswerValueですが、ボタンAのTEXT,ボタンBのTEXT,ボタンCのTEXT,ボタンDのTEXT,答え(0~3,0=ボタンA,1=ボタンB) といった構成になっています。 StringクラスのSpritメソッドを使用して配列に,区切りで格納して使用しています。 この部分も非常に分かりやすかったです。0~3とA~Dが対応して、4番目の部分に解答が格納されているわけですね。 そして、最後の説明ですが、問題と選択肢の変数のインデックスの値が違うためランダムな問題と選択肢が一致しなかったわけですね。 どの説明も非常に分かりやすく、とても参考になりました。 まだまだVBの構文やプログラム全般の知識が乏しいため、すべては理解できませんでしたが、今後プログラムを勉強しながら理解していきたいと思います。 今回は、細かな解説からサンプルプログラムまで本当にありがとうございました。 今後またお世話になることがあるかもしれませんが、その時はよろしくお願い致します。

回答No.1

リンク先の例題はaspなのでwindowフォームアプリとは別物ですが、質問者さんがやりたいことができているのであれば現状のままでもかまわないかと思います。 で・・・ >1.問題文を複数用意し、ランダムに出題する。(ランダムに出題するという機能は乱数を使えば実現できるのはなんとなく分かるのですが、実際のプログラムが分かりません。 乱数の生成 http://dobon.net/vb/dotnet/programing/random.html 問題(と答え)自体は仮に全部で10問だとして10個の要素を持ったString配列で定義(ファイルとかでもいいですけどね)。 生成した乱数のインデックス番号の問題を出題するようにする。このとき出題した番号を覚えておき、次の問題の乱数を生成したときに同じ番号だった場合乱数を生成しなおすようにする。 >2.用意した問題全てを解答したら終わり。 出題した乱数の数が問題の数(この場合10問)に達したら終了する。 という具合になるかと思います。

test0821
質問者

お礼

回答ありがとうございます。 リンク先を拝見し //-10から10の間の乱数を返す int i = r.Next(-10, 10); というサンプルを見つけ、乱数の生成の仕方は分かりました。 また、大まかな流れについての解説もありがとうございました。