Разработка программы для игры в морской бой с игровым полем 10х10 позиций, страница 7

% ход ЭВМ

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