Using Visual Basic, write a program that allows the user to challenge the computer to a game of Pick-Up Sticks. Here is how the game is played. The user chooses the number of matchsticks (from 5 to 40) to place in a pile. Then, the computer chooses who will go first. At each turn, the contestant can remove one, two or three matchsticks from the pile. The contestant who removes the last matchstick loses. See the figure below for an example of the output.

The computer should make the user always select from a pile where the number of matchsticks has a remainder of 1 when divided by 4. For instance, if the user initially chooses a number of matchsticks that has a remainder of 1 when divided by 4, then the computer should have the user go first. Otherwise, the computer should go first and remove the proper number of matchsticks. [Note: The remainder when n is divided by 4 is (n Mod 4).] After writing the program, play a few games with the computer and observe that the computer always wins.
Suggested Control Names and Attributes:
| Name Property | Text Property | Control Type | Notes |
| frmPickUpSticks | Five, Six, Pick-Up Sticks | Form | Holds Controls |
| btnGiveRules | Give the Rules of the Game | Button | Triggers event to show rules |
| btnNewGame | Begin a New Game | Button | Triggers event to start a new game |
| btnOne | One | Button | Triggers event to take 1 stick and display new pile |
| btnTwo | Two | Button | Triggers event to take 2 sticks and display new pile |
| btnThree | Three | Button | Triggers event to take 3 sticks and display new pile |
| txtCurrentPile | TextBox | Display current contents of pile. Read only set to true. |
Comments:
I could have used loops to make some sections of the code easier. For example, displaying the number of sticks in the pile. I chose not to because at this point, we haven’t learned how to code loops.
Write the Code:
' Project: Pick Up Sticks
' Description: Play a game of pick up sticks with the computer
Public Class PickUpSticks
' Declare global variables
Dim numberOfSticks As Integer = 0
Dim valid As Boolean = True
Dim computerTurn As Boolean = True
Private Sub btnGiveRules_Click(sender As Object, e As EventArgs) Handles btnGiveRules.Click
MessageBox.Show("Choose the number of matchsticks (between 5 and 40). The computer will decide who goes first. Remove one, two or three matchsticks from the pile. The contestant who removes the last matchstick loses.", "Rules of the Game")
End Sub
Private Sub btnNewGame_Click(sender As Object, e As EventArgs) Handles btnNewGame.Click
' Ask for number of matchsticks
GetNumber()
' Output number of matchsticks
OutputSticks()
' Decide who goes first
WhoGoesFirst()
If computerTurn = True Then
ComputersTurn()
End If
End Sub
Function GetNumber() As Integer
' Obtains the number of matchsticks and validates the input
numberOfSticks = CInt(InputBox("Enter a number between 5 and 40", "Number of Sticks"))
If (numberOfSticks < 5) Or (numberOfSticks > 40) Then
MessageBox.Show("You entered an invalid number. Please try again")
valid = False
Else
valid = True
End If
If valid = False Then
GetNumber()
End If
Return numberOfSticks
End Function
Sub OutputSticks()
txtCurrentPile.Text = " "
Select Case numberOfSticks
Case 5
txtCurrentPile.Text = ("| | | | |")
Case 6
txtCurrentPile.Text = ("| | | | | |")
Case 7
txtCurrentPile.Text = ("| | | | | | |")
Case 8
txtCurrentPile.Text = ("| | | | | | | |")
Case 9
txtCurrentPile.Text = ("| | | | | | | | |")
Case 10
txtCurrentPile.Text = ("| | | | | | | | | |")
Case 11
txtCurrentPile.Text = ("| | | | | | | | | | |")
Case 12
txtCurrentPile.Text = ("| | | | | | | | | | | |")
Case 13
txtCurrentPile.Text = ("| | | | | | | | | | | | |")
Case 14
txtCurrentPile.Text = ("| | | | | | | | | | | | | |")
Case 15
txtCurrentPile.Text = ("| | | | | | | | | | | | | | |")
Case 16
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | |")
Case 17
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | |")
Case 18
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | |")
Case 19
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | |")
Case 20
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | |")
Case 21
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | |")
Case 22
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | |")
Case 23
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | |")
Case 24
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | |")
Case 25
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | |")
Case 26
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 27
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 28
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 29
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 30
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 31
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 32
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 33
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 34
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 35
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 36
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 37
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 38
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 39
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |")
Case 40
txtCurrentPile.Text = ("| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |")
End Select
End Sub
Sub WhoGoesFirst()
If numberOfSticks Mod 4 = 1 Then
computerTurn = False
MessageBox.Show("Player Goes First")
Else
computerTurn = True
MessageBox.Show("Computer Goes First")
End If
End Sub
Sub ComputersTurn()
If numberOfSticks Mod 4 = 3 Then
numberOfSticks = numberOfSticks - 2
MessageBox.Show("Computer takes 2 sticks.")
ElseIf (numberOfSticks Mod 4 = 2) Then
numberOfSticks = numberOfSticks - 1
MessageBox.Show("Computer takes 1 stick.")
ElseIf (numberOfSticks Mod 4 = 0) Then
numberOfSticks = numberOfSticks - 3
MessageBox.Show("Computer takes 3 sticks.")
End If
If numberOfSticks = 1 Then
MessageBox.Show("Only 1 stick left. You lose!")
numberOfSticks = 0
End If
OutputSticks()
End Sub
Private Sub btnOne_Click(sender As Object, e As EventArgs) Handles btnOne.Click
If numberOfSticks = 0 Then
MessageBox.Show("Please start a new game.")
Else
MessageBox.Show("Player takes 1 stick.")
numberOfSticks = numberOfSticks - 1
If numberOfSticks = 1 Then
MessageBox.Show("Only 1 stick left. You win!")
numberOfSticks = 0
End If
OutputSticks()
ComputersTurn()
End If
End Sub
Private Sub btnTwo_Click(sender As Object, e As EventArgs) Handles btnTwo.Click
If numberOfSticks = 0 Then
MessageBox.Show("Please start a new game.")
Else
MessageBox.Show("Player takes 2 sticks.")
numberOfSticks = numberOfSticks - 2
OutputSticks()
If numberOfSticks = 1 Then
MessageBox.Show("Only 1 stick left. You win!")
numberOfSticks = 0
End If
ComputersTurn()
End If
End Sub
Private Sub btnThree_Click(sender As Object, e As EventArgs) Handles btnThree.Click
If numberOfSticks = 0 Then
MessageBox.Show("Please start a new game.")
Else
MessageBox.Show("Player takes 3 sticks.")
numberOfSticks = numberOfSticks - 3
OutputSticks()
If numberOfSticks = 1 Then
MessageBox.Show("Only 1 stick left. You win!")
numberOfSticks = 0
End If
ComputersTurn()
End If
End Sub
End Class