% ход ЭВМ
still(1):-evmhod.
still(0).
hod(X,Y,0):-mykl(kletka(pole(X,Y),0)),
retract(mykl(kletka(pole(X,Y),_)),mypole), % промах
assert(mykl(kletka(pole(X,Y),5)),mypole).
hod(X,Y,1):-mykl(kletka(pole(X,Y),-1)),XA=X-1,XB=X+1,
YA=Y-1,YB=Y+1, % убит однопалубный
mychange(X,Y,6),mychange(X,YA,5),mychange(X,YB,5),
mychange(XA,Y,5),mychange(XA,YA,5),mychange(XA,YB,5),
mychange(XB,Y,5),mychange(XB,YA,5),mychange(XB,YB,5).
hod(X,Y,1):-mykl(kletka(pole(X,Y),-2)),mychange(X,Y,2),
assert(pl(kletka(pole(X,Y),2)),pole).% ранены
hod(X,Y,1):-mykl(kletka(pole(X,Y),-3)),mychange(X,Y,3),
assert(pl(kletka(pole(X,Y),3)),pole).
hod(X,Y,1):-mykl(kletka(pole(X,Y),-4)),mychange(X,Y,4),
assert(pl(kletka(pole(X,Y),4)),pole).
% изменение состояния клеток
mychange(-1,_,_).
mychange(10,_,_).
mychange(_,14,_).
mychange(_,25,_).
mychange(X,Y,I):-retract(mykl(kletka(pole(X,Y),_)),mypole),
assert(mykl(kletka(pole(X,Y),I)),mypole).
% случайный ход
hod_rand:-random(10,X),random(10,YY),Y=YY+15,rand(X,Y).
rand(X,Y):-not(mycmp(X,Y,5)),
not(mycmp(X,Y,6)),
not(mycmp(X,Y,7)),
not(mycmp(X,Y,8)),
not(mycmp(X,Y,9)),hod(X,Y,F),still(F),!.
rand(X,Y):-mycmp(X,Y,5),random(10,XA),random(10,YY),YA=YY+15,rand(XA,YA).
rand(X,Y):-mycmp(X,Y,6),random(10,XA),random(10,YY),YA=YY+15,rand(XA,YA).
rand(X,Y):-mycmp(X,Y,7),random(10,XA),random(10,YY),YA=YY+15,rand(XA,YA).
rand(X,Y):-mycmp(X,Y,8),random(10,XA),random(10,YY),YA=YY+15,rand(XA,YA).
rand(X,Y):-mycmp(X,Y,9),random(10,XA),random(10,YY),YA=YY+15,rand(XA,YA).
mycmp(-1,_,_).
mycmp(10,_,_).
mycmp(_,14,_).
mycmp(_,25,_).
mycmp(X,Y,I):-mykl(kletka(pole(X,Y),I)).
% нахождение минимума/максимума координат клетки
min(X,Y,Z):-X<Y,Z=X.
min(X,Y,Z):-X>Y,Z=Y.
max(X,Y,Z):-X<Y,Z=Y.
max(X,Y,Z):-X>Y,Z=X.
% обдуманные ходы с подбитым двухпалубным кораблем
hod_think:-pl(kletka(pole(X,Y),2)),XA=X+1,XB=X-1,YA=Y+1,YB=Y-1,
XA<>10,not(mycmp(XA,Y,2)),not(mycmp(XA,Y,5)),
hod(XA,Y,F),mykill,still(F).
hod_think:-pl(kletka(pole(X,Y),2)),XA=X+1,XB=X-1,YA=Y+1,YB=Y-1,
XB<>-1,not(mycmp(XB,Y,2)),not(mycmp(XB,Y,5)),
hod(XB,Y,F),mykill,still(F).
hod_think:-pl(kletka(pole(X,Y),2)),XA=X+1,XB=X-1,YA=Y+1,YB=Y-1,
YA<>25,not(mycmp(X,YA,5)),not(mycmp(X,YA,5)),
hod(X,YA,F),mykill,still(F).
hod_think:-pl(kletka(pole(X,Y),2)),XA=X+1,XB=X-1,YA=Y+1,YB=Y-1,
YB<>14,not(mycmp(X,YB,2)),not(mycmp(X,YB,5)),
hod(X,YB,F),mykill,still(F).
% обдуманные ходы с подбитым трехпалубным
hod_think:-pl(kletka(pole(X,Y),3)),pl(kletka(pole(XX,YY),3)),
X=XX,Y<>YY,min(Y,YY,Z),max(Y,YY,ZZ),
YA=ZZ+1,YB=Z-1,
YA<>25,not(mycmp(X,YA,5)),not(mycmp(X,YA,3)),
hod(X,YA,F),mykill,still(F).
hod_think:-pl(kletka(pole(X,Y),3)),pl(kletka(pole(XX,YY),3)),
X=XX,Y<>YY,min(Y,YY,Z),max(Y,YY,ZZ),
YA=ZZ+1,YB=Z-1,
YB<>14,not(mycmp(X,YB,5)),not(mycmp(X,YB,3)),
hod(X,YB,F),mykill,still(F).
hod_think:-pl(kletka(pole(X,Y),3)),pl(kletka(pole(XX,YY),3)),
Y=YY,X<>XX,min(X,XX,Z),max(X,XX,ZZ),
XA=ZZ+1,XB=Z-1,
XA<>10,not(mycmp(XA,Y,5)),not(mycmp(XA,Y,3)),
hod(XA,Y,F),mykill,still(F).
hod_think:-pl(kletka(pole(X,Y),3)),pl(kletka(pole(XX,YY),3)),
Y=YY,X<>XX,min(X,XX,Z),max(X,XX,ZZ),
XA=ZZ+1,XB=Z-1,
XB<>-1,not(mycmp(XB,Y,5)),
not(mycmp(XB,Y,3)),hod(XB,Y,F),mykill,still(F).
hod_think:-pl(kletka(pole(X,Y),3)),XA=X+1,XB=X-1,YA=Y+1,YB=Y-1,
XA<>10,not(mycmp(XA,Y,3)),not(mycmp(XA,Y,5)),
hod(XA,Y,F),mykill,still(F).
hod_think:-pl(kletka(pole(X,Y),3)),XA=X+1,XB=X-1,YA=Y+1,YB=Y-1,
XB<>-1,not(mycmp(XB,Y,3)),not(mycmp(XB,Y,5)),
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.