0

だから私はプログラミングクラスのためにTicTacToeゲームを作ろうとしてきましたが、先生は役に立たないです。:l

プログラムを実行すると、10回のうち8回。再生してグリッドがほぼいっぱいになると、フリーズします。説明するのは少し難しいです、そして私は本当に疲れています。誰かが助けてくれることを願っています。:s

コード:

    Private Sub ChooseBox()
    Dim num As Integer
    Dim Random As New Random
    num = Random.Next(0, 10)

    If Grid_1.Text <> "" And Grid_2.Text <> "" And Grid_3.Text <> "" And Grid_4.Text <> "" And Grid_5.Text <> "" And Grid_6.Text <> "" And Grid_7.Text <> "" And Grid_8.Text <> "" And Grid_9.Text <> "" Then
        gStatus = "Tie"
        Me.Text = "Tic Tac Toe - Nobody won!"
    Else
        If num = 1 And Grid_1.Text = "" Then
            Grid_1.Text = compChar : turnIs = "Player"
        ElseIf num = 2 And Grid_2.Text = "" Then
            Grid_2.Text = compChar : turnIs = "Player"
        ElseIf num = 3 And Grid_3.Text = "" Then
            Grid_3.Text = compChar : turnIs = "Player"
        ElseIf num = 4 And Grid_4.Text = "" Then
            Grid_4.Text = compChar : turnIs = "Player"
        ElseIf num = 5 And Grid_5.Text = "" Then
            Grid_5.Text = compChar : turnIs = "Player"
        ElseIf num = 6 And Grid_6.Text = "" Then
            Grid_6.Text = compChar : turnIs = "Player"
        ElseIf num = 7 And Grid_7.Text = "" Then
            Grid_7.Text = compChar : turnIs = "Player"
        ElseIf num = 8 And Grid_7.Text = "" Then
            Grid_8.Text = compChar : turnIs = "Player"
        ElseIf num = 9 And Grid_9.Text = "" Then
            Grid_9.Text = compChar
        Else : ChooseBox()
        End If
    End If
End Sub

Private Sub CheckResult()

    'First Column is filled
    If Grid_1.Text = compChar And Grid_2.Text = compChar And Grid_3.Text = compChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Computer Wins!"
    ElseIf Grid_1.Text = playerChar And Grid_2.Text = playerChar And Grid_3.Text = playerChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Player Wins!"
    End If

    'Second Column is filled
    If Grid_4.Text = compChar And Grid_5.Text = compChar And Grid_6.Text = compChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Computer Wins!"
    ElseIf Grid_4.Text = playerChar And Grid_5.Text = playerChar And Grid_6.Text = playerChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Player Wins!"
    End If

    'Third Column is filled
    If Grid_7.Text = compChar And Grid_8.Text = compChar And Grid_9.Text = compChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Computer Wins!"
    ElseIf Grid_7.Text = playerChar And Grid_8.Text = playerChar And Grid_9.Text = playerChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Player Wins!"
    End If

    'First Row is filled
    If Grid_1.Text = compChar And Grid_4.Text = compChar And Grid_7.Text = compChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Computer Wins!"
    ElseIf Grid_1.Text = playerChar And Grid_4.Text = playerChar And Grid_7.Text = playerChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Player Wins!"
    End If

    'Second Row is filled
    If Grid_2.Text = compChar And Grid_5.Text = compChar And Grid_8.Text = compChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Computer Wins!"
    ElseIf Grid_2.Text = playerChar And Grid_5.Text = playerChar And Grid_8.Text = playerChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Player Wins!"
    End If

    'Third Row is filled
    If Grid_3.Text = compChar And Grid_6.Text = compChar And Grid_9.Text = compChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Computer Wins!"
    ElseIf Grid_3.Text = playerChar And Grid_6.Text = playerChar And Grid_9.Text = playerChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Player Wins!"
    End If

    'Diagonal Upwards is filled
    If Grid_1.Text = compChar And Grid_5.Text = compChar And Grid_9.Text = compChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Computer Wins!"
    ElseIf Grid_1.Text = playerChar And Grid_5.Text = playerChar And Grid_9.Text = playerChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Player Wins!"
    End If

    'Diagonal Downwards is filled
    If Grid_3.Text = compChar And Grid_5.Text = compChar And Grid_7.Text = compChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Computer Wins!"
    ElseIf Grid_3.Text = playerChar And Grid_5.Text = playerChar And Grid_7.Text = playerChar Then
        gStatus = "Won"
        Me.Text = "Tic Tac Toe - Player Wins!"
    End If
End Sub
4

2 に答える 2

2

私が見る3つの問題:

num = Random.Next(0, 10)

Random.Next は下限を含み、上限を含まない。これは、コンピューターがここで 0 をロールできることを意味します。これはループを引き起こしませんが、条件で 0 を受け入れないため、少し無駄です。

ElseIf num = 9 And Grid_9.Text = "" Then
    Grid_9.Text = compChar

ここでは、パターンに制御を Player に戻すことは含まれていません。このシナリオでは、コンピューターは 2 ターンかかると思います。

ElseIf num = 8 And Grid_7.Text = "" Then
    Grid_8.Text = compChar : turnIs = "Player"

これはおそらくループの問題です。コンピューターが 8 を出したら、グリッド 7 の内容をチェックしていることに注意してください。したがって、グリッド 8 が最後のスペースである場合、常に別の ChooseBox() 呼び出しに失敗します。ループは解決されません。

于 2012-08-31T15:17:39.253 に答える
0

あなたは無限の選択が可能な状況に備えました。各セルの数を含むリストを使用することをお勧めします。

Dim cells As New List(Of String)()
cells.Add("1")
cells.Add("2")
...
cells.Add("9")

次に、特定のセルを使い果たしたら、リストから削除します。

ElseIf num = 5 And Grid_5.Text = "" Then
    Grid_5.Text = compChar
    turnIs = "Player"
    cells.RemoveAt(num - 1)  ' Remove the cell at the index in the List
ElseIf num = 6 And Grid_6.Text = "" Then
    ...

これにより、選択したランダムを反復処理できます。

Dim Random As New Random
num = Random.Next(0, cells.Count - 1)  ' This will only allow choices within range

そうすれば、メソッドが呼び出されるたびに、ChooseBox()ランダムに選択されたインデックスが使用可能であることを確認できます。Text = ""これにより、チェックの必要性も減少する可能性があります。

注: 読みやすくするために、この:文字を使用すると 1 行に複数行のコードを記述できることを忘れておくこともお勧めします。その行が単一の命令または条件付きの then 命令でない限り、コードがかさばることになります。

于 2012-08-31T15:18:24.057 に答える