2017-09-29 1 views
0

Ich mache ein Quiz, das 3 Schwierigkeiten hat. Für jede Schwierigkeit muss eine unterschiedliche Anzahl an Antworten verfügbar sein.VB.net Konsole Zufällige Antwort Position

So müssen einfach Antworten haben, mittel Antworten haben müssen und hart Antworten haben muss.

Ich brauche einen Weg, um die Antwort Position randomisieren so zum Beispiel, wenn es leicht Schwierigkeit ist, gäbe es nur Antworten sein (von denen die richtigen sein) oder wenn es schwer Schwierigkeiten es würde Antworten geben, von denen eine richtig ist.

Hinweis:

Frage, Richtige Antwort, Andere Antwort, Andere Antwort, Andere Antwort

Die Richtig: Die Fragen und Antworten wurden aus einer CSV-Datei mit einer Struktur gelesen Antwort ist immer an der zweiten Stelle der Zeile in der CSV-Datei, so in meinem Array wäre es Fragen (1).

Mein aktueller Code ist:

Dim topic as String = "music" ' <- An example topic for the quiz 
Dim filereaderq As New StreamReader(topic & ".csv", True) 
    While filereaderq.EndOfStream = False 
     questions = filereaderq.ReadLine.Split(",") 

     If difficulty.ToLower = "easy" Or difficulty = "1" Then 
      ansnum = 2 
      difficulty = "e" 
     ElseIf difficulty.ToLower = "medium" Or difficulty = "2" Then 
      ansnum = 3 
      difficulty = "m" 
     ElseIf difficulty.ToLower = "hard" Or difficulty = "3" Then 
      ansnum = 4 
      difficulty = "h" 
     End If 

     ' Random Number 
     Dim answerc As New List(Of Integer) 
     answerc.Add(0) 

     or i = 0 To ansnum 
      Dim ok As Boolean = False 
      Do 
       Dim num As Integer = Int((ansnum * Rnd()) + 1) 
       If answerc.Contains(num) Then 
        ok = False 
       Else 
        ok = True 
        answerc.Add(num) 
       End If 
      Loop Until ok 
     Next 

     Console.WriteLine("----------------------------") 
     Console.WriteLine("Q" + CStr(qnum) + ". " + questions(0)) 
     qnum = qnum + 1 
     Console.WriteLine("") 

     If difficulty = "e" Then 
      Console.WriteLine("1. " + questions(answerc(1))) 
      Console.WriteLine("2. " + questions(answerc(2))) 
     ElseIf difficulty = "m" Then 
      Console.WriteLine("1. " + questions(answerc(1))) 
      Console.WriteLine("2. " + questions(answerc(2))) 
      Console.WriteLine("3. " + questions(answerc(3))) 
     ElseIf difficulty = "h" Then 
      Console.WriteLine("1. " + questions(answerc(1))) 
      Console.WriteLine("2. " + questions(answerc(2))) 
      Console.WriteLine("3. " + questions(answerc(3))) 
      Console.WriteLine("4. " + questions(answerc(4))) 
     End If 

     Console.WriteLine("----------------------------") 
     Console.Write("Answer Number: ") 
     ansnum = Console.ReadLine() 

     If answerc(0) = ansnum Then 
      score = score + 1 
     Else 
      score = score 
     End If 

    End While 

Bitte beachten Sie, dass Schwierigkeit und Thema sind beide Benutzer eingegebene Zeichenfolgen, die zuvor erklärt wurden.

Mein Problem ist die Tatsache, dass, wenn ich einfache Schwierigkeit zum Beispiel wählen sollte, die richtige Antwort nicht eine der zwei ausgegebenen Antworten sein würde. Ich muss sicherstellen, dass die richtige Antwort immer ausgegeben wird und die anderen Antworten werden zufällig sein.

Vielen Dank für Ihre Hilfe.

Ich bin nicht sehr Erfahrung, wenn es um die Codierung geht, also entschuldige ich mich für Fehler, die ich gemacht habe, die dumm sind.

+1

Sie müssen die FAQ dieser Seite lesen, wie Sie eine Frage stellen können. Wir werden Ihnen mit Code helfen, der nicht funktioniert, aber wir werden Ihren Code nicht für Sie schreiben. –

+0

@SamAxe Ich habe meine Frage bearbeitet, können Sie, wenn möglich, Hilfe anbieten? – Flame7427

+0

@LarsTech Ich habe jetzt, tut mir leid, dass – Flame7427

Antwort

0

Versuchen:

Dim answerc = Enumerable.Concat({ 0 }, Enumerable.Range(2, 3).Take(ansnum - 1).OrderBy(Function (x) Rnd()).Concat({ 1 }).OrderBy(Function (x) Rnd())).ToList() 

wo Sie ansnum - 1 falsche Antworten wollen. Dies garantiert die richtige Antwort, einschließlich ansnum - 1 zufällige falsche Antworten, und dann mische alle Antworten.

+0

Wie kann ich angeben, wie viele falsche Antworten ich möchte? Versuchte die Ganzzahl, die zuvor deklariert wurde, aber diese Nachricht erhalten: ** Wert des Typs 'Liste (Of String)' kann nicht in 'List (Of Integer)' konvertiert werden ** – Flame7427

+0

@ Flame7427 - Sie haben nicht angegeben, was 'answerFromCsv' (der Name, den ich gewählt habe) ist und welcher Typ es ist. Sie müssen eine [mcve] angeben, um eine spezifischere Antwort zu erhalten. Trotzdem gibt der Wert "n" in meiner Antwort vor, wie viele falsche Antworten Sie erhalten. – Enigmativity

+0

Ich habe den Code auf die Minimal aktualisiert – Flame7427

0

OK, hier ist ein Code, der die richtige Antwort enthält und nach dem Zufallsprinzip die falschen Antworten und die Reihenfolge, in der sie angezeigt werden, auswählt.

Private Sub Quiz(strMode As String) 
     Dim arrQuiz As String() = {"Question", "Correct Answer", "Wrong Answer1", "Wrong Answer2", "Wrong Answer3"} 
     Dim intIndex As Integer 
     Dim lstWrongAnswers As New List(Of String) 
     Dim lstAllAnswers As New List(Of String) 
     Dim strAnswerChoice As String = arrQuiz(1) 
     lstWrongAnswers.Add(arrQuiz(2)) 
     lstWrongAnswers.Add(arrQuiz(3)) 
     lstWrongAnswers.Add(arrQuiz(4)) 
     lstAllAnswers.Add(arrQuiz(1)) 
     Randomize() 'Before calling Rnd, use the Randomize statement without argument to initialize the 
     '   Random-Number generator with a seed based on the system timer. 

     Select Case strMode 
      Case "Easy" 
       'Choose 1 wrong answer 
       intIndex = CInt(Int(lstWrongAnswers.Count * Rnd())) 
       'select a ramdom index using the Count method of the List 
       lstAllAnswers.Add(lstWrongAnswers.Item(intIndex)) 
       'The Rnd function returns a value less than 1, but greater than or equal to zero. 
       intIndex = CInt(Int(lstAllAnswers.Count * Rnd())) 
       'Int returns the integer portion of the number (always rounds down) 
       Dim FirstDisplayAnswer As String = lstAllAnswers.Item(intIndex) 
       lstAllAnswers.RemoveAt(intIndex) 
       Dim SecondDisplayAnswer As String = lstAllAnswers.Item(0) 
       MessageBox.Show($"The Question is {arrQuiz(0)}{vbCrLf}The first choice is {FirstDisplayAnswer}{vbCrLf}The second choice is {SecondDisplayAnswer}") 
      Case "Medium" 
       'choose 2 wrong answers 
       intIndex = CInt(Int(lstWrongAnswers.Count * Rnd())) 
       'Option Strict is not satisfied with Int, It requires CInt so I need both 
       lstAllAnswers.Add(lstWrongAnswers.Item(intIndex)) 
       'use the Item method of the List to retrieve the value at that index 
       lstWrongAnswers.RemoveAt(intIndex) 
       intIndex = CInt(Int(lstWrongAnswers.Count * Rnd())) 
       lstAllAnswers.Add(lstWrongAnswers.Item(intIndex)) 
       intIndex = CInt(Int(lstAllAnswers.Count * Rnd())) 
       Dim FirstAnswer As String = lstAllAnswers.Item(intIndex) 
       lstAllAnswers.RemoveAt(intIndex) 
       intIndex = CInt(Int(lstAllAnswers.Count * Rnd())) 
       Dim SecondAnswer As String = lstAllAnswers.Item(intIndex) 
       lstAllAnswers.RemoveAt(intIndex) 
       intIndex = CInt(Int(lstAllAnswers.Count * Rnd())) 
       Dim ThirdAnswer As String = lstAllAnswers.Item(intIndex) 
       MessageBox.Show($"Question is {arrQuiz(0)}{vbCrLf}a: {FirstAnswer}{vbCrLf}b: {SecondAnswer}{vbCrLf}c: {ThirdAnswer}") 
      Case "Difficult" 
       'shuffle all answers 
       Dim arrDisplay(3) As String 
       lstAllAnswers.Add(arrQuiz(2)) 
       lstAllAnswers.Add(arrQuiz(3)) 
       lstAllAnswers.Add(arrQuiz(4)) 
       For x As Integer = 0 To 3 
        intIndex = CInt(Int(lstAllAnswers.Count * Rnd())) 
        arrDisplay(x) = lstAllAnswers.Item(intIndex) 
        lstAllAnswers.RemoveAt(intIndex) 
       Next 
       MessageBox.Show($"{arrQuiz(0)}{vbCrLf}a: {arrDisplay(0)}{vbCrLf}b: {arrDisplay(1)}{vbCrLf}c: {arrDisplay(2)}{vbCrLf}d: {arrDisplay(3)}") 
      Case Else 
        '?? 
     End Select 

    End Sub 
Verwandte Themen