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
相关产品推荐
相关产品推荐

