2016-12-03 2 views
0

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 
+2

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

+0

@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

+0

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

Antwort

1

132 Reihen mit jeweils 5 Kandidatenfragen sind eine Art seltsamer Art, sie zu speichern. Ich vermute, dass es im Prinzip 5 Wege gibt, die gleiche Frage zu stellen, oder sie haben zumindest die gleiche richtige Antwort.

Ich kann nicht sicher sein, aber es scheint, dass es sicher genug wäre, eine andere Reihe jedes Mal auszuwählen.

Public Class frmQuizzer 

    ' form level variables 
    Private RNG As New Random() 
    Private rowNums As Int32() 
    Private rowIndex As Int32 

Ich rate, dass ein Spiel oder eine Runde 10 Fragen sein wird. Also, in einem NewGame Verfahren (so können Sie es erneut ausführen, ohne die Anwendung neu starten):

' which row to use this turn 
rowIndex = 0 
rowNums = Enumerable.Range(3, 135). 
      OrderBy(Function(r) RNG.Next()). 
      Take(10). 
      ToArray() 

Das ist Ihre 10 verschiedene XL Reihen zu verwenden. Sie können auch die Zelle mit dem RNG-Objekt auswählen:

key = RNG.Next(3,8)   ' the MAX is exclusive! 
row = rowNums(rowIndex) 
' "move" to next question 
rowIndex += 1 
lblquestion.Text = worksheet.Cells(row, key).Value 

persönlich, anstatt ein rowIndex Tracking, die bis bekommen messed können, könnte ich ein Stack verwenden, die wie ein Bootsschuh handeln up“Zeile„Verwendung“ Zahlen:

Private rowNums As Stack(Of Int32) 

es aus dem Array erstellt, geben sie bitte:

Dim nums = Enumerable.Range(3, 135). 
      OrderBy(Function(r) RNG.Next). 
      Take(10). 
      ToArray() 
rowNums = New Stack(Of Int32)(nums) 

ein Holen und es verwenden:

' Pop gets the next value and removes it from the list 
lblquestion.Text = worksheet.Cells(rowNums.Pop(), key).Value 

Kein Indexer zu verfolgen und keine Chance, dass es aus der Synchronisation kommt.

Mehr

+0

die ich jetzt verstehe. Danke – Purin

Verwandte Themen