簡體   English   中英

如何在vbnet上隨機化測驗

[英]How to randomize a quiz on vbnet

我是Visual Basic編程的新手,一切都很好,直到我們的主題轉向數組為止。 我試圖用Java理解它的代碼。 (示例:方法稱為函數..。)

我的教授為我們提供了一個練習,以創建一個Quiz程序,該程序向用戶詢問5個以上的問題(在文本框中),並帶有選擇項(在按鈕中),最后計算分數(全部以一種形式)。 如果用戶單擊一個按鈕,它將告訴您是對還是錯,然后繼續更改問題以及選擇。

*必需:-用戶完成測驗后,將顯示分數,並且應該有一個重新啟動按鈕,並且所有問題將再次隨機無模式詢問。 -嘗試使功能。

從昨天開始,我嘗試在網上搜索,但是我的代碼仍然沒有任何進展。

Public Class Form1
    Dim questions(5) As String
    Dim answers(5) As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Method/Function for loading the Q&A
        loadQsAndAs()
    End Sub
    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        Me.Close()
    End Sub

    Private Sub loadQsAndAs()
        'Questions
        questions(0) = "What is 1 + 1?"
        questions(1) = "Who is the first man to walk on the Moon?"
        questions(2) = "What is the name of the main character in the movie: Yes Man! (2007)"
        questions(3) = "If I gave you three apples and you ate two, how many is left?"
        questions(4) = "What do you want in your final grade?"
        questions(5) = "What is the name of the thing(s) that you use whenever you eat?"
        'Answers
        answers(0) = "2"
        answers(1) = "Neil Armstrong"
        answers(2) = "Jim Carrey"
        answers(3) = "1"
        answers(4) = "A 4.0"
        answers(5) = "A Spoon and Fork"

        TextBox1.Text = setTheQuestion()
        Button1.Text = setTheAnswer1()
        Button2.Text = setTheAnswer2()
        Button3.Text = setTheAnswer3()
        Button4.Text = setTheAnswer4()

    End Sub

    Private Function setTheQuestion() As String
        Dim randomValue As New Random
        Dim randomQ As String = ""
        Dim i As Integer
        Dim index As Integer

        For i = 0 To 0
            index = randomValue.Next(0, questions.Length)
            randomQ &= questions(index)
        Next
        Return randomQ
    End Function

    Private Function setTheAnswer1() As String
        Dim randomValue As New Random
        Dim randomAns As String = ""
        Dim i As Integer
        Dim index As Integer

        For i = 0 To 0
            index = randomValue.Next(0, answers.Length)
            randomAns &= answers(index)
        Next

        Return randomAns
    End Function

    Private Function setTheAnswer2() As String
        Dim randomValue As New Random
        Dim randomAns As String = ""
        Dim i As Integer
        Dim index As Integer

        For i = 0 To 0
            index = randomValue.Next(1, answers.Length)
            randomAns &= answers(index)
        Next

        Return randomAns
    End Function

    Private Function setTheAnswer3() As String
        Dim randomValue As New Random
        Dim randomAns As String = ""
        Dim i As Integer
        Dim index As Integer
        For i = 0 To 0
            index = randomValue.Next(2, answers.Length)
            randomAns &= answers(index)
        Next

        Return randomAns
    End Function

    Private Function setTheAnswer4() As String
        Dim randomValue As New Random
        Dim randomAns As String = ""
        Dim i As Integer
        Dim index As Integer

        For i = 0 To 0
            index = randomValue.Next(3, answers.Length)
            randomAns &= answers(index)
        Next

        Return randomAns
    End Function

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As  System.EventArgs) Handles Button6.Click
        loadQsAndAs()
    End Sub
End Class
Public Class Form1
Dim questions As New ArrayList
Dim answers As New ArrayList
Dim dtQAMain As New DataTable
Dim questionsCopy As New ArrayList
Dim alAnsButton As New ArrayList 'arraylist to store all answer button.
Dim totalScore As Integer


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles MyBase.Load
    'Method/Function for loading the Q&A
    alAnsButton.Add(Button1)
    alAnsButton.Add(Button2)
    alAnsButton.Add(Button3)
    alAnsButton.Add(Button4)

    loaddtQA()
    loadQsAndAs()
End Sub

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles Button5.Click
    Me.Close()
End Sub

Private Sub loaddtQA()
    dtQAMain = New DataTable
    dtQAMain.Columns.Add("Q")
    dtQAMain.Columns.Add("A")

    For i = 0 To 5
        questions.Add("")
        answers.Add("")
    Next

    'Questions
    questions(0) = "What is 1 + 1?"
    questions(1) = "Who is the first man to walk on the Moon?"
    questions(2) = "What is the name of the main character in the movie: Yes Man!(2007)"
    questions(3) = "If I gave you three apples and you ate two, how many is left?"
    questions(4) = "What do you want in your final grade?"
    questions(5) = "What is the name of the thing(s) that you use whenever you eat?"
    'Answers
    answers(0) = "2"
    answers(1) = "Neil Armstrong"
    answers(2) = "Jim Carrey"
    answers(3) = "1"
    answers(4) = "A 4.0"
    answers(5) = "A Spoon and Fork"

    For i = 0 To questions.Count - 1
        dtQAMain.Rows.Add(questions(i), answers(i)) 'assign QA in table for scoring purpose later
    Next
End Sub
Private Sub loadQsAndAs()
    Label1.Visible = False
    For i = 0 To alAnsButton.Count - 1
        alAnsButton(i).visible = True
    Next
    questionsCopy = New ArrayList
    questionsCopy = questions.Clone 'close a copy so we dont effect the actual question copy when randomize and eliminate asked question from arraylist
    TextBox1.Text = setTheQuestion()
    setTheAnswer()
End Sub

Private Function setTheQuestion() As String

    Dim randomValue As New Random
    Dim randomQ As String = ""
    Dim index As Integer
    If questionsCopy.Count <> 0 Then
        index = randomValue.Next(0, questionsCopy.Count - 1)
        randomQ = questionsCopy(index)
        questionsCopy.RemoveAt(index) 'asked question will be remove.

    Else ' questions are finished, show the mark
        ShowMark()
    End If

    Return randomQ

End Function

Private Sub setTheAnswer() 'randonmize the answer and assign to button

    If TextBox1.Text = "" Then Exit Sub ' if question finish exit sub
    Dim randomValue As New Random
    Dim NewIndex As Integer
    Dim temp As String
    Dim answersCopy As ArrayList = answers.Clone
    For n = answersCopy.Count - 1 To 0 Step -1
        NewIndex = randomValue.Next(0, n + 1)
        ' Swap them.
        temp = answersCopy(n)
        answersCopy(n) = answersCopy(NewIndex)
        answersCopy(NewIndex) = temp
    Next

    Dim AnswerRowCheck As Integer = questions.IndexOf(TextBox1.Text)
    Dim ActualAnswer As String = dtQAMain.Rows(AnswerRowCheck).Item("A") 'check actual answer
    Dim totalRemove As Integer = 0
    For i = answersCopy.Count - 1 To 0 Step -1
        If totalRemove = 2 Then Exit For
        If answersCopy(i) <> dtQAMain.Rows(AnswerRowCheck).Item("A") Then
            answersCopy.RemoveAt(i)
            totalRemove += 1
        End If
    Next 'remove 2 of the selection,since only 4 button for answer selection and should not take out the actual answer


    For i = 0 To alAnsButton.Count - 1
        alAnsButton(i).text = answersCopy(i)
    Next

End Sub
Private Sub ShowMark()
    For i = 0 To alAnsButton.Count - 1
        alAnsButton(i).text = "" 'clear the text, no more input receive from user.
    Next
    Label1.Visible = True
    Label1.Text = totalScore & " out of 6 are correct."
End Sub

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    totalScore = 0
    loadQsAndAs() 'refresh question
End Sub

Private Sub Button4_MouseClick(sender As Object, e As MouseEventArgs) Handles Button4.MouseClick, Button3.MouseClick, Button2.MouseClick, Button1.MouseClick
    If sender.text = "" Then Exit Sub
    Dim AnswerRowCheck As Integer = questions.IndexOf(TextBox1.Text) 'search question number 
    If dtQAMain.Rows(AnswerRowCheck).Item("A") = sender.text Then 'checking answer 
        totalScore += 1
    End If
    TextBox1.Text = setTheQuestion() 'next question
    setTheAnswer()
End Sub
End Class

該代碼涵蓋了大多數必要的注釋,包括思想及其工作方式。 Random()和arraylist是該程序起作用的關鍵,只是要多加注意。 祝好運。

嘗試一下呢?

Public Class Form1

    Dim questions(5) As String
    Dim answers(5) As String

    Private Sub loadQsAndAs()
        'Questions
        questions(0) = "What is 1 + 1?"
        questions(1) = "Who is the first man to walk on the Moon?"
        questions(2) = "What is the name of the main character in the movie: Yes Man! (2007)"
        questions(3) = "If I gave you three apples and you ate two, how many is left?"
        questions(4) = "What do you want in your final grade?"
        questions(5) = "What is the name of the thing(s) that you use whenever you eat?"
        'Answers
        answers(0) = "2"
        answers(1) = "Neil Armstrong"
        answers(2) = "Jim Carrey"
        answers(3) = "1"
        answers(4) = "A 4.0"
        answers(5) = "A Spoon and Fork"

        Dim random As New Random
        Dim indices = { 0, 1, 2, 3, 4, 5 }.OrderBy(Function (n) random.Next()).ToArray()
        Dim question = random.Next(questions.Length - 1)

        TextBox1.Text = questions(indices(question))

        Button1.Text = answers(indices(0))
        Button2.Text = answers(indices(1))
        Button3.Text = answers(indices(2))
        Button4.Text = answers(indices(3))

    End Sub

End Class

而已。 漂亮又簡單。 關鍵技巧是創建一個隨機indices數組,以對questionsanswers數組進行查找。

Private Dim rnd As Integer

Private Function setTheQuestion() As String
    rnd = (CInt(Math.Ceiling(Rnd() * questions.Length)) + 1)
    Return questions(rnd)
End Function

Private Function setTheAnswer1() As String
    Return answers(rnd)
End Function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM