Jaką funkcje zastosować?

Witam.

 

Mam 6 kwadratów które zmieniają losowo kolor  czerwony/zielony

Potrzebuję funkcji która wykona się tylko wtedy gdy zielony będzie 1 z nich. oraz

Jeśli jest taka możliwość uproszczenie losowości timerów.

(Np tak żeby zmieścić to w 1 timerze nie 6)

 

Kod:

Public Class Form1



    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        LosPic_1.Start()
        LosPic_2.Start()
        LosPic_3.Start()
        LosPic_4.Start()
        LosPic_5.Start()
        LosPic_6.Start()


    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles LosPic_1.Tick

        Dim ccc As Integer
        Dim xxx As Color

        ccc = CInt(Int((2 * Rnd()) + 1))

        If ccc = 1 Then
            xxx = Color.Lime
        End If
        If ccc = 2 Then
            xxx = Color.Red
        End If

        PictureBox1.BackColor = xxx
    End Sub


    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click



        If PictureBox1.BackColor = Color.Lime And PictureBox2.BackColor = Color.Red And PictureBox3.BackColor = Color.Red Then
            LosPic_1.Stop()
            MsgBox("Zielony jest tylko 1!")

        End If
        If PictureBox1.BackColor = Color.Red And PictureBox2.BackColor = Color.Lime And PictureBox3.BackColor = Color.Red Then
            LosPic_1.Stop()
            MsgBox("Zielony jest tylko 1")

        End If
        If PictureBox1.BackColor = Color.Lime And PictureBox2.BackColor = Color.Red And PictureBox3.BackColor = Color.Lime Then
            LosPic_1.Stop()
            MsgBox("Zielony jest tylko 1")

        End If


    End Sub

    Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles LosPic_2.Tick
        Dim ccc As Integer
        Dim xxx As Color

        ccc = CInt(Int((2 * Rnd()) + 1))


        If ccc = 1 Then
            xxx = Color.Lime
        End If
        If ccc = 2 Then
            xxx = Color.Red
        End If

        PictureBox2.BackColor = xxx
    End Sub

    Private Sub Timer3_Tick(sender As Object, e As EventArgs) Handles LosPic_3.Tick
        Dim ccc As Integer
        Dim xxx As Color

        ccc = CInt(Int((2 * Rnd()) + 1))


        If ccc = 1 Then
            xxx = Color.Lime
        End If
        If ccc = 2 Then
            xxx = Color.Red
        End If

        PictureBox3.BackColor = xxx
    End Sub

    Private Sub Timer4_Tick(sender As Object, e As EventArgs) Handles LosPic_4.Tick
        Dim ccc As Integer
        Dim xxx As Color

        ccc = CInt(Int((2 * Rnd()) + 1))


        If ccc = 1 Then
            xxx = Color.Lime
        End If
        If ccc = 2 Then
            xxx = Color.Red
        End If

        PictureBox4.BackColor = xxx
    End Sub

    Private Sub Timer5_Tick(sender As Object, e As EventArgs) Handles LosPic_5.Tick
        Dim ccc As Integer
        Dim xxx As Color

        ccc = CInt(Int((2 * Rnd()) + 1))


        If ccc = 1 Then
            xxx = Color.Lime
        End If
        If ccc = 2 Then
            xxx = Color.Red
        End If

        PictureBox5.BackColor = xxx
    End Sub

    Private Sub Timer6_Tick(sender As Object, e As EventArgs) Handles LosPic_6.Tick
        Dim ccc As Integer
        Dim xxx As Color

        ccc = CInt(Int((2 * Rnd()) + 1))


        If ccc = 1 Then
            xxx = Color.Lime
        End If
        If ccc = 2 Then
            xxx = Color.Red
        End If

        PictureBox6.BackColor = xxx
    End Sub
End Class

 

 

 

Dewise, zapoznaj się, proszę, z tym poradnikiem i stroną, a następnie - korzystając z przycisku Edytuj (na dole pierwszego posta po lewej stronie) - popraw tytuł wątku tak, by mówił konkretnie o problemie. Poprawnie zatytułowany wątek zwiększa szansę na uzyskanie szybkiej pomocy. Zignorowanie tej prośby będzie skutkować przeniesieniem tematu do kosza.

Oczywiście, że wszystko powinno być w jednym timerze.Ty w każdym timerze używasz procedur wywoływanych przez odwołanie się do stałych wartości: Handles LosPic_1.Tick, Handles LosPic_2.Tick itd.

Aby był jeden timer należy użyć zmiennej która przyjmuje wartości losowe i oznaczające który obrazek będzie kolorowany.

Deklarujemy zmienną globalną np KtoryObrazek i nadajemy tej zmiennej wartości losowe.

dim KtoryObrazek as Integer

Private Sub Timer_Tick(sender As Object, e As EventArgs)  handles Timer.Tick

KtoryObrazek=Cint(5*rnd())

Dim ccc As Integer
        Dim xxx As Color
        ccc = CInt(Int((2 * Rnd()) + 1))
        If ccc = 1 Then
            xxx = Color.Lime
        ElseIf ccc = 2 Then
            xxx = Color.Red
        End If
Select Case KtoryObrazek
Case 0
PictureBox1.BackColor = xxx
Case 1
PictureBox2.BackColor = xxx
Case 2
PictureBox3.BackColor = xxx

Case 3
PictureBox4.BackColor = xxx

Case 4
PictureBox5.BackColor = xxx
Case 5
PictureBox6.BackColor = xxx
End Select

end sub

jeśli chodzi o procedurę sprawdzającą czy tylko jeden klocek jest zielony, to też proste i można zrobić na wiele sposobów np. deklarujemy globalną zmienną tablicową :dim kolor(5) as integer

dla każdego obrazka ustalamy wartość tej zmiennej na 0 gdy kolor jest czerwony i na 1 gdy kolor jest zielony. Na zakończenie sumujemy wszystkie wartości i jeżeli suma jest 1 to znaczy, że tylko jeden obrazek jest zielony. Cały programik można jeszcze bardziej skrócić jeżeli zindeksujemy też obrazki.

(W Properties parametr Index.) ustwaiamy nazwy :PictureBox1(0), PictureBox1(1) itd. Cały zaś programik można wówczas zamknąć w tych paru liniach.

Dim kolor(5) as integer, KtoryObrazek as Integer

Private Sub Button1_Click(sender As Object, e As EventArgs)Handles Button1.Click

 For i = 0 To 5: kolor(i) = 1: Picture1Box(i).BackColor = Color.Lime: Next i

timer.enabled=true

End Sub







Private Sub Timer_Tick(sender As Object, e As EventArgs)Handles Timer.Tick

Dim ccc As Integer, suma as integer, xxx as Color, i as integer

        ccc = CInt(Int((2 * Rnd()) + 1)): ktoryObrazek = CInt(Rnd() * 5)

        If ccc = 1 Then xxx = Color.Lime Else xxx = Color.Red

 PictureBox1(KtoryObrazek).BackColor = xxx

If xxx = Color.Lime Then kolor(KtoryObrazek) = 1 Else kolor(KtoryObrazek) = 0

For i=0 to 5 suma=suma+kolor(i):next i

if suma =1 then LosPic_1.Stop():msgbox("Tylko jeden obrazek jest zielony")

end sub

Jja nie mam vb.net i nie mogę tego sprawdzić, a uruchamiam i zatrzymuję timer bez żadnych dodatkowych funkcji, czyli musisz ewentualnie poprawić to sam.

U mnie działa to tak: kolorek.zip