Я пытаюсь решить tic-tac-toe с помощью простого минимаксного алгоритма. Простой, но должен охватывать много языка. Что я до сих пор:минимакс для tic-tac-toe
Плата представлена в виде массива из 9 (несвязанных) переменных, которые либо установлены на x
, либо o
.
Условие выигрыша тогда в основном: win(Player, [X1,X2,X3|_]) :- X1==Player,X2==Player,X3==Player.
и т. Д. Для всех восьми вариантов. draw просто проверяет, связаны ли все переменные.
Переводы также просты: move(Player, [X|_], 0, 0) :- var(X), X=Player.
, снова для всех возможных позиций (я оставлю код повторно открытым для более поздней программы :)).
Теперь я могу сгенерировать все возможные ходы простым обратным следом: move(Player, Board, X, Y).
, который должен в основном быть всем, что мне нужно для минимакса (очевидно, простая функция утилиты, которая возвращает 1, если компьютер выигрывает, 0 в случае ничьей и -1 if человек побеждает, это легко). Я просто не знаю, как его реализовать, и все примеры, которые я нахожу в сети, довольно сложны и не совсем понятны.
Примечание. Я в порядке с n^2 или худшим поведением во время исполнения - это действительно не эффективность. И да, я знаю, как писать минимакс в lisp, python, java - просто не знаю, как «переносить» этот код в пролог.
См. Http://stackoverflow.com/a/8436788/502187 –