2016-04-06 2 views
1

Я создаю приложение для викторины в vb6. У меня есть 5 вопросов, которые доступны в разных формах. Я рандомизирую эти формы/вопросы. Я добавляю каждый вопрос/форму в список каждый раз, когда он появляется. Как остановить рандомизацию, если эти 5 вопросов уже вызваны?Как остановить рандомизацию, если какое-либо условие выполнено

мой код:

Function randnum(ByVal lower As Integer, ByVal upper As Integer) As Integer 
randnum = Int((upper - lower + 1) * Rnd + lower) 
End Function 

Private Sub Command1_Click() 
Dim correct As Integer 
Dim correct1 As Integer 
Dim test As Boolean 
Dim i As Integer 
If Option3.Value = True Then 
Form3Score.Text1.Text = Val(Val(Form3Score.Text1.Text) + 1) 
Else 
Form3Score.Text3.Text = Val(Val(Form3Score.Text3.Text) + 1) 
End If 
Start: 
Randomize 
Select Case randnum(0, 4) 
Case 0 

    Form3q1.Show 
    Unload Form3q2 
    Unload Form3q3 
    Unload Form3q4 
    Unload Form3q5 
    Form3.Text1.Text = "Q1" 
    test = False 

    For i = 0 To Form3.List1.ListCount - 1 
    If Form3.Text1.Text = Form3.List1.List(i) Then 
    test = True 
    GoTo Start 
    End If 

    Next 

    If test = False Then 
    Form3.List1.AddItem ("Q1") 
    End If 
Loop 

Case 1 
Do Until (Val(Form3Score.Text3.Text) + Val(Form3Score.Text1.Text) = 5) 
    Form3q2.Show 
    Unload Form3q1 
    Unload Form3q3 
    Unload Form3q4 
    Unload Form3q5 
    Form3.Text1.Text = "Q2" 
    test = False 

    For i = 0 To Form3.List1.ListCount - 1 
    If Form3.Text1.Text = Form3.List1.List(i) Then 
    test = True 
    GoTo Start 
    End If 

    Next 

    If test = False Then 
    Form3.List1.AddItem ("Q2") 
    End If 
Loop 
Case 2 
Do Until (Val(Form3Score.Text3.Text) + Val(Form3Score.Text1.Text) = 5) 
    Form3q3.Show 
    Unload Form3q2 
    Unload Form3q1 
    Unload Form3q4 
    Unload Form3q5 
    Form3.Text1.Text = "Q3" 
    test = False 

    For i = 0 To Form3.List1.ListCount - 1 
    If Form3.Text1.Text = Form3.List1.List(i) Then 
    test = True 
    GoTo Start 
    End If 

    Next 

    If test = False Then 
    Form3.List1.AddItem ("Q3") 
    End If 
Loop 
Case 3 
Do Until (Val(Form3Score.Text3.Text) + Val(Form3Score.Text1.Text) = 5) 
    Form3q4.Show 
    Unload Form3q2 
    Unload Form3q3 
    Unload Form3q1 
    Unload Form3q5 
    Form3.Text1.Text = "Q4" 
    test = False 

    For i = 0 To Form3.List1.ListCount - 1 
    If Form3.Text1.Text = Form3.List1.List(i) Then 
    test = True 
    GoTo Start 
    End If 

    Next 

    If test = False Then 
    Form3.List1.AddItem ("Q4") 
    End If 
Loop 
Case 4 
Do Until (Val(Form3Score.Text3.Text) + Val(Form3Score.Text1.Text) = 5) 
    Form3q5.Show 
    Unload Form3q2 
    Unload Form3q3 
    Unload Form3q4 
    Unload Form3q1 
    Form3.Text1.Text = "Q5" 
    test = False 

    For i = 0 To Form3.List1.ListCount - 1 
    If Form3.Text1.Text = Form3.List1.List(i) Then 
    test = True 
    GoTo Start 
    End If 

    Next 

    If test = False Then 
    Form3.List1.AddItem ("Q5") 
    End If 

End Select 

End Sub 
+0

п.п. пренебречь петлей do. я попробовал, но не работал –

ответ

0

Вы можете сделать это гораздо легче, только с одной формы, и сократить существующий код примерно на 80%, в то время как вы на него.

Поместите каждый из своих вопросов (то есть содержимое каждой из существующих форм) в отдельный кадр. (Лучший способ сделать это выделить все элементы в форме, выбрать фрейм - обязательно сделайте это - и нажмите «Вставить»). Сделайте кадры управляющим массивом (дайте им то же имя, установите свойство Index из 0 до 4). Чтобы показать заданный вопрос, вы сделаете его видимым и сделаете все остальные рамки невидимыми. Начните со всех 5 кадров невидимым.

Теперь сделайте динамический (то есть изменяемый размер) массив (я буду называть его здесь: Dim x() as Integer:ReDim x(0) инициализирует его, поместите два оператора на отдельные строки, а не разделите их на двоеточие, как я его здесь). Это будет содержать значения вопросов, которые уже заданы.

Чтобы получить тестовый вопрос, сначала получите случайное число от 0 до 4. Добавьте элемент в x (ReDim Preserve x(UBound(x)+1)). Сохраните значение в добавленном элементе (используйте x(UBound(x))=yourRandomNumber), который будет оцениваться последним элементом в массиве). В первый раз сделайте кадр с индексом, который совпадает с вашим текущим случайным числом.

В последующих вопросах получите случайное число, как раньше. Затем переместите x и посмотрите, уже ли это значение (for i = 0 to UBound(x) и т. Д.). Если это так, получите еще одно случайное число. Когда вы получите тот, который уже не в массиве x, сделайте предыдущий кадр невидимым (найдите индекс предыдущего кадра в x-- x(UBound(x)-1) - или выполните итерацию всего массива кадров и сделайте каждый из них невидимым), и сделайте кадр с индексом, который совпадает с текущим случайным числом.

Промойте и повторите, пока вы не задали все 5 вопросов (UBound(x)=4, как только вы их попросите). (Примечание: примеры использования UBound могут быть не идеальными, поскольку я не полностью их протестировал, но, если вы немного экспериментируете, вы должны иметь возможность выработать любые ошибки, которые я, возможно, сделал. UBound оценивает количество наивысший элемент массива.)

Смежные вопросы