4

これが私が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を実装します。うまくいけば。

4

3 に答える 3

1

一般に、この種の問題の解決策は、計算されたコンピューターの動きを後で表示するタイマーを設定することです。問題は、(一般的に)VB.NETでは、コードの実行中に画面を更新できないことです。したがって、スリープを追加すると、プレーヤーXを表示するようにディスプレイに既に指示している場合でも、スリープ後、関数が戻るまで、画面には実際にはそれが反映されません。

VB.NETでタイマーオブジェクトを使用する方法を調べる必要があります(頭のてっぺんから詳細がわかりません)。プレーヤーが移動してからコンピューターが移動するまでに時間がかかるため、コンピューターがチャンスを得る前にプレーヤーが2回移動できないようにする必要もあります(したがって、順番に応じて変化する変数を作成します)。 。

于 2012-10-20T23:06:00.347 に答える
1

グレッグがタイマーを使用すると言ったように、最初にコンピューターからロジックを取り出し、クリックイベントを回してメソッドを作成します。乱数ジェネレーターを使用して、コンピューターが変化していると考えられていた時間の長さのように見せることができます。たとえば、カーソルを待機カーソルに変更できます。このようなもの:

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
于 2012-10-20T23:17:16.457 に答える
0

関心事の分離。

コンピューターがどのような動きをしたいかを示すメソッドを作成します。そのメソッドに可能な限り効率的に仕事をさせ、結果全体をプレゼンテーションコードに戻します。その動きをどうするかを決めるのはプレゼンテーションレベル次第です。これには、コンピュータが考えているように見せるために何かを待つかアニメーション化することが含まれる場合があります。

于 2012-10-20T23:20:25.767 に答える