让它看起来像计算机在TicTacToe游戏中思考

时间:2012-10-20 22:49:56

标签: vb.net

这是我在VB.net中编写的一段代码

Private Sub L00_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles L00.Click, L01.Click, L02.Click, L03.Click, L10.Click, L11.Click, L12.Click, L13.Click, L20.Click, L21.Click, L22.Click, L23.Click, L30.Click, L31.Click, L32.Click, L33.Click
    Dim ticTac As Label = CType(sender, Label)
    Dim strRow As String
    Dim strCol As String

    'Once a move is made, do not allow user to change whether player/computer goes first, because it doesn't make sense to do so since the game has already started.
    ComputerFirstStripMenuItem.Enabled = False
    PlayerFirstToolStripMenuItem.Enabled = False

    'Check to make sure clicked tile is a valid tile i.e and empty tile.
    If (ticTac.Text = String.Empty) Then
        ticTac.Text = "X"
        ticTac.ForeColor = ColorDialog1.Color
        ticTac.Tag = 1


        'After the player has made his move it becomes the computers turn.
        computerTurn(sender, e)

    Else
        MessageBox.Show("Please pick an empty tile to make next move", "Invalid Move")
    End If
End Sub

Private Sub computerTurn(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Call Randomize()
    row = Int(4 * Rnd())
    col = Int(4 * Rnd())

    'Check to make sure clicked tile is a valid tile i.e and empty tile.
    If Not ticTacArray(row, col).Tag = 1 And Not ticTacArray(row, col).Tag = 4 Then
        ticTacArray(row, col).Text = "O"
        ticTacArray(row, col).ForeColor = ColorDialog2.Color
        ticTacArray(row, col).Tag = 4

        checkIfGameOver(sender, e)
    Else
        'Some good ole pseudo-recursion(doesn't require a base case(s)).
        computerTurn(sender, e)
    End If

End Sub

一切顺利,除了我试图让计算机在移动之前必须“思考”。所以我试图做的是在上面的代码中的不同位置放置一个System.Threading.Sleep()调用。

问题在于,程序不是让计算机看起来像它的想法,而是等待,然后将X和O放在一起。有人可以帮助我做到这一点,以便程序在我点击的任何地方放一个X然后在它放置O之前等待吗?

编辑:如果你们中的任何人想知道,我意识到计算机AI是非常愚蠢的,但它现在只是乱七八糟。稍后我将实施一个严肃的AI ..希望。

3 个答案:

答案 0 :(得分:1)

通常,此类问题的解决方案是设置计时器以稍后显示计算的计算机移动。问题是(通常)VB.NET不允许在代码运行时更新屏幕。因此,当您添加睡眠时,即使您已经告诉显示器显示播放器X,在睡眠后您的功能返回之前,屏幕实际上不会反映出来。

你必须在VB.NET中查找如何使用计时器对象(我不知道我头脑中的细节)。因为玩家移动和计算机移动之间会有时间,所以您还需要确保玩家在计算机获得机会之前无法移动两次(因此请更改变量)取决于轮到谁了。

答案 1 :(得分:1)

正如格雷格所说我会使用一个计时器,我会首先从你的计算机转动点击事件中取出逻辑并创建一个方法,你可以使用一个随机数生成器来使它看起来像计算机所想的那么多时间例如,您可以将Cursor更改为Wait Cursor。像这样:

Public Class Form1
    Dim rnd As Random = New Random(1)
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Me.Cursor = Cursors.WaitCursor
        Timer1.Interval = CInt(rnd.NextDouble * 1000)
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        Timer1.Stop()
        computerTurn()
    End Sub

    Private Sub computerTurn()
        Me.Cursor = Cursors.Default
       'Your Move Logic Here
    End Sub

End Class

答案 2 :(得分:0)

关注点分离。

构建一个方法,告诉您计算机想要做什么。让该方法尽可能高效地完成工作,并将整个结果返回给您的演示代码。这取决于演示级别,然后决定如何处理该移动,其中可能包括等待或动画化某些内容以使计算机正在思考。