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

