Применение базовых стратегий решения задач для программирования игр двух лиц с полной информацией., страница 2

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),