2013-11-03 63 views
0

我的WinForm中有多个按钮。随机序列被选中,按钮必须按该顺序按下。VB.NET中的按钮顺序

我该如何检测序列是否损坏,即没有按照正确的顺序点击按钮?

的一点是,我想知道某个按钮被按下

Dim clicked As Boolean = False 
Private Sub Button1_Click(ByVal sender As System.Object, _ 
      ByVal e As System.EventArgs) Handles Button1.Click 
    clicked = True 
End Sub 
+0

你能显示你试过的代码吗? – Plutonix

+0

我找不到任何逻辑要做到这一点,但试图这样的事情: 点击暗淡由于布尔=假 私人小组的button1_Click(BYVAL发件人为System.Object的,BYVALË作为System.EventArgs)把手Button1.Click clicked = True End Sub – user2866752

+0

您需要的不仅仅是一个点击标志......您需要收集一些东西来识别WHICH按钮被点击并简单地保存为系列的一部分。然后将它与所需的序列顺序进行比较 - 一旦出现故障或结束时。 – Plutonix

回答

1

让所有的按钮火一样的处理程序和文本()属性附加到一个字符串后,按下哪个按钮:

Private sequence As String 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
    Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click, _ 
    Button6.Click, Button7.Click, Button8.Click, Button9.Click, Button0.Click 

    Dim btn As Button = DirectCast(sender, Button) 
    sequence = sequence & btn.Text 

    ' ... possibly do something with "sequence" ... 

End Sub 
0

尝试......

您需要添加10个按钮(在这种情况下),并在标签属性中输入数字1至10为他们...

编辑:更聪明的方式;-)

Dim lstButtonOrder As New List(Of Integer) 
Dim lstMyRandomArray As New List(Of Integer) 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    SetupArray() 

End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, 
                     Button4.Click, Button5.Click, Button6.Click, 
                     Button7.Click, Button8.Click, Button9.Click, Button10.Click 
    Dim butPressed As Button = TryCast(sender, Button) 

    lstButtonOrder.Add(butPressed.Tag) 

    If lstButtonOrder.Count = lstMyRandomArray.Count Then 

     If Enumerable.SequenceEqual(lstButtonOrder, lstMyRandomArray) = True Then 

      MsgBox("Well Done!") 

     Else 

      MsgBox("You Fail") 

     End If 

     SetupArray() 

    End If 
End Sub 

Private Sub SetupArray() 
    Dim rnd = New Random 
    lstMyRandomArray = Enumerable.Range(1, 10).OrderBy(Function(n) rnd.Next).ToList 

    lblOrder.Text = "Please hit the buttons in this order..." & vbCrLf 

    lstMyRandomArray.ToList().ForEach(Sub(x) 
              lblOrder.Text &= x.ToString & " " 
             End Sub) 

    lstButtonOrder.Clear() 

End Sub 

当然,我也刚刚解析的名字在这里,但我更喜欢使用的标记属性...

+0

在此处的任何位置是否使用了'arrArray'? – Ryan

+0

是的,我在SetupArray例程中随机化它。我可能可以使用1个单个数组,但我想象了2 ... – PGallagher

+0

但是,您将它分配给'MyRandomArray'。为什么不使用'Enumerable.Range'? – Ryan

0

我会保持按钮的排列:

Private buttons() As Button = { Me.Button1, Me.Button2, Me.Button3, … } 

你可以做一个处理程序:

Private Sub Button_Click(sender As Object, e As EventArgs) 
    ' TODO 
End Sub 

添加处理程序的按钮New()

Public Sub New() 
    Me.InitializeComponent() 

    For Each b In buttons 
     AddHandler b.Click, AddressOf Button_Click 
    Next 
End Sub 

之后(或之前)这样做,随机buttons。然后让你希望用户点击下一个跟踪:

Private currentButton As Integer = 0 

在处理程序中,检查:

If sender Is buttons(currentButton) Then 
    ' Move to the next button 
    currentButton += 1 

    ' Was that the end of them? 
    If currentButton = buttons.Length Then 
     ' All buttons were pressed in the right order 
    End If 
Else 
    ' Wrong! 
End If 

你可以使用一个列表,但你并不真的需要跟踪如果您知道它们与您已有的订单相符,则按下每个按钮的按钮。