1

这是我的代码的一部分.. 这是一个骰子游戏,检查所有 3 个骰子是否相同。用户可以持有/取消持有任何 3 和骰子使用计时器来滚动。如果它们都相同,点数会增加 1。问题是,标签不会更新,直到再次按下滚动按钮。一旦有 3 个相同的骰子数字,我该如何做到这一点,标签就会增加 1 ?

用所有代码编辑

Dim randomObject As New Random()
Dim n, m, o, p As Integer
Dim RollNumber = 1
Dim TurnNumber As Integer
Dim Points = 0
Dim Restart As Boolean = True


Private Sub btnRoll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRoll.Click


    If btnHold.Enabled = True Then
        Timer1.Enabled = True
    End If
    If btnHold2.Enabled = True Then
        Timer2.Enabled = True
    End If
    If btnHold3.Enabled = True Then
        Timer3.Enabled = True
    End If

    TurnNumber += 1
    lblTurns.Text = TurnNumber

    If TurnNumber = 3 Then
        RollNumber += 1
        TurnNumber = 0
    End If

    lblRolls.Text = RollNumber


    If Not Restart Then
        If (lblDice.Text = lblDice2.Text) And (lblDice2.Text = lblDice3.Text) Then
            Points += 1

        End If
        lblPoints.Text = Points
    End If
    Restart = False






End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    m = m + 1
    If m < 10 Then
        n = randomObject.Next(1, 7)
        lblDice.Text = n
        die1PictureBox.Image = ImageList1.Images(n - 1)
    Else
        Timer1.Enabled = False
        m = 0
    End If
End Sub

Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    m = m + 1
    If m < 10 Then
        n = randomObject.Next(1, 7)
        lblDice2.Text = n
        die2PictureBox.Image = ImageList1.Images(n - 1)
    Else
        Timer2.Enabled = False
        m = 0
    End If
End Sub

Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
    m = m + 1
    If m < 10 Then
        n = randomObject.Next(1, 7)
        lblDice3.Text = n
        die3PictureBox.Image = ImageList1.Images(n - 1)
    Else
        Timer3.Enabled = False
        m = 0
    End If
End Sub

Private Sub btnHold_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHold.Click
    btnHold.Enabled = False
    btnUnhold.Enabled = True
End Sub

Private Sub btnUnhold_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUnhold.Click
    btnHold.Enabled = True
    btnUnhold.Enabled = False
End Sub

Private Sub btnHold2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHold2.Click
    btnHold2.Enabled = False
    btnUnhold2.Enabled = True
End Sub

Private Sub btnUnhold2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUnhold2.Click
    btnHold2.Enabled = True
    btnUnhold2.Enabled = False
End Sub

Private Sub btnHold3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHold3.Click
    btnHold3.Enabled = False
    btnUnhold3.Enabled = True
End Sub

Private Sub btnUnhold3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUnhold3.Click
    btnHold3.Enabled = True
    btnUnhold3.Enabled = False
End Sub

Private Sub btnRestart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRestart.Click
    Dim msg As String
    Dim title As String
    Dim style As MsgBoxStyle
    Dim response As MsgBoxResult
    msg = "Are you sure you want to start a new game? If not, you can select 'No' to continue with your current game."
    style = MsgBoxStyle.DefaultButton2 Or _
       MsgBoxStyle.Critical Or MsgBoxStyle.YesNo
    title = "New Game"

    response = MsgBox(msg, style, title)
    If response = MsgBoxResult.Yes Then
        Reset()

    End If

    Restart = True

End Sub


Private Sub ColorChangeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ColorChangeToolStripMenuItem.Click

    'Notice the ... in the menu...that means a dialog box will come

    Dim dialog As New ColorDialog   ' Color Dialog
    Dim result As DialogResult ' stores Button clicked

    dialog.FullOpen = True ' show all colors
    result = dialog.ShowDialog

    ' do nothing if user clicked dialog's Cancel Button
    If result <> Windows.Forms.DialogResult.Cancel Then
        ' assign new color to Paint object
        Label1.ForeColor = dialog.Color
    End If


End Sub

Private Sub FontChangeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FontChangeToolStripMenuItem.Click
    'Notice the ... in the menu...that means a dialog box will come

    Dim dialog As New FontDialog   ' Font Dialog
    Dim result As DialogResult ' stores Button clicked

    ' show dialog and get result
    result = dialog.ShowDialog()

    ' do nothing if user clicked dialog's Cancel Button
    If result <> Windows.Forms.DialogResult.Cancel Then
        ' assign new font value to TextBox
        If Windows.Forms.DialogResult.OK = MessageBox.Show("Changing Font. Click Ok to Change,\n Cancel for no change to occur.", _
                                 "Warning", MessageBoxButtons.OKCancel) Then
            Label1.Font = dialog.Font
        End If


    End If


End Sub

Private Sub SelectAColorToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectAColorToolStripMenuItem.Click

    Dim dialog As New ColorDialog   ' Color Dialog
    Dim result As DialogResult ' stores Button clicked

    dialog.FullOpen = True ' show all colors
    result = dialog.ShowDialog()

    ' do nothing if user clicked dialog's Cancel Button
    If result <> Windows.Forms.DialogResult.Cancel Then
        Me.BackColor = dialog.Color
    End If

End Sub

Private Sub SelectAnImageToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectAnImageToolStripMenuItem.Click
    Dim msg As String
    Dim title As String
    Dim style As MsgBoxStyle
    Dim response As MsgBoxResult
    msg = "Are you sure you want to see what happens when you get a perfect score without actually playing? That's cheating.. and will reset the game!"
    style = MsgBoxStyle.DefaultButton2 Or _
       MsgBoxStyle.Critical Or MsgBoxStyle.YesNo
    title = "New Game"

    response = MsgBox(msg, style, title)
    If response = MsgBoxResult.Yes Then
        Dim FileChooser As New OpenFileDialog()
        Dim result As DialogResult

        result = DialogResult = FileChooser.ShowDialog()

        If result <> Windows.Forms.DialogResult.Cancel Then
            If FileChooser.FileName <> "" Then
                Me.BackgroundImage = System.Drawing.Image.FromFile(FileChooser.FileName)
                Reset()
            Else
                MessageBox.Show("No Change Made. File Not Selected!", "Warning", _
                                System.Windows.Forms.MessageBoxButtons.OK, _
                                System.Windows.Forms.MessageBoxIcon.Exclamation)
            End If
        End If
    End If

End Sub

Private Sub btnHow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHow.Click
    MessageBox.Show(" You will have 5 rolls.  In each roll you have up to 3 turns. Your object in each of the turns is to get three of a kind on the dice.  You can hold some die and roll only some of the die, or you can reroll all the dice.  If in a turn you get three of a kind, you get a point.  At the end of 5 turns you could have a maximum of 5 points and you will get a special prize.")
End Sub

Sub Reset()
    RollNumber = 1
    lblRolls.Text = RollNumber
    TurnNumber = 0
    lblTurns.Text = TurnNumber
    Points = 0
    lblPoints.Text = Points
    lblPoints2.Text = ""

    btnRoll.Enabled = True
    btnHold.Enabled = True
    btnHold2.Enabled = True
    btnHold3.Enabled = True
    btnUnhold.Enabled = False
    btnUnhold2.Enabled = False
    btnUnhold3.Enabled = False

    die1PictureBox.Image = Nothing
    die2PictureBox.Image = Nothing
    die3PictureBox.Image = Nothing
    lblDice.Text = ""
    lblDice2.Text = ""
    lblDice3.Text = ""

End Sub

Private Sub btnTriple_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTriple.Click
    Points += 1
    lblPoints.Text = Points

    btnTriple.Visible = False
End Sub

结束类

4

3 回答 3

2

这个答案将消除我在您的其他问题上给您的答案的需要。由于您使用计时器来生成您的骰子号码,因此在禁用每个计时器后创建一个您调用的方法,此方法将检查所有计时器是否已禁用,然后检查是否相等。看看它是否适合你。您可能还希望将更多代码从btnRoll_ClickEventHandler 移动到此方法。

检查相等性的方法。

Private Sub CheckForMatch()
    If Not Timer1.Enabled And Not Timer2.Enabled And Not Timer3.Enabled Then
        If (lblDice.Text = lblDice2.Text) And (lblDice2.Text = lblDice3.Text) Then
            Points += 1
            lblPoints.Text = Points
        End If
    End If
End Sub

修改计时器方法示例添加到所有三个计时器

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    m = m + 1
    If m < 10 Then
        n = randomObject.Next(1, 7)
        lblDice.Text = n
        die1PictureBox.Image = ImageList1.Images(n - 1)
    Else
        Timer1.Enabled = False
        CheckForMatch()
        m = 0
    End If
End Sub
于 2013-03-21T01:27:03.687 回答
0

设置 lblRolls.Text 后尝试调用 DoEvents:

....

lblRolls.Text = RollNumber
Application.DoEvents()

....

编辑

Private Sub SetTimers(Enable As Boolean)
    Timer1.Enabled = Enable
    Timer2.Enabled = Enable
    Timer3.Enabled = Enable
End Sub

''''
SetTImers(True)
....

If TurnNumber = 3 Then
    RollNumber += 1
    TurnNumber = 0
    SetTimers(False)
    Application.DoEvents()
    lblRolls.Text = RollNumber        
    Application.DoEvents()
    SetTimers(True)
Else
    lblRolls.Text = RollNumber
End If

....
于 2013-03-21T00:14:53.503 回答
0

在结束后将标签线向下移动,看看是否有帮助。我看不到你在哪里增加积分 - 所以很难说。

If (lblDice.Text = lblDice2.Text) And (lblDice2.Text = lblDice3.Text) Then
    btnTriple.Visible = True
End If

甚至将它放在 restart=false 行之前,而不是现在的位置。

lblPoints.Text = Points
Restart = False
于 2013-03-21T00:24:55.163 回答