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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.