Reputation: 67
Here is a portion of my code.. it is a dice game that checks if all 3 dice are the same. The user can hold/unhold any of the 3 and the dice use timers to roll. If they are all the same, Points goes up by 1. Problem is, the label doesn't update until the roll button is hit again. How do I make it so the label goes up by 1 as soon as there are 3 equal dice numbers?
EDITED WITH ALL CODE
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
End Class
Upvotes: 1
Views: 823
Reputation: 10780
Try calling DoEvents after setting the lblRolls.Text:
....
lblRolls.Text = RollNumber
Application.DoEvents()
....
EDIT
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
....
Upvotes: 0
Reputation: 54532
This answer will remove the need of the answer that I gave you on your other question. Since you are using Timers to generate your dice numbers create a method that you call after you disable each Timer, this method will check that all of the Timers are disabled then check for equality. See if it works for you. You may want to move more of the code from your btnRoll_Click
EventHandler to this method also.
Method to check for equality.
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
Modifed Timer Method example add to all three of your Timer's
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
Upvotes: 2
Reputation: 2089
Move your label line down after the end if, and see if that helps. I cannot see where you are incrementing the points - so its difficult to tell.
If (lblDice.Text = lblDice2.Text) And (lblDice2.Text = lblDice3.Text) Then
btnTriple.Visible = True
End If
or even place it before the restart=false line instead of where it is now.
lblPoints.Text = Points
Restart = False
Upvotes: 0