0

I am making a quiz for my computer science class and the basic concept is that you have 15 keywords and 15 definitions. All need to be randomly displayed and the correct answer has to appear. The user has to match the correct definition to the keyword twice and then that keyword and definition are not displayed again. When all have been answered twice the quiz is over.

I have stored both my keywords and my definitions in the same file so they don't get out of sync. The text file looks like so:

Keyword1,Definition1
Keyword2,Definition2
Keyword3,Definition3
...

The code I have works perfectly. This is my code:

Answer Class:

Public Class Answer
Public Answer As String
Public Answered As Boolean

End Class

My main form (sorry about the comments, just for me to remember):

Public Class Form1
Private kv As Dictionary(Of String, Answer) 'Define kv as a dictionary
Private keyword As String
Private correctDefinition As String
Const NUMBER_OF_ANSWERS As Integer = 3 'Define the constant NUMBER_OF_ANSWERS




Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    'The text file is structured like so:
    'Keyword1,Definition1
    'Keyword2,Definition2
    'Keyword3,Defintion3
    '...
    'This makes sure that the keywords and the definitions do not get out of sync when randomising, as a dictionary is a key-value data structure. Call the key, get the right value etc.
    kv = New Dictionary(Of String, Answer) 'kv = a new dictionary
    For Each line As String In IO.File.ReadAllLines("C:\Users\Matt\Documents\keywords.txt") 'Foreach loop populating the dictionary from the text file
        Dim parts() As String = line.Split(",") 'Split the Keywords from the definitions where the , is
        kv.Add(parts(0), New Answer With {.Answer = parts(1), .Answered = False}) 'Add the two parts (Keyword and Definition) to the Parts with the Answer class
    Next

    Dim r As New Random 'Define r as new random
    Dim kvRandom As List(Of KeyValuePair(Of String, String)) =
      kv.OrderBy(Function() r.Next) _
.Select(Function(x) New KeyValuePair(Of String, String)(x.Key, x.Value.Answer)) _
.ToList() 'A Select method to convert the items in the list properly

    'questions will appear in random order
    For Each line As KeyValuePair(Of String, String) In kvRandom
        Dim keyword As String = line.Key
        Dim correctDefinition As String = line.Value 'Checks that the correct definition will be displayed when its keyword is randomly displayed.

        'Define keywords as a new list
        Dim keywords As New List(Of String)
        keywords.Add(keyword) 'Adds the keyword to the list as the Part(0) from the text file in the first loop
        keywords.AddRange(kv.Keys.Except({keyword}).
          OrderBy(Function() r.Next).Take(NUMBER_OF_ANSWERS - 1))

        Dim definitionsRandom As List(Of String) =
          keywords.Select(Function(x) kv(x).Answer).OrderBy(Function() r.Next).ToList 'Define definitionsRandom as a list. Checks against correctDefinition to know to always display the correct answer as one of the 
        'random definitions

        LabelKeyword.Text = keyword 'Randomly display a keyword
        RadioButtonDef1.Text = definitionsRandom(0) 'Randomly display a definition. Checks against correctDefinition to see make sure one definition is always the right answer.
        RadioButtonDef2.Text = definitionsRandom(1) 'Randomly display a definition. Checks against correctDefinition to see make sure one definition is always the right answer.
        RadioButtonDef3.Text = definitionsRandom(2) 'Randomly display a definition. Checks against correctDefinition to see make sure one definition is always the right answer.
    Next

End Sub

Private Sub ButtonNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonNext.Click
    If (RadioButtonDef1.Checked And RadioButtonDef1.Text = correctDefinition) Or (RadioButtonDef2.Checked And RadioButtonDef2.Text = correctDefinition) Or (RadioButtonDef3.Checked And RadioButtonDef3.Text = correctDefinition) Then
        If kv(keyword).Answered Then
            kv.Remove(keyword)
        Else
            kv(keyword).Answered = True
        End If
    End If
End Sub
End Class

The issue I am having is that when the user answers the question correctly, I need the keywords and the definitions to randomize again. However when the correct definition is answered it stays the same.

So how can I make it randomize again on buttonNext_click? As the aim is for the user to match each keyword to its correct definition twice for the quiz to be over.

What I am asking (to be clearer):

  1. How can I make it so that the keywords and definitions randomize again on buttonNext_click and display a message box if the answer was wrong telling them that it was wrong and a messagebox if the answer was right telling them that it was right. My wish is to have the next random when they click the message box OK button.

I don't want to reload the form as since the user has to match each keyword to its definition twice I keep track with the Answer class and when there are no questions left, the quiz ends.

Any help will be greatly appreciated.

Andrew Morton
  • 24,203
  • 9
  • 60
  • 84
Matt Kent
  • 1,145
  • 1
  • 11
  • 26
  • 2
    Have you thought about moving the code which does the randomisation into a separate method? That way, you can call it as required. – Andrew Morton Mar 05 '14 at 20:56
  • you also probably want to shuffle them so that the same word-def pair doesnt come up 2ce in a 'round' ([as per this previous](http://stackoverflow.com/q/22150900/1070452)) – Ňɏssa Pøngjǣrdenlarp Mar 05 '14 at 21:45
  • You certainly need a Subroutine to randomize the words since it will be called multiple times. So I'd start there. – John Mar 05 '14 at 22:53

0 Answers0