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

VB.net开发井字棋遇报错:CheckForWin方法未返回值

解决VB.net井字棋CheckForWin方法的「Expression does not produce a value」错误

错误根源

你将CheckForWin定义为无返回值的Sub过程,但在ResetBoard里却试图把它当作有返回值的函数来使用(If CheckForWin() = True Then)——Sub过程不会产生任何返回值,无法用于比较判断,这就是报错的直接原因。

完整修正方案

除了返回值问题,代码还有获胜逻辑错误、数组类型不匹配等问题,以下是修正后的可运行版本:

' 用String数组存储棋盘,空字符串表示空位
Dim Board(8) As String
Dim Player1 As String = "X"
Dim Player2 As String = "O"

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' 初始化棋盘为空
    ResetBoard()
End Sub

Private Sub ResetBoard()
    ' 快速重置所有棋盘位置为空字符串
    Array.Clear(Board, 0, Board.Length)
End Sub

' 将CheckForWin改为返回Boolean的Function,判断是否有玩家获胜或平局
Private Function CheckForWin() As Boolean
    ' 定义所有获胜组合的索引集合
    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 pos1 = Board(combo(0))
        Dim pos2 = Board(combo(1))
        Dim pos3 = Board(combo(2))
        
        ' 排除空位,判断三个位置是否一致
        If Not String.IsNullOrEmpty(pos1) AndAlso pos1 = pos2 AndAlso pos2 = pos3 Then
            Return True
        End If
    Next

    ' 检查是否平局(棋盘无空位)
    If Not Board.Contains("") Then
        Return True
    End If

    ' 未获胜也未平局
    Return False
End Sub

' 示例:棋盘格子点击事件(需为每个按钮设置Tag属性为对应索引0-8)
Private Sub BoardButton_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click, Button6.Click, Button7.Click, Button8.Click, Button9.Click
    Dim btn = DirectCast(sender, Button)
    Dim index = CInt(btn.Tag)

    ' 仅允许点击空位
    If String.IsNullOrEmpty(Board(index)) Then
        ' 假设当前玩家为Player1,需自行实现玩家切换逻辑
        Board(index) = Player1
        btn.Text = Player1

        ' 判断游戏是否结束
        If CheckForWin() Then
            MessageBox.Show("游戏结束!")
            ResetBoard()
            ' 重置所有按钮文本
            For Each control In Me.Controls
                If TypeOf control Is Button Then
                    DirectCast(control, Button).Text = ""
                End If
            Next
        End If
    End If
End Sub

关键修正说明

  • Sub改Function:把CheckForWin改为返回布尔值的Function,让调用方可以通过返回值判断是否需要重置棋盘。
  • 棋盘逻辑优化:用Array.Clear简化重置操作,空字符串表示空位,匹配String数组类型。
  • 获胜逻辑修复:用数组存储所有获胜组合,循环检查避免重复代码,逻辑更清晰。
  • 调用逻辑调整:不在CheckForWin内部直接执行重置,由调用方根据返回值触发后续操作,符合代码解耦原则。

内容的提问来源于stack exchange,提问作者Dylaka83

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:25:25