2016-04-06 10 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

plsはdoループを無視します。私はそれを試みたが、機能していない –

答えて

0

あなただけの一つの形ではるかに簡単にこれを行うと、あなたはそれでいる間約80%で既存のコードを縮小することができます。

それぞれの質問(つまり、既存の各フォームの内容)を別々のフレームに入れます。 (これを行う最善の方法は、フォーム上のすべての要素をハイライトすることです。フレームを選択します。これを確実に実行し、貼り付けを押します。)フレームをコントロール配列にします(同じ名前を付け、Indexプロパティを0〜4)。特定の質問を表示するには、それを表示させ、他のすべてのフレームを非表示にします。 5つのフレームはすべて目に見えない状態から始めます。

ここでは、動的(すなわちサイズ変更可能な)配列を作成します(ここではDim x() as Integer:ReDim x(0)は初期化します;ここではコロンで区切るのではなく2つのステートメントを別々の行に置きます)。これは既に質問されている質問の値を保持します。

は、最初のx( ReDim Preserve x(UBound(x)+1))に要素を追加0と4の間の乱数を取得し、テストの質問を取得します。新しく追加された要素(値 x(UBound(x))=yourRandomNumber)に値を格納します。この値は配列の最後の要素になります。最初に、現在の乱数と同じインデックスのフレームを表示します。

以降の質問では、以前と同じように乱数を取得してください。次に、xを繰り返して、値がすでにあるかどうかを確認します(for i = 0 to UBound(x)など)。そうであれば、別の乱数を取得します。既に配列xにないものを取得したら、直前のフレームを非表示にする(x-- x(UBound(x)-1)の前のフレームのインデックスを参照するか、フレーム配列全体を反復してそれぞれを不可視にする)、フレームを作る表示されている現在の乱数と同じインデックスが使用されます。すべての5つの質問を求めてきましたまで

リンスと繰り返し(あなたがそれらすべてを求めてきました一度UBound(x)=4)。 (注:UBoundを使用する方法の例は完全にはテストされていないので完璧ではないかもしれませんが、少し実験すると間違いを解消できるはずです。最も高い配列要素です)。

関連する問題