【问题标题】:How to Determine Whose Turn it is in a Game of Tic Tac Toe in Visual Basic如何在 Visual Basic 的井字游戏中确定轮到谁了
【发布时间】:2014-04-09 21:00:21
【问题描述】:

我正在用 Visual Basic 创建一个井字游戏。我有很多问题,但我现在关注的是:

有2个玩家,一个是人,另一个是电脑。确定轮到谁的最简单方法是什么?我的意思是,很明显,一个玩家是 X,另一个是 O,所以我需要弄清楚如何确定轮到谁了,这样程序才能知道将哪个字母设置为按钮的文本。

这是我对这部分代码的内容,但它缺少说明它是否放置 X 或 O 的部分,因为这就是我的问题所在。

    Public Class Form1

Private _currentPlayer As String = "O"
Private _gameArray As String
Dim turn As Integer = 1
Private _gameArray1 As Object

Private Property gameArray(p1 As Integer, p2 As Integer) As String
    Get
        Return _gameArray
    End Get
    Set(value As String)
        _gameArray = value
    End Set
End Property

Private Property gameArray(i As Integer) As Object
    Get
        Return _gameArray1
    End Get
    Set(value As Object)
        _gameArray1 = value
    End Set
End Property

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    MessageBox.Show("Welcome to Tic Tac Toe! Would you like to play a game?")
End Sub

Private Function nextPlayer() As String

    If _currentPlayer.Equals("O") Then
        _currentPlayer = "X"
        Return "O"
    Else
        _currentPlayer = "O"
        Return "X"
    End If

End Function

Private Sub printView()
    Console.WriteLine(btn1.Text & "|" & btn2.Text & "|" & btn3.Text)
    Console.WriteLine("----------------")
    Console.WriteLine(btn4.Text & "|" & btn5.Text & "|" & btn6.Text)
    Console.WriteLine("----------------")
    Console.WriteLine(btn7.Text & "|" & btn8.Text & "|" & btn9.Text)
End Sub

Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
    Console.WriteLine(e.KeyChar)

    Select Case e.KeyChar
        Case "1"
            btn1.Text = "X"
        Case "2"
            btn2.Text = "X"
        Case "3"
            btn3.Text = "X"
        Case "4"
            btn4.Text = "X"
        Case "5"
            btn5.Text = "X"
        Case "6"
            btn6.Text = "X"
        Case "7"
            btn7.Text = "X"
        Case "8"
            btn8.Text = "X"
        Case "9"
            btn9.Text = "X"
    End Select
    printView()
End Sub

Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click
    If turn = 1 Or 3 Or 5 Or 7 Or 9 Then
        btn1.Text = "X"
        gameArray(0, 0) = "X"
        checkwin()
    ElseIf (Not String.IsNullOrEmpty(btn1.Text)) Then
        MessageBox.Show("This position has already been taken, please select an empty square.")
    Else
        btn1.Text = "O"
    End If
    turn += 1
End Sub

Private Sub btn2_Click(sender As Object, e As EventArgs) Handles btn2.Click
    If turn = 1 Or 3 Or 5 Or 7 Or 9 Then
        btn2.Text = "X"
        gameArray(0, 2) = "X"
        checkwin()
    ElseIf (Not String.IsNullOrEmpty(btn1.Text)) Then
        MessageBox.Show("This position has already been taken, please select an empty square.")
    Else
        btn2.Text = "O"
    End If
    turn += 1
End Sub

Private Sub btn3_Click(sender As Object, e As EventArgs) Handles btn3.Click
    If turn = 1 Or 3 Or 5 Or 7 Or 9 Then
        turn = 3
        btn3.Text = "X"
        gameArray(1, 0) = "X"
        checkwin()
    ElseIf (Not String.IsNullOrEmpty(btn1.Text)) Then
        MessageBox.Show("This position has already been taken, please select an empty square.")
    Else
        btn3.Text = "O"
    End If

End Sub

Private Sub btn4_Click(sender As Object, e As EventArgs) Handles btn4.Click
    If Not String.IsNullOrEmpty(btn4.Text) Then
        MessageBox.Show("This position has already been taken, please select an empty square.")
    Else
        btn4.Text = nextPlayer()
        gameArray(1, 0) = nextPlayer()
        checkwin()
    End If
End Sub

Private Sub btn5_Click(sender As Object, e As EventArgs) Handles btn5.Click
    If Not String.IsNullOrEmpty(btn5.Text) Then
        MessageBox.Show("This position has already been taken, please select an empty square.")
    Else
        btn5.Text = nextPlayer()
        gameArray(1, 1) = nextPlayer()
        checkwin()
    End If
End Sub

Private Sub btn6_Click(sender As Object, e As EventArgs) Handles btn6.Click
    If Not String.IsNullOrEmpty(btn6.Text) Then
        MessageBox.Show("This position has already been taken, please select an empty square.")
    Else
        btn6.Text = nextPlayer()
        gameArray(1, 2) = nextPlayer()
        checkwin()
    End If
End Sub

Private Sub btn7_Click(sender As Object, e As EventArgs) Handles btn7.Click
    If Not String.IsNullOrEmpty(btn7.Text) Then
        MessageBox.Show("This position has already been taken, please select an empty square.")
    Else
        btn7.Text = nextPlayer()
        gameArray(2, 0) = nextPlayer()
        checkwin()
    End If
End Sub

Private Sub btn8_Click(sender As Object, e As EventArgs) Handles btn8.Click
    If Not String.IsNullOrEmpty(btn8.Text) Then
        MessageBox.Show("This position has already been taken, please select an empty square.")
    Else
        btn8.Text = nextPlayer()
        gameArray(2, 1) = nextPlayer()
        checkwin()
    End If
End Sub

Private Sub btn9_Click(sender As Object, e As EventArgs) Handles btn9.Click
    If Not String.IsNullOrEmpty(btn9.Text) Then
        MessageBox.Show("This position has already been taken, please select an empty square.")
    Else
        btn9.Text = nextPlayer()
        gameArray(2, 2) = nextPlayer()
        checkwin()
    End If
End Sub

Private Sub checkwin()

    If (btn1.Text = "X") And (btn2.Text = "X") And (btn3.Text = "X") Then MsgBox("X WINS!")
    If (btn4.Text = "X") And (btn5.Text = "X") And (btn6.Text = "X") Then MsgBox("X WINS!")
    If (btn7.Text = "X") And (btn8.Text = "X") And (btn9.Text = "X") Then MsgBox("X WINS!")
    If (btn1.Text = "X") And (btn4.Text = "X") And (btn7.Text = "X") Then MsgBox("X WINS!")
    If (btn2.Text = "X") And (btn5.Text = "X") And (btn8.Text = "X") Then MsgBox("X WINS!")
    If (btn3.Text = "X") And (btn6.Text = "X") And (btn9.Text = "X") Then MsgBox("X WINS!")
    If (btn1.Text = "X") And (btn5.Text = "X") And (btn9.Text = "X") Then MsgBox("X WINS!")
    If (btn3.Text = "X") And (btn5.Text = "X") And (btn7.Text = "X") Then MsgBox("X WINS!")

    If (btn1.Text = "O") And (btn2.Text = "O") And (btn3.Text = "O") Then MsgBox("O WINS!")
    If (btn4.Text = "O") And (btn5.Text = "O") And (btn6.Text = "O") Then MsgBox("O WINS!")
    If (btn7.Text = "O") And (btn8.Text = "O") And (btn9.Text = "O") Then MsgBox("O WINS!")
    If (btn1.Text = "O") And (btn4.Text = "O") And (btn7.Text = "O") Then MsgBox("O WINS!")
    If (btn2.Text = "O") And (btn5.Text = "O") And (btn8.Text = "O") Then MsgBox("O WINS!")
    If (btn3.Text = "O") And (btn6.Text = "O") And (btn9.Text = "O") Then MsgBox("O WINS!")
    If (btn1.Text = "O") And (btn5.Text = "O") And (btn9.Text = "O") Then MsgBox("O WINS!")
    If (btn3.Text = "O") And (btn5.Text = "O") And (btn7.Text = "O") Then MsgBox("O WINS!")
End Sub


End Class

【问题讨论】:

    标签: arrays vb.net tic-tac-toe


    【解决方案1】:

    在主类中有一个私有变量:

    Private _currentPlayer as String = "O"
    

    这会将初始玩家设置为O

    然后有一个简单的函数在XO输出之间翻转:

    Private Function nextPlayer() As String
    
        If _currentPlayer.Equals("O") Then
            _currentPlayer = "X"
            Return "O"
        Else
            _currentPlayer = "O"
            Return "X"
        End If
    
    End Function
    

    然后改变你的函数来使用这个新的助手:

    Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click
        If btn1.Text <> Nothing Then
            btn1.Text = nextPlayer()
             gameArray(0, 0) = nextPlayer()
        Else
            MessageBox.Show("This position has already been taken, please select an empty square.")
        End If
    End Sub
    

    【讨论】:

    • 我实现了这个,但是现在当我运行程序时,当我点击表单上的任何按钮时,我得到“这个位置已经被占用”的消息,任何想法可能导致这个?
    • 我认为你的每一个棋盘格都是一个单独的按钮?
    • 是的,我有 9 个独立的按钮。
    • 好的,所以你也有 9 个独立的按钮处理函数?
    • 确保它们在整个处理程序中都具有正确的btn1btn2btn3 等,并可能将If btn1.Text &lt;&gt; Nothing Then 更改为If Not String.IsNullOrEmpty(btn1.Text) Then,以确保您再次拥有正确的按钮编号每个处理程序。
    【解决方案2】:

    我建议将玩家存储在一个数组中,并引用第一个玩家。

    对不起,我记不太清楚 VB 语法了:

    Private _players As List Of Player

    初始化时

    _players.Add(new HumanPlayer(...))
    _players.Add(new ComputerPlayer(...))

    然后存储对当前正在播放的任何一个的引用,可能带有一个推进回合的EndTurn() 函数。

    Private currentPlayer as IPlayer = _players.First()

    然后是一个小函数将其推进到下一个玩家。

    为我的代码无效 VB 道歉我已经多年没有做过任何 VB 了。

    这种模式使您的程序更灵活、更易于阅读,如果您的类和接口正确,它还解决了关注点分离问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 2020-07-12
      • 2017-02-16
      • 1970-01-01
      • 2023-01-08
      相关资源
      最近更新 更多