минимакс для крестиков-так-ноликов

Я пытаюсь решить крестики-так-нолики с помощью простого минимаксный алгоритм. Простой, но должен охватывать большую часть языка. Что у меня есть на данный момент:

Доска представлена ​​в виде массива из 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 если победит человек, то это легко). Я просто понятия не имею, как это реализовать, и все примеры, которые я нахожу в сети, довольно сложны и плохо объяснены.

Примечание. Меня устраивает n^2 или худшее поведение во время выполнения. -Дело не в эффективности. И да, я знаю, как писать минимакс на lisp, python, java -, но понятия не имею, как «перенести» этот код в пролог.

7
задан Voo 20 April 2012 в 14:46
поделиться