Метод поиска решения на графе пространства состояний, страница 4

retract(my_Move(_),db),

retract(fishka_Selected(_),db),assert(fishka_Selected(0),db),

win_Invalidate(Win),

move_Computer,!.

find_Step_Player(Px1,Py1):move(Px1,Py1,Px2,Py2,_,_),Px2<>9,Py2<>9,

not(data_Fishka(_,Px2,Py2,_)),

assert(possible_Move([Px1,Py1,Px2,Py2],0),db),

fail.

find_Jump_Player(Px1,Py1):-find_Jump_Player_Find([Px1,Py1]),fail.

find_Jump_Player_Find(XY):reverse_List(XY,[Px1,Py1|XY1]),

move(Px1,Py1,Px2,Py2,Px3,Py3),Px3<>9,Py3<>9,

data_Fishka(_,Px2,Py2,_),

not(data_Fishka(_,Px3,Py3,_)),

not(members([Px3,Py3],XY)),

XY2=[Px3,Py3,Px1,Py1|XY1],

reverse_List(XY2,XY3),

assert(possible_Move(XY3,0),db),

find_Jump_Player_Find(XY3),!.

move_Computer:data_Fishka(_,1,1,color_White),

data_Fishka(_,1,2,color_White),

data_Fishka(_,1,3,color_White),

data_Fishka(_,2,1,color_White),

data_Fishka(_,2,2,color_White),

data_Fishka(_,2,3,color_White),

data_Fishka(_,3,1,color_White),

data_Fishka(_,3,2,color_White),

data_Fishka(_,3,3,color_White),

dlg_Note("Поздравляю!.","Отличная победа!!!"),

retractall(data_Fishka(_,_,_,_),db),

retract(game_Started(_),db), assert(game_Started(0),db),

TaskWin = vpi_GetTaskWin (),win_Invalidate(TaskWin),!.

move_Computer:find_Best_Move([X1,Y1|XY]),

reverse_List(XY,[X2,Y2|_]),

retract(data_Fishka(N,X1,Y1,Clr),db),

assert(data_Fishka(N,X2,Y2,Clr),db),

Win=win_GetActiveWindow(),win_Invalidate(Win),

not(move_Player),!.

move_Player:data_Fishka(_,6,6,color_Black),

data_Fishka(_,6,7,color_Black),

data_Fishka(_,6,8,color_Black),

data_Fishka(_,7,6,color_Black),

data_Fishka(_,7,7,color_Black),

data_Fishka(_,7,8,color_Black),

data_Fishka(_,8,6,color_Black),

data_Fishka(_,8,7,color_Black),

data_Fishka(_,8,8,color_Black),

dlg_Note("Разгром","Искусственный разум вновь одолел человека."),

retractall(data_Fishka(_,_,_,_),db),

retract(game_Started(_),db),assert(game_Started(0),db),

TaskWin = vpi_GetTaskWin (),win_Invalidate(TaskWin),!,fail.

find_Best_Move(Move) :- !,

not(find_Step),not(find_Jump),

fin_States,

best_Move([],1000,Move),

retractall(possible_Move(_,_),db),!.

find_Step:data_Fishka(_,Px1,Py1,color_Black),%получить текущую позицию фишки

not(goal_Comp(Px1,Py1)),            %не находится на финальной позиции

move(Px1,Py1,Px2,Py2,_,_), Px2<>9, Py2<>9,%генерируется возможный ход

not(data_Fishka(_,Px2,Py2,_)),      %конечное поле дожно быть пустым

calculate_Number_For_Fishka([Px1,Py1,Px2,Py2],Num),

assert(possible_Move([Px1,Py1,Px2,Py2],Num),db),fail.%fail позволяет перебрать все альтернативы предиката move

find_Jump:data_Fishka(_,Px1,Py1,color_Black),

not(goal_Comp(Px1,Py1)),

find_Jump_Find([Px1,Py1]),fail.

find_Jump_Find(XY):reverse_List(XY,[Px1,Py1|XY1]),     %получение переданных координат

move(Px1,Py1,Px2,Py2,Px3,Py3),Px3<>9,Py3<>9,%генерируется возможный ход

data_Fishka(_,Px2,Py2,_),    %должна быть фишка, через которую можно прыгнуть

not(data_Fishka(_,Px3,Py3,_)), %конечное поле дожно быть пустым

not(members([Px3,Py3],XY)),

XY2=[Px3,Py3,Px1,Py1|XY1],

reverse_List(XY2,XY3),

calculate_Number_For_Fishka(XY3,Num),

assert(possible_Move(XY3,Num),db),

find_Jump_Find(XY3),!.

best_Move(_,Num,Hod):possible_Move(XY1,Num1),

Num>Num1,

retractall(possible_Move(_,Num),db),

best_Move(XY1,Num1,Hod),!.

best_Move(XY,Num,Hod):possible_Move(_,Num1),

Num<=Num1,

retractall(possible_Move(_,Num1),db),

best_Move(XY,Num,Hod),!.

best_Move(Hod,_,Hod):-!.

%Первый параметр – текущая позиция,

%Втроой параметр – возможная позиция хода,

%Третий - возможная позиция прыжка.

move(Px1,Py1,Px2,Py2,Px3,Py3):-Px2=Px1,Py2=Py1-1,Px3=Px1,Py3=Py1-2.

move(Px1,Py1,Px2,Py2,Px3,Py3):-Px2=Px1+1,Py2=Py1,Px3=Px1+2,Py3=Py1.

move(Px1,Py1,Px2,Py2,Px3,Py3):-Px2=Px1,Py2=Py1+1,Px3=Px1,Py3=Py1+2.

move(Px1,Py1,Px2,Py2,Px3,Py3):-Px2=Px1-1,Py2=Py1, Px3=Px1-2,Py3=Py1.

comp_Goal(Px,Py):-goal_Comp(X,Y),not(data_Fishka(_,X,Y,_)),Px=X,Py=Y,!.

comp_Goal(8,8).

calculate_Number_For_Fishka([XS,YS|XY],Num):reverse_List(XY,[XF,YF|_]),

comp_Goal(Gx,Gy),

NumS=(Gx-XS)*(Gx-XS)+(Gy-YS)*(Gy-YS),

NumF=(Gx-XF)*(Gx-XF)+(Gy-YF)*(Gy-YF),

data_Fishka(11,X1,Y1,color_Black),Num1=(Gx-X1)*(Gx-X1)+(Gy-Y1)*(Gy-Y1),

data_Fishka(12,X2,Y2,color_Black),Num2=(Gx-X2)*(Gx-X2)+(Gy-Y2)*(Gy-Y2),