TicTacToe AI, принимающий неправильные решения

Подробно остановиться на объяснении nosklo:

a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[tuple(b)] = 'some' # this will, same as a['some', 'list']
10
задан Jon Seigel 22 May 2010 в 23:36
поделиться

4 ответа

@echo off

set x=42
set y=5

set /a z = 100 * x / y

echo %z%

Команда set / a позволяет присвоить результат математического выражения переменной (при этом % вокруг переменной имена в этих выражениях не требуются). См. set /? для получения списка поддерживаемых операторов и подробностей.

Обратите внимание, что командные файлы Windows не поддерживают арифметику с плавающей запятой, поэтому, если результатом выражения является дробное число, только целая часть будут засчитаны. Например, 3/2 вычисляется как 1 и 2/3 как 0 .

org / wiki / Minimax
14
ответ дан 3 December 2019 в 16:10
поделиться

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

Итак, в основном, отбросьте любую ветвь, где следующий ход игроков может привести к ситуации, в которой ничья может быть невозможна, а затем запустите существующий алгоритм. Это приводит к наивысшим шансам на победу над несовершенным противником, исключая при этом возможность проиграть.

8
ответ дан 3 December 2019 в 16:10
поделиться

"Наивный" способ сделать это (для произвольной игры, в которой два игрока по очереди делают ход) состоит в том, чтобы рекурсивно пробовать каждый возможный ход, пока не получите доску, где один из победитель, затем вернитесь вверх по дереву, помечая узлы как «O побед», «X побед» или «ничья».

Каждый раз, когда вы делаете шаг вперед (один такой шаг обычно называется слоем), в зависимости от того, кто ход, предположим, что игрок выбирает тот ход, который лучше для него / нее. Поскольку вы двигаетесь от листьев и вверх, вы всегда будете знать оптимальные возможные результаты для каждого дочернего узла.

Подсчитывая число возможных выигрышных или проигрышных досок в поддереве, вы по существу предполагаете что каждый игрок всегда будет делать случайный ход. Как вы отметили, это будет не очень эффективно, если вы будете играть против умного игрока. Схема, которую я обрисовал выше, вместо этого предполагает, что противник всегда делает идеальный ход, пытаясь выиграть.

0
ответ дан 3 December 2019 в 16:10
поделиться

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

Если вы хотите продолжать использовать ваш текущий алгоритм, делать то, что предлагает патрос, и минимизировать возможность проигрыша при каждом решении.

Если вы хотите более простой подход, пусть ИИ делает следующее каждый ход:

  1. Завершите выигрышный крестик-нолик -Игрушка, если возможно.
  2. Заблокируйте крестики-нолики противника, если возможно.
  3. Оцените каждый квадрат на предмет его желательности, для каждого другого квадрата, взятого (ИИ) на линии, добавьте за это один балл желательности площадь. За каждую клетку, занятую противником, удаляйте одно очко желательности.

    Например, если доска в настоящее время:

     _ | O | X 

    Если вы хотите продолжить использование вашего текущего алгоритма, делайте то, что предлагает патрос, и минимизируйте возможность проигрыша при каждом решении.

    Если вы хотите более простой подход, пусть ИИ делает следующее каждый ход:

    1. Завершить выигрышные крестики-нолики, если возможно.
    2. Блокируйте противоположные крестики-нолики, если возможно.
    3. Оцените каждый квадрат на предмет его желательности, для каждого другого квадрата, занятого (ИИ) на линии, добавьте один точка желательности для этого квадрата. За каждую клетку, занятую противником, удаляйте одно очко желательности.

      Например, если доска в настоящее время:

       _ | O | X 

      Если вы хотите продолжить использование вашего текущего алгоритма, делайте то, что предлагает патрос, и минимизируйте возможность проигрыша при каждом решении.

      Если вы хотите более простой подход, пусть ИИ каждый ход делает следующее:

      1. Завершить выигрышные крестики-нолики, если возможно.
      2. Блокируйте противоположные крестики-нолики, если возможно.
      3. Оцените каждый квадрат на предмет его желательности, для каждого другого квадрата, занятого (ИИ) на линии, добавьте один точка желательности для этого квадрата. За каждую клетку, занятую противником, удаляйте одно очко желательности.

        Например, если доска в настоящее время:

         _ | O | X 
      4. Заблокируйте крестики-нолики противника, если возможно.
      5. Оцените каждый квадрат на предмет его желательности, для каждого другого квадрата, взятого (ИИ) на линии, добавьте одно очко желательности для этого квадрата. За каждую клетку, занятую противником, убирайте одну точку желательности.

        Например, если доска в настоящее время:

         _ | O | X 
      6. Заблокируйте крестики-нолики противника, если возможно.
      7. Оцените каждый квадрат на предмет его желательности, для каждого другого квадрата, взятого (ИИ) на линии, добавьте одно очко желательности для этого квадрата. За каждую клетку, занятую противником, удаляйте одно очко желательности.

        Например, если доска в настоящее время:

         _ | O | X
        _ | X | _
        O | |
        

        Верхний левый угол имеет желательность 0 (1 для X в том же ряду и 1 для X на диагонали, но -1 для каждого из О).

      8. Играйте на наиболее желательном площадь. Произвольный разрыв ничьей.

        В примере, приведенном выше, ИИ выбрал бы середину правого квадрата, так как он имеет желаемое значение 2, что приведет к выигрышу на следующий ход.

      9. Если игра только началась. , сыграйте в центральном квадрате, если центральный квадрат занят, выберите случайный угол.

      10. Победа (или ничья).

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

4
ответ дан 3 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: