TomAwesome
New member
- Joined
- Jul 16, 2013
- Messages
- 2
- Programming Experience
- Beginner
So... it's the inevitable Hangman Game question that every new programmer must tackle 
I'm just stuck and going in circles. I think I need an extra set of trained eyes to help me out.
I know my code is not so eloquent to look at, but I have only been studying vb.net for about 5 weeks.
My hangman game seems to be working fine, until I start a new game, then everything goes a little funky.
I've stepped through my code over and over and just don't see the logic error. Would anyone be willing to take a look and find problems?
I am using button controls for the alphabet and declaring a win or lose by whether the pieces of my hangman are all visible (lose) or all of my answer labels are visible (win). Like I said, the code works flawlessly on first iteration, but after a new game is started, words and labels and such don't match up. Sometimes the game says I won when I press any alphabet button, or (even if I know the word) the labels will not show up correctly and it counts as an incorrect guess. Anyways, here's the code I've been working with. I hope you find it is long, but commented well.
I'm just stuck and going in circles. I think I need an extra set of trained eyes to help me out.
I know my code is not so eloquent to look at, but I have only been studying vb.net for about 5 weeks.
My hangman game seems to be working fine, until I start a new game, then everything goes a little funky.
I've stepped through my code over and over and just don't see the logic error. Would anyone be willing to take a look and find problems?
I am using button controls for the alphabet and declaring a win or lose by whether the pieces of my hangman are all visible (lose) or all of my answer labels are visible (win). Like I said, the code works flawlessly on first iteration, but after a new game is started, words and labels and such don't match up. Sometimes the game says I won when I press any alphabet button, or (even if I know the word) the labels will not show up correctly and it counts as an incorrect guess. Anyways, here's the code I've been working with. I hope you find it is long, but commented well.
Imports System.IO
Public Class HangmanForm
' Declare constants
Private Const HINT_String As String = " Letter Word"
Private Const YOU_WIN_String As String = "You win!"
' Declare variables
Private score_Decimal As Decimal
Private numOfGuessesInteger As Integer
Private randomNumberInteger As Integer
Private wordListStreamReader As StreamReader
Private generateRandom As Random = New Random(DateTime.Now.Millisecond)
Private newWordString As String
Private newWordLengthInteger As Integer
Private indexInteger As Integer = 0
Private answerLabel As Label
Private guessString As String
Private guessControlVar As Integer = 0
' Delcare counters and accumulators
Private numOfGamesPlayedInteger As Integer = 0
Private numOfGamesWonInteger As Integer = 0
Private numOfWordsAvailableInteger As Integer = 0
Private Sub NewGameToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewGameToolStripMenuItem.Click, newGameButton.Click
EnableAllButtons() ' Enables all buttons
ClearLabels() ' Makes answer labels invisible
ResetHangman() ' Makes hangman invisible
' Generate random number for word selection
randomNumberInteger = generateRandom.Next(0, numOfWordsAvailableInteger - 1)
' Select a word
wordsComboBox.SelectedIndex = randomNumberInteger
newWordString = wordsComboBox.SelectedItem.ToString
' Show hint to player
newWordLengthInteger = newWordString.Length
hintTextBox.Text = newWordLengthInteger.ToString & HINT_String
' Fill letter labels with new word
Dim newWordLetters(newWordLengthInteger - 1) As String
For x As Integer = 0 To newWordLengthInteger - 1
newWordLetters(x) = newWordString.Substring(x, 1) ' Initialize array with characters from new word
Next x
For Each Me.answerLabel In Me.answerGroupBox.Controls
If indexInteger < newWordLengthInteger Then
Me.answerLabel.Text = newWordLetters(indexInteger)
indexInteger += 1
Else
Me.answerLabel.Text = ""
End If
Next
' Hide answer labels with no letter assigned
For Each Me.answerLabel In Me.answerGroupBox.Controls
If answerLabel.Text = "" Then
answerLabel.Visible = True
Else
answerLabel.Visible = False
End If
Next
End Sub
Private Sub labelCheck()
guessControlVar = 0 ' Resets control variable for incorrect guess
' This subroutine checks whether a guess is correct
For Each Me.answerLabel In Me.answerGroupBox.Controls
If guessString = Me.answerLabel.Text.ToUpper Then
' Correct guess by player
Me.answerLabel.Visible = True
guessControlVar += 1
End If
Next
' Check to see if all labels are visible (game won)
If Label1.Visible And Label2.Visible And Label3.Visible And Label4.Visible And Label5.Visible And Label6.Visible And Label7.Visible And Label8.Visible And Label9.Visible And Label10.Visible And Label11.Visible And Label12.Visible And Label13.Visible And Label14.Visible Then
' Disable all alphabet buttons
DisableAllButtons()
' Display wining message to player
MessageBox.Show(YOU_WIN_String)
' Increment game and score counters
numOfGamesPlayedInteger += 1
numOfGamesWonInteger += 1
' Show score to player
scoreButton.PerformClick()
End If
If guessControlVar = 0 Then ' Show a piece of the hangman
If nooseShape.Visible = False Then
nooseShape.Visible = True
ElseIf headShape.Visible = False Then
headShape.Visible = True
ElseIf bodyShape.Visible = False Then
bodyShape.Visible = True
ElseIf leftArmShape.Visible = False Then
leftArmShape.Visible = True
ElseIf rightArmShape.Visible = False Then
rightArmShape.Visible = True
ElseIf leftLegShape.Visible = False Then
leftLegShape.Visible = True
ElseIf rightLegShape.Visible = False Then
rightLegShape.Visible = True
End If
End If
If nooseShape.Visible And headShape.Visible And bodyShape.Visible And leftArmShape.Visible And rightArmShape.Visible And leftLegShape.Visible And rightLegShape.Visible Then
' Display losing message to player
MessageBox.Show("You're hung!")
' Increment games played
numOfGamesPlayedInteger += 1
' Disable alphabet buttons
DisableAllButtons()
' Display score to user
scoreButton.PerformClick()
End If
End Sub
Private Sub DisableAllButtons()
' Disables all the alphabet buttons
aButton.Enabled = False
bButton.Enabled = False
cButton.Enabled = False
dButton.Enabled = False
eButton.Enabled = False
fButton.Enabled = False
gButton.Enabled = False
hButton.Enabled = False
iButton.Enabled = False
jButton.Enabled = False
kButton.Enabled = False
lButton.Enabled = False
mButton.Enabled = False
nButton.Enabled = False
oButton.Enabled = False
pButton.Enabled = False
qButton.Enabled = False
rButton.Enabled = False
sButton.Enabled = False
tButton.Enabled = False
uButton.Enabled = False
vButton.Enabled = False
wButton.Enabled = False
xButton.Enabled = False
yButton.Enabled = False
zButton.Enabled = False
End Sub
Private Sub EnableAllButtons()
' Enables all the alphabet buttons
aButton.Enabled = True
bButton.Enabled = True
cButton.Enabled = True
dButton.Enabled = True
eButton.Enabled = True
fButton.Enabled = True
gButton.Enabled = True
hButton.Enabled = True
iButton.Enabled = True
jButton.Enabled = True
kButton.Enabled = True
lButton.Enabled = True
mButton.Enabled = True
nButton.Enabled = True
oButton.Enabled = True
pButton.Enabled = True
qButton.Enabled = True
rButton.Enabled = True
sButton.Enabled = True
tButton.Enabled = True
uButton.Enabled = True
vButton.Enabled = True
wButton.Enabled = True
xButton.Enabled = True
yButton.Enabled = True
zButton.Enabled = True
End Sub
Private Sub ClearLabels()
For Each Me.answerLabel In Me.answerGroupBox.Controls
answerLabel.Visible = False
Next
End Sub
Private Sub ResetHangman()
' Makes all parts of hangman invisible
nooseShape.Visible = False
headShape.Visible = False
leftArmShape.Visible = False
rightArmShape.Visible = False
bodyShape.Visible = False
rightLegShape.Visible = False
leftLegShape.Visible = False
End Sub
Private Sub ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles aButton.Click, bButton.Click, cButton.Click,
dButton.Click, eButton.Click, fButton.Click, gButton.Click, hButton.Click, iButton.Click, jButton.Click, kButton.Click, lButton.Click,
mButton.Click, nButton.Click, oButton.Click, pButton.Click, qButton.Click, rButton.Click, sButton.Click, tButton.Click, uButton.Click,
vButton.Click, wButton.Click, xButton.Click, yButton.Click, zButton.Click
' Handles any button click with select case structure
Select Case DirectCast(sender, Button).Name
' Select a case depending on the name of the case and process
' the commands under the selected case as an event.
Case "aButton"
aButton.Enabled = False ' Disables button after it has been pressed
guessString = "A" ' Sets guessString to letter
labelCheck() ' Calls labelCheck()
Case "bButton"
bButton.Enabled = False
guessString = "B"
labelCheck()
Case "cButton"
cButton.Enabled = False
guessString = "C"
labelCheck()
Case "dButton"
dButton.Enabled = False
guessString = "D"
labelCheck()
Case "eButton"
eButton.Enabled = False
guessString = "E"
labelCheck()
Case "fButton"
fButton.Enabled = False
guessString = "F"
labelCheck()
Case "gButton"
gButton.Enabled = False
guessString = "G"
labelCheck()
Case "hButton"
hButton.Enabled = False
guessString = "H"
labelCheck()
Case "iButton"
iButton.Enabled = False
guessString = "I"
labelCheck()
Case "jButton"
jButton.Enabled = False
guessString = "J"
labelCheck()
Case "kButton"
kButton.Enabled = False
guessString = "K"
labelCheck()
Case "lButton"
lButton.Enabled = False
guessString = "L"
labelCheck()
Case "mButton"
mButton.Enabled = False
guessString = "M"
labelCheck()
Case "nButton"
nButton.Enabled = False
guessString = "N"
labelCheck()
Case "oButton"
oButton.Enabled = False
guessString = "O"
labelCheck()
Case "pButton"
pButton.Enabled = False
guessString = "P"
labelCheck()
Case "qButton"
qButton.Enabled = False
guessString = "Q"
labelCheck()
Case "rButton"
rButton.Enabled = False
guessString = "R"
labelCheck()
Case "sButton"
sButton.Enabled = False
guessString = "S"
labelCheck()
Case "tButton"
tButton.Enabled = False
guessString = "T"
labelCheck()
Case "uButton"
uButton.Enabled = False
guessString = "U"
labelCheck()
Case "vButton"
vButton.Enabled = False
guessString = "V"
labelCheck()
Case "wButton"
wButton.Enabled = False
guessString = "W"
labelCheck()
Case "xButton"
xButton.Enabled = False
guessString = "X"
labelCheck()
Case "yButton"
yButton.Enabled = False
guessString = "Y"
labelCheck()
Case "zButton"
zButton.Enabled = False
guessString = "Z"
labelCheck()
End Select
End Sub
Private Sub ScoreToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ScoreToolStripMenuItem.Click, scoreButton.Click
Try
' Calculate score_Decimal as games won divided by total games played
score_Decimal = (numOfGamesWonInteger \ numOfGamesPlayedInteger) * 100
' Display score to player
MessageBox.Show("Games Played: " & numOfGamesPlayedInteger & Environment.NewLine &
"Games Won: " & numOfGamesWonInteger & Environment.NewLine &
"Score Percentage: " & score_Decimal & "%")
Catch
MessageBox.Show("No score yet!")
End Try
End Sub
Private Sub HangmanForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Open word list file
wordListStreamReader = New StreamReader("WordList.txt")
While wordListStreamReader.Peek <> -1
wordsComboBox.Items.Add(wordListStreamReader.ReadLine()) ' Adds words to hidden list
numOfWordsAvailableInteger += 1
End While
' Close file
wordListStreamReader.Close()
newGameButton.PerformClick()
End Sub
End Class
Last edited by a moderator: