game([],[]).%запускаем игру с пустых списков ходов
%----------------------------------------------------------------------game(Lx,Lo):- %Lx-список ходов «крестика»,Lo-«нолика»
cursor(10,40),
readpos(Lx, Lo, 0, 0, PosX), %получение позиции «крестика»
win(PosX, Lx, x), %проверка на выигрыш игрока
append([PosX|Lx],Lo,L), %добавить ход «крестика» в список Lx
find(L, L, Legalpos), %нахождение всех корректных ходов для «нолика»
best(PosO, Legalpos, [PosX|Lx], Lo, _), %нахождение лучшей позиции для «крестика» из списка корректных ходов
draw(Lx,'X'), %изображаем «крестик»
draw([PosO|Lo],'O'), %изображаем «нолик»
win(PosO, Lo, o), %проверка на выигрыш компьютера
game([PosX|Lx], [PosO|Lo]). %никто не выиграл->продолжаем игру
%----------------------------------------------------------------------%нахождение того списка, в котором Х встречается, а в другом - нет
member(X,[X|L],L):-!.
member(Y,[X|L],[X|L2]):-member(Y,L,L2).
%----------------------------------------------------------------------max(X,Y,R):-X>Y,R=X.
max(X,Y,R):-X<=Y, R=Y.
%----------------------------------------------------------------------%добавить первый элемент в конец списка последнего элемента
%----------------------------------------------------------------------append([],X,X).
append([X|X1],Y,[X|Y1]):-append(X1,Y,Y1).
%----------------------------------------------------------------------hr(_,[],1).%если только начали игру=1
hr(p(X,Y), L, N):- X1=X+1, member(p(X1,Y), L, L2),
hr(p(X1,Y), L2, N2), N=N2+1, !.
hr(p(X,Y), [_|L], 1):- X1=X+1, not(member(p(X1,Y), L, _)).
%----------------------------------------------------------------------hl(_,[],1).
hl(p(X,Y), L, N):- X1=X-1, member(p(X1,Y), L, L2),
hl(p(X1,Y), L2, N2), N=N2+1, !.
hl(p(X,Y), [_|L], 1):- X1=X-1, not(member(p(X1,Y), L, _)).
%-----------------------------------------------------------------------
h(_, [], 1):-!.
h(X, L, N):- hr(X, L, N1), hl(X, L, N2), N=N1+N2-1.
%-----------------------------------------------------------------------
vu(_,[],1).
vu(p(X,Y), L, N):- Y1=Y+1, member(p(X,Y1), L, L2),
vu(p(X,Y1), L2, N2), N=N2+1, !.
vu(p(X,Y), [_|L], 1):- Y1=Y+1, not(member(p(X,Y1), L, _)).
%----------------------------------------------------------------------vd(_,[],1):-!.
vd(p(X,Y), L, N):- Y1=Y-1, member(p(X,Y1), L, L2),
vd(p(X,Y1), L2, N2), N=N2+1, !.
vd(p(X,Y), [_|L], 1):- Y1=Y-1, not(member(p(X,Y1), L, _)).
%-----------------------------------------------------------------------
v(_, [], 1):-!.
v(X, L, N):- vu(X, L, N1), vd(X, L, N2), N=N1+N2-1.
%----------------------------------------------------------------------%диагональный
%----------------------------------------------------------------------drf(_,[],1):-!.
drf(p(X,Y), L, N):- X1=X+1, Y1=Y+1, member(p(X1,Y1), L, L2),
drf(p(X1,Y1), L2, N2), N=N2+1, !.
drf(p(X,Y), [_|L], 1):- X1=X+1, Y1=Y+1, not(member(p(X1,Y1), L, _)).
drb(_,[],1):-!.
drb(p(X,Y), L, N):- X1=X-1, Y1=Y-1, member(p(X1,Y1), L, L2),
drb(p(X1,Y1), L2, N2), N=N2+1, !.
drb(p(X,Y), [_|L], 1):- X1=X-1, Y1=Y-1, not(member(p(X1,Y1), L, _)).
dr(_, [], 1):-!.
dr(X, L, N):- drf(X, L, N1), drb(X, L, N2), N=N1+N2-1.
dlf(_,[],1):-!.
dlf(p(X,Y), L, N):- X1=X-1, Y1=Y+1, member(p(X1,Y1), L, L2),
dlf(p(X1,Y1), L2, N2), N=N2+1, !.
dlf(p(X,Y), [_|L], 1):- X1=X-1, Y1=Y+1, not(member(p(X1,Y1), L, _)).
dlb(_,[],1):-!.
dlb(p(X,Y), L, N):- X1=X+1, Y1=Y-1, member(p(X1,Y1), L, L2),
dlb(p(X1,Y1), L2, N2), N=N2+1, !.
dlb(p(X,Y), [_|L], 1):- X1=X+1, Y1=Y-1, not(member(p(X1,Y1), L, _)).
dl(_, [], 1):-!.
dl(X, L, N):- dlf(X, L, N1), dlb(X, L, N2), N=N1+N2-1.
%----------------------------------------------------------------------longest(X, Lx, N):-h(X, Lx, Nhx),
v(X, Lx, Nvx),
dr(X, Lx, Ndrx),
dl(X, Lx, Ndlx),
max(Nhx,Nvx,M1),
max(Ndrx, Ndlx, M2),
max(M1, M2, N).
%-----------------------------------------------------------------------
ocenka(X, _, Lo, N):- longest(X, Lo, M), M>4, N=1001, !. %позиция победителя-наивысший приоритет
ocenka(X, Lx, _, N):- longest(X, Lx, M), M>4,N=999, !. %
ocenka(X, Lx, Ly, N):-longest(X, Lx, M0),longest(X, Ly, N0), N=M0*M0+N0*N0, !. %общий случай
%-----------------------------------------------------------------------
draw([],_).
draw([p(X,Y)|L],C):-X1=40+X, Y1=10-Y, cursor(Y1, X1), write(C),
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.