Mein Programm gibt dem Benutzer ein Quiz basierend auf einer Excel-Datei. Die Fragen erscheinen in zufälliger Reihenfolge. Es gibt 5 mögliche Fragen in jeder Zeile der Excel-Datei (n, 3-7) und die Antwort befindet sich immer in der zweiten Zelle dieser Zeile (n, 2). Es gibt 135 Zeilen, aber die ersten beiden Zeilen haben keine Beziehung zu den Fragen. Der Benutzer bekommt einen Punkt, um die Frage richtig zu beantworten, und sie sollten versuchen, so viele Fragen wie möglich innerhalb des Zeitlimits zu beantworten. Wenn die Zeit abgelaufen ist, wird der Benutzer nie mehr die ungefragten Fragen sehen. Das Problem, mit dem ich Hilfe brauche, ist, dass es eine seltene Chance gibt (1 in 665), dass eine Frage wiederholt werden könnte. Wie kann ich das verhindern? (Auch ich bin sehr neu in die Programmierung)Eine zufällige Excel-Zelle lesen, die noch nicht gelesen wurde
-Code für die Frage Generation
Private Sub newquestion()
'New Question
Randomize()
row = CInt(rnd.Next(3, 135))
key = CInt(rnd.Next(3, 7))
lblgametype.Text = "Guess the answer from the hint"
lblquestion.Text = worksheet.Cells(row, key).Value
End Sub
-Code für die Überprüfung der Antwort
Private Sub OnKeyDownHandler(ByVal sender As Object, ByVal e As KeyEventArgs) Handles txtanswer.KeyDown
'Prevent that annoying ass windows ding sound
If e.KeyCode = Keys.Enter Then
e.SuppressKeyPress = True
End If
If e.KeyCode = Keys.Escape Then
e.SuppressKeyPress = True
End If
If e.KeyCode = Keys.Enter Then 'If the user presses Enter while txtanswer is selected...
userguess = txtanswer.Text 'Assign the text the user enters to the global userguess variable
If userguess.ToUpper = worksheet.Cells(row, 2).Value.ToString.ToUpper Then
'User answers a question correct
lblcorrect.ForeColor = Color.Green
lblcorrect.Text = "Correct. +1"
txtanswer.Text = ""
userguess = ""
abilityscore += 1
lblscore.Text = "Score: " & abilityscore
If abilityscore > abilityhighscore Then
abilityhighscore = abilityscore
End If
newquestion()
Else
'User answers a question incorrectly
lblcorrect.ForeColor = Color.Red
lblcorrect.Text = "incorrect."
txtanswer.Text = ""
End If
End If
If e.KeyCode = Keys.Escape Then 'If the user presses escape while txtanswer is selected...
btnskip.PerformClick() 'Treat it as if they pressed skip
End If
End Sub
-Code für Frage überspringen
Private Sub btnskip_Click(sender As Object, e As EventArgs) Handles btnskip.Click
Me.TargetDT = Me.TargetDT.Subtract(TimeSpan.FromSeconds(15)) 'Subtract 15 seconds from the timer
txtanswer.Focus() 'Reset focus back to the textbox
newquestion()
End Sub
Das Problem ist, dass zufällige bedeutet nicht eindeutig. Sie benötigen eine Zufallsauswahl: siehe [Wählen Sie eindeutige Zufallszahlen] (http: // stackoverflow.com/q/35120454/1070452) – Plutonix
@Plutonix Ich habe deine Antwort auf die Frage dieses Typen gelesen und ich glaube, dass die Antwort, die ich suche, im Abschnitt "Random Pairs" dieser Antwort ist. Ich habe noch nie zuvor Listen oder Arrays verwendet. Können Sie mir zeigen, wie das für meinen Code aussehen würde? Danke auch für deine Hilfe. – Purin
Wenn Sie quiz waren 5 Fragen: 'rowNums = Enumerable.Range (3, 135) .OrderBy (Funktion (R) RNG.Next()). Nehmen Sie (5) .ToArray()', die alle 5 xl Zeilennummern enthalten für dieses Spiel. die Paar-Sache wäre für ein Konzentrationsspiel. 'RNG' wäre ein NET' Random' Objekt, nicht die Legacy VB 'Rnd' Funktion – Plutonix