Visual Basic 2019刽子手游戏:实现错误点击逐步显示身体部位
Visual Basic 2019刽子手游戏:实现身体部位依次显示
问题原因
你当前的代码逻辑错误在于所有If语句会在一次点击中顺序执行,导致多个身体部位的显示/隐藏逻辑被连续触发,直接跳到最后一个阶段,无法实现逐步显示的效果。
解决方案1:用错误次数变量控制多PictureBox显示
这个方案适配你当前用多个PictureBox分别对应不同阶段的设置:
步骤1:定义全局错误次数变量
在窗体类的顶部(所有事件方法之外)添加变量,用来记录玩家的错误猜测次数:
' 初始错误次数为0,还未出错 Private wrongGuesses As Integer = 0
步骤2:修改按钮点击事件代码
替换你原来的Button1_Click方法,逻辑改为:先判断字母是否错误,再根据错误次数逐步显示对应阶段的PictureBox:
Private Sub LetterButton_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 1. 获取当前点击的字母(适配所有字母按钮,可批量绑定事件) Dim guessedLetter As String = DirectCast(sender, Button).Text.ToLower() ' 替换为你的目标单词,比如"banana" Dim targetWord As String = "teste" ' 2. 判断字母是否错误 If Not targetWord.ToLower().Contains(guessedLetter) Then wrongGuesses += 1 ' 错误次数加1 ' 3. 根据错误次数切换对应阶段的PictureBox Select Case wrongGuesses Case 1 ' 第1次错误:显示头部(绞架+头) CABEÇA.Visible = True TRONCO.Visible = False BESQ.Visible = False BDIR.Visible = False PESQ.Visible = False PDIR.Visible = False Case 2 ' 第2次错误:显示躯干(绞架+头+躯干) CABEÇA.Visible = False TRONCO.Visible = True BESQ.Visible = False BDIR.Visible = False PESQ.Visible = False PDIR.Visible = False Case 3 ' 第3次错误:显示左臂 CABEÇA.Visible = False TRONCO.Visible = False BESQ.Visible = True BDIR.Visible = False PESQ.Visible = False PDIR.Visible = False Case 4 ' 第4次错误:显示右臂 CABEÇA.Visible = False TRONCO.Visible = False BESQ.Visible = False BDIR.Visible = True PESQ.Visible = False PDIR.Visible = False Case 5 ' 第5次错误:显示左腿 CABEÇA.Visible = False TRONCO.Visible = False BESQ.Visible = False BDIR.Visible = False PESQ.Visible = True PDIR.Visible = False Case 6 ' 第6次错误:显示右腿,游戏结束 CABEÇA.Visible = False TRONCO.Visible = False BESQ.Visible = False BDIR.Visible = False PESQ.Visible = False PDIR.Visible = True MessageBox.Show("你输了!") ' 禁用所有字母按钮,防止继续点击 For Each ctrl As Control In Me.Controls If TypeOf ctrl Is Button Then ctrl.Enabled = False End If Next End Select Else ' 4. 字母正确时,显示在未知单词处 ' 假设WordLabel是显示下划线的标签(比如初始为"_ _ _ _") Dim displayText As String = WordLabel.Text For i As Integer = 0 To targetWord.Length - 1 If targetWord.ToLower()(i) = guessedLetter Then ' 替换对应位置的下划线为正确字母 displayText = displayText.Remove(i * 2, 1).Insert(i * 2, guessedLetter) End If Next WordLabel.Text = displayText ' 检查是否全部猜中,触发胜利 If Not displayText.Contains("_") Then MessageBox.Show("你赢了!") ' 禁用所有字母按钮 For Each ctrl As Control In Me.Controls If TypeOf ctrl Is Button Then ctrl.Enabled = False End If Next End If End If ' 点击后禁用当前字母按钮,防止重复点击 DirectCast(sender, Button).Enabled = False End Sub
步骤3:初始化界面
在窗体的Load事件中,隐藏所有身体部位的PictureBox,并初始化单词显示:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 隐藏所有阶段的PictureBox CABEÇA.Visible = False TRONCO.Visible = False BESQ.Visible = False BDIR.Visible = False PESQ.Visible = False PDIR.Visible = False ' 初始化单词显示为下划线,比如目标单词长度为5,显示"_ _ _ _ _" Dim targetWord As String = "teste" WordLabel.Text = String.Join(" ", Enumerable.Repeat("_", targetWord.Length)) End Sub
解决方案2:用单个PictureBox切换图片(更简洁)
如果不想管理多个PictureBox,可以准备6张依次递进的刽子手图片(从空绞架到完整身体),用单个PictureBox切换图片:
步骤1:定义图片数组和错误次数变量
' 存储各阶段的刽子手图片,按顺序排列 Private hangmanImages As Image() = { Image.FromFile("hangman_empty.png"), ' 空绞架 Image.FromFile("hangman_head.png"), ' 绞架+头 Image.FromFile("hangman_body.png"), ' 加躯干 Image.FromFile("hangman_left_arm.png"), ' 加左臂 Image.FromFile("hangman_right_arm.png"), ' 加右臂 Image.FromFile("hangman_left_leg.png"), ' 加左腿 Image.FromFile("hangman_full.png") ' 完整身体,游戏结束 } Private wrongGuesses As Integer = 0
步骤2:初始化和点击事件代码
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 初始显示空绞架 HangmanPictureBox.Image = hangmanImages(0) ' 初始化单词下划线显示 Dim targetWord As String = "teste" WordLabel.Text = String.Join(" ", Enumerable.Repeat("_", targetWord.Length)) End Sub Private Sub LetterButton_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim guessedLetter As String = DirectCast(sender, Button).Text.ToLower() Dim targetWord As String = "teste" If Not targetWord.ToLower().Contains(guessedLetter) Then wrongGuesses += 1 If wrongGuesses <= 6 Then ' 切换到对应阶段的图片 HangmanPictureBox.Image = hangmanImages(wrongGuesses) If wrongGuesses = 6 Then MessageBox.Show("你输了!") ' 禁用所有字母按钮 For Each ctrl As Control In Me.Controls If TypeOf ctrl Is Button Then ctrl.Enabled = False End If Next End If End If Else ' 正确字母的处理逻辑,和方案1一致 Dim displayText As String = WordLabel.Text For i As Integer = 0 To targetWord.Length - 1 If targetWord.ToLower()(i) = guessedLetter Then displayText = displayText.Remove(i * 2, 1).Insert(i * 2, guessedLetter) End If Next WordLabel.Text = displayText If Not displayText.Contains("_") Then MessageBox.Show("你赢了!") For Each ctrl As Control In Me.Controls If TypeOf ctrl Is Button Then ctrl.Enabled = False End If Next End If End If DirectCast(sender, Button).Enabled = False End Sub
关键注意事项
- 所有字母按钮可以批量绑定到同一个
LetterButton_Click事件,不需要为每个按钮写单独的方法。 - 点击字母后记得禁用该按钮,防止玩家重复点击同一个字母。
- 目标单词可以改成随机生成的,提升游戏趣味性。
内容的提问来源于stack exchange,提问作者Joana Oliveira
相关产品推荐
相关产品推荐

