Вопрос

Я получаю более знакомую с VBA, и я пытаюсь сделать программу обучения машины для Tic Tac Toe. Я не хочу просто сложный код возможности выиграть.

Лучшее, что я придумал для программы обучения машины - это иметь структуру дерева со всеми возможными движениями, которые могут быть выполнены, а затем иметь разрезные ветви дерева, когда он теряет с этой веткой. .

Например, со следующим способом обозначать, где играли люди, и заказ буквы написаны как заказ, прогрессировал игру

a|b|c
-----
d|e|f
-----
g|h|i
.

abdgfce - означает, что компьютер выигрывает, A был сыгран первым, B вторым, d третий ....

Я хотел бы иметь дерево данных, которое выглядит как:

Уровень 0: A (компьютер всегда начинается с A)

Уровень 1: Все буквы, кроме как это уже было воспроизведено

Уровень 2: для каждой буквы на уровне 0, все буквы, кроме одного прямо перед ним и A

и так далее для всех уровней дерева до тех пор, пока их не более возможных движений.

Я пытался искать способы реализации этой структуры в VBA, но веб-сайт Microsoft не помогал, и форумы говорят только о двоичных или сортировке деревьев. Кто-нибудь укажет меня в правильном направлении или дать мне некоторые указатели относительно того, что я должен попробовать? Какой лучший способ решить эту проблему, если это решение не осуществимо?

Спасибо,

karim

Это было полезно?

Решение

Есть «только« 362,880 способ заполнить девять мест в таблице Tic-Tac-Tace.Полный набор может быть сгенерирован в столбце A , разместив:

abcdefghi

в ячейке B1 и работает GetString ():

Dim ll As Long
Dim CurrentRow As Long

Sub GetString()
    Dim InString As String
    InString = Sheets("Sheet1").Range("B1")
    ActiveSheet.Columns(1).Clear
    CurrentRow = 1
    Application.ScreenUpdating = False
        Call GetPermutation("", InString)
    Application.ScreenUpdating = True
End Sub

Sub GetPermutation(x As String, y As String)
    '   The source of this algorithm is unknown
    Dim i As Long, j As Long
    j = Len(y)
    If j < 2 Then
        Cells(CurrentRow, 1) = x & y
        CurrentRow = CurrentRow + 1
    Else
        For i = 1 To j
            Call GetPermutation(x + Mid(y, i, 1), _
            Left(y, i - 1) + Right(y, j - i))
        Next
    End If
End Sub
.

xx

Конечно, большинство игр закончится до того, как все девять мест заполнены.Если компьютер проигрывает, этот элемент удален и т. Д.

Редактировать # 1:

Wayne G. Dunn предложил, чтобы количество вариаций может быть уменьшено.Компьютер (проигрыватель № 1) имеет девять возможных мест, которые он размещает X. PLAYER # 2, а затем имеет восемь возможных мест для размещения ее O. ETC.

Это дает 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 или 9 факторов.

Однако игра может закончиться, прежде чем все девять мест заполнены.Таким образом, многие из вариаций 362880 могут быть отброшены ............ Я просто не знаю, сколько.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top