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

如何在VB双人井字棋中用循环判断平局及简化代码

用循环实现井字棋平局判断(兼简化冗长代码)

嘿,我来帮你搞定这个问题!完全可以用循环实现平局判断,甚至还能顺便把你那冗长的胜负判断代码给简化了,不用堆一堆if/else。

首先说平局判断的核心逻辑:只有当棋盘所有格子都被填满,同时没有任何玩家获胜的时候,才是平局。我们可以用循环遍历整个棋盘的控件,检查有没有空格子,就能判断棋盘是否填满了。

先给你写个纯循环实现的棋盘填满判断函数:

Private Function IsBoardFull() As Boolean
    ' 遍历Panel里的所有按钮(假设你的棋盘按钮都放在Panel1里)
    For Each ctrl As Control In Panel1.Controls
        If TypeOf ctrl Is Button Then
            Dim btn As Button = DirectCast(ctrl, Button)
            ' 只要发现一个空按钮,说明棋盘没填满,直接返回False
            If btn.Text = "" Then
                Return False
            End If
        End If
    Next
    ' 循环跑完没找到空按钮,说明全满了
    Return True
End Function

这个函数里没有复杂的分支嵌套,就是靠循环遍历所有按钮来判断,完美符合你的要求。

另外,如果你原来的胜负判断代码很冗长(比如一堆if判断每行、每列、对角线),也可以用循环来简化。我们可以把所有可能的获胜组合(行、列、对角线)提前存成一个数组,然后循环遍历每个组合,检查是否有玩家达成了获胜条件:

Private Function CheckWin() As String
    ' 定义所有获胜组合:每个子数组对应三个按钮的索引(假设你给按钮的Tag设为0-8,或者Name是btn0、btn1...)
    Dim winCombos As Integer()() = {
        New Integer() {0, 1, 2}, ' 第一行
        New Integer() {3, 4, 5}, ' 第二行
        New Integer() {6, 7, 8}, ' 第三行
        New Integer() {0, 3, 6}, ' 第一列
        New Integer() {1, 4, 7}, ' 第二列
        New Integer() {2, 5, 8}, ' 第三列
        New Integer() {0, 4, 8}, ' 左上到右下对角线
        New Integer() {2, 4, 6}  ' 右上到左下对角线
    }

    ' 循环遍历每个获胜组合
    For Each combo In winCombos
        ' 根据索引找到对应的三个按钮
        Dim btn1 As Button = DirectCast(Panel1.Controls.Find("btn" & combo(0), True)(0), Button)
        Dim btn2 As Button = DirectCast(Panel1.Controls.Find("btn" & combo(1), True)(0), Button)
        Dim btn3 As Button = DirectCast(Panel1.Controls.Find("btn" & combo(2), True)(0), Button)

        ' 判断这三个按钮的文本是否相同且不为空
        If btn1.Text <> "" AndAlso btn1.Text = btn2.Text AndAlso btn2.Text = btn3.Text Then
            Return btn1.Text ' 返回获胜的玩家(X或O)
        End If
    Next

    ' 循环跑完没找到获胜组合,返回空字符串
    Return ""
End Function

最后把这些逻辑整合到你的落子事件里,顺序是:玩家落子后,先检查有没有人赢;如果没人赢,再检查棋盘是否填满,要是填满了就是平局:

Private Sub btn_Click(sender As Object, e As EventArgs) Handles btn0.Click, btn1.Click, btn2.Click, btn3.Click, btn4.Click, btn5.Click, btn6.Click, btn7.Click, btn8.Click
    Dim btn As Button = DirectCast(sender, Button)
    ' 防止重复点击同一个按钮
    If btn.Text <> "" Then Exit Sub

    ' 设置当前玩家的标记(X或O)
    btn.Text = If(choice, "X", "O")
    choice = Not choice

    ' 检查是否有玩家获胜
    Dim winner As String = CheckWin()
    If winner <> "" Then
        MessageBox.Show($"玩家 {winner} 获胜!")
        ResetBoard() ' 重置棋盘
        Return
    End If

    ' 检查平局:没人获胜 + 棋盘全满
    If IsBoardFull() Then
        MessageBox.Show("平局!")
        ResetBoard()
        Return
    End If
End Sub

' 重置棋盘的辅助函数,同样用循环实现
Private Sub ResetBoard()
    For Each ctrl As Control In Panel1.Controls
        If TypeOf ctrl Is Button Then
            DirectCast(ctrl, Button).Text = ""
        End If
    Next
    choice = True ' 重置为X先下
End Sub

这样一来,不管是平局判断还是胜负判断,都用循环替代了冗长的if/else分支,代码更简洁,也更容易维护——以后要是想改棋盘大小,只需要调整获胜组合数组就行,不用改一堆if条件。

内容的提问来源于stack exchange,提问作者Ruby_3.7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:32:16