You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:25:18