Комп и человек ходят числами (допустимые числа задаются),
эти числа суммируются до 20 (или допустимо чуть выше, если нет подходящего числа).
% факты-выигрышные ходы т.е. после хода
% человека комп стремится к этим числам
% 4
vicmove(1, 3).
vicmove(2, 2).
vicmove(3, 1).
% 8
vicmove(1, 7).
vicmove(2, 6).
vicmove(3, 5).
% 12
vicmove(1, 11).
vicmove(2, 10).
vicmove(3, 9).
% 16
vicmove(1, 15).
vicmove(2, 14).
vicmove(3, 13).
% 20
vicmove(1, 19).
vicmove(2, 18).
vicmove(3, 17).
% победные очки
% можно превышать, если нужного хода нет в случае произвольного числа
victory(W):-20=
% запускной предикат: ввод конечного числа и списка допустимых ходов
game:-
write('Введите конечное число: '), nl,
read(END),nl, %запрос максимально достижимого числа
write('Введите список допустимых ходов в виде [1,2,3]: '), nl,
read(LIST),nl, %запрос списка допустимых ходов
main(0, END, LIST). %0-начальные очки
% основная программа
main(S1, E, L):- %S1-очки, Е-конечное число, L-список
write('Ваш ход: '),
read(X),nl, %запрос хода игрока
checkmove(S1, X, E, L). %проверка хода Х-ход игрока
% ход компьютера
compmove(Y, X, L):-member(Y, L), % Y-ход компьютера
vicmove(Y, X). % комп ходит только выигрышные ходы
% проверка хода
checkmove(S1, X, E, L):- (not(member(X, L)), % если ход не входит в список,
write('Недопустимый ход'), nl, % запрашиваем снова
main(S1, E, L));
(member(X, L),
A is S1 + X, % А-сумма очков после хода игрока
write(A), nl,
not(win(A, 0)), % пока не победили идем дальше
compmove(Y, A, L), % ходит компьютер
write('Ходит комп:'),
write(Y), nl,
B is A + Y, % В-сумма очков после хода компа
write('Текущая сумма: '),
write(B),nl,
not(win(B, 1)), % пока не победили идем дальше
main(B, E, L)). % цикл повторяется
% определяем победителя
win(A, 0):-victory(A), % 0-означает человека
write('Победа человека!'),!.
win(A, 1):-victory(A), % соотв.: 1-комьютер
write('Победа компа!'),!.
|