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

draw(L,C).

%----------------------------------------------------------------------- 

readpos(Lx, Lo, X, Y, Pos):-ocenka(p(X,Y), Lx, Lo, _),

Xc=40+X, Yc=10-Y, cursor(Yc, Xc),

readchar(C),

move(C, X, Y, Lx, Lo, Pos).

%----------------------------------------------------------------------move(0, X, Y, Lx, Lo, Pos):-readchar(C),                              %begin

move(C, X, Y, Lx, Lo, Pos),!.

move('\77', X, Y, Lx, Lo, Pos):-X<35, X1=X+1, readpos(Lx, Lo, X1, Y, Pos).   %стрелка вправо

move('\77', X, Y, Lx, Lo, Pos):-X>=35, readpos(Lx, Lo, X, Y, Pos).           %правая граница

move('\75', X, Y, Lx, Lo, Pos):-X>-35, X1=X-1, readpos(Lx, Lo, X1, Y, Pos).  %стрелка влево

move('\75', X, Y, Lx, Lo, Pos):-X<=-35, readpos(Lx, Lo, X, Y, Pos).          %левая граница

move('\72', X, Y, Lx, Lo, Pos):-Y<10, Y1=Y+1, readpos(Lx, Lo, X, Y1, Pos).   %стрелка вверх

move('\72', X, Y, Lx, Lo, Pos):-Y>=10, readpos(Lx, Lo, X, Y, Pos).           %граница верха

move('\80', X, Y, Lx, Lo, Pos):-Y>-10, Y1=Y-1, readpos(Lx, Lo, X, Y1, Pos).  %стрелка вниз

move('\80', X, Y, Lx, Lo, Pos):-Y<=-10, readpos(Lx, Lo, X, Y, Pos).     

move(27,_,_,_,_,_):- exit.                               %если нажали «Esc»

move(13, X, Y, Lx, Lo, p(X,Y)):-                         %клавиша Enter (позиция свободна)

not(member(p(X,Y), Lx, _)),

not(member(p(X,Y), Lo, _)),

Xc=40+X, Yc=10-Y, cursor(Yc, Xc), write("X").

move(13, X, Y, Lx, Lo, Pos):-                            %клавиша Enter (позиция занята)

member(p(X,Y), Lx, _), readpos(Lx, Lo, X, Y, Pos);

member(p(X,Y), Lo, _), readpos(Lx, Lo, X, Y, Pos).

%----------------------------------------------------------------------- 

win(X, L, x):-longest(X, L, N), N>4,

makewindow(2,141,-8,"",2,35,3,15),

write("Победили"),

sleep(500),

makewindow(1,141,-8,"Игра: крестики-нолики",0,0,25,80),

exit(1).

win(X, L, o):-longest(X, L, N), N>4,

makewindow(2,141,-8,"",2,35,3,15),

write("Проиграли"),

sleep(500),

makewindow(1,141,-8,"Игра: крестики-нолики",0,0,25,80),

exit(1).

win(_,_,_).

%----------------------------------------------------------------------- 

find([], _, []):-!.

find([p(X,Y)|P], L, [p(X1,Y)|P2]):-                      %направление направо

X<30, X1=X+1, not(member(p(X1,Y),L,_)),

find([p(X,Y)|P], [p(X1,Y)|L], P2),!.

find([p(X,Y)|P], L, [p(X1,Y)|P2]):-                      %направление влево

X>=-30, X1=X-1, not(member(p(X1,Y),L,_)),

find([p(X,Y)|P], [p(X1,Y)|L], P2),!.                                     

find([p(X,Y)|P], L, [p(X,Y1)|P2]):-                      %направление вверх

Y<10, Y1=Y+1, not(member(p(X,Y1),L,_)),

find([p(X,Y)|P], [p(X,Y1)|L], P2),!.             

find([p(X,Y)|P], L, [p(X,Y1)|P2]):-                      %направление вниз

Y>=-10, Y1=Y-1, not(member(p(X,Y1),L,_)),

find([p(X,Y)|P], [p(X,Y1)|L], P2),!. 

find([p(X,Y)|P], L, [p(X1,Y1)|P2]):-                     %направление вверх-направо

X<30, X1=X+1, Y<10, Y1=Y+1,

not(member(p(X1,Y1),L,_)),

find([p(X,Y)|P], [p(X1,Y1)|L], P2),!.

find([p(X,Y)|P], L, [p(X1,Y1)|P2]):-                     % направление вниз-налево

X>=-30, X1=X-1, Y>=-10, Y1=Y-1,

not(member(p(X1,Y1),L,_)),

find([p(X,Y)|P], [p(X1,Y1)|L], P2),!.                                     

find([p(X,Y)|P], L, [p(X1,Y1)|P2]):-                     % направление вниз-направо

X<30, X1=X+1, Y>=-10, Y1=Y-1,

not(member(p(X1,Y1),L,_)),

find([p(X,Y)|P], [p(X1,Y1)|L], P2),!. 

find([p(X,Y)|P], L, [p(X1,Y1)|P2]):-                     % направление вверх-налево

X>=-30, X1=X-1, Y<10, Y1=Y+1,

not(member(p(X1,Y1),L,_)),

find([p(X,Y)|P], [p(X1,Y1)|L], P2),!.                                    

find([_|P], L, P2):- find(P,L,P2).                       %получить следующее «семя»

%----------------------------------------------------------------------- 

best(Pos, [Pos], Lx, Lo, C):-ocenka(Pos, Lx, Lo, C), !.  %отдельный случай позиции

best(Pos, [P1|P], Lx, Lo, C):-                    %Pos лучше чем P1 из списка                         

ocenka(P1, Lx, Lo, C1),

best(Pos, P, Lx, Lo, C), max(C1, C, C),!. 

best(Pos, [Pos|P], Lx, Lo, C):-                   %Pos из списка лучше чем текущая позиция

ocenka(Pos, Lx, Lo, C),

best(_, P, Lx, Lo, C2),!,max(C,C2,C).

%----------------------------------------------------------------------goal

run.