Я пытаюсь решить крестики-так-нолики с помощью простого минимаксный алгоритм. Простой, но должен охватывать большую часть языка. Что у меня есть на данный момент:
Доска представлена в виде массива из 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 -, но понятия не имею, как «перенести» этот код в пролог.