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

find_Step и find_Jump – предикаты, генерирующие всевозможные ходы и прыжки;

fin_States – предикат осуществляет проверку конечных стадий;

find_Jump_Find(ilist) – предикат осуществляет поиск всевозможных прыжков, вызывается из find_Jump;

calculate_Fishka_Number(ilist,integer) – предикат осуществляет рассчет оценки хода;

find_Position(pnt,integer,integer) – предикат осуществляет поиск клетки, на которой была нажата кнопка мыши;

best_Move(ilist,integer,ilist) – предикат выбирает ход с лучшей оценкой;

draw_Field(window) и draw_Fishka(window) – предикаты осуществляют прорисовку поля и фишек.

Структура программы:

Программное обеспечение разработано в среде Visual Prolog version 5.0 for Windows 16 Build 971001.8.537, реализовано в виде проекта Fields.vpr, в который включено:

-  два программных модуля Fields.pro и Vpitools.pro, заголовочные файлы Fields.con, Fields.def, Fields.grd, Fields.inc, Fields.pre, а также файл Field.bmp с картинкой игрового поля, *_fishka.ico – файлы с картинками фишек;

-  главное окно программы, представленное на рисунке 1 (см. приложение);

-  строка меню ‘TaskMenu’ с пунктами ‘Файл | Начать игру’, ‘Файл | Выход’, ‘Справка;

-  окно справки, разработанное с помощью программы HelpScrible.


Текст программы

/****************************************************************************

Министерство Образования Российской Федерации

ГОУВПО "КнАГТУ"

Расчетно-графическое задание по дисциплине "Функциональное программирование"

Логическая игра "Уголки"

Выполнили студенты группы 4ВC-1:    Шелестов И.А., Рогозин В.А.

****************************************************************************/

include "fields.inc"

include "fields.con"

/***************************************************************************

Fields - Main Program

***************************************************************************/

DATABASE - db

data_Fishka(integer,integer,integer,color)%имя, позиция, цвет фишки

my_Move(ilist)              % Координаты выбранной фишки игрока

possible_Move(ilist,integer)            % Возможные ходы

game_Started(integer)             % Флаг начала игры

fishka_Selected(integer)          % Флаг выбора фишки

PREDICATES

lets_Go(window)             % Инициализация

left_Button_Click(window,pnt)           % Нажатие на левую кнопку мыши

right_Button_Click(window,pnt)    % Нажатие на правую кнопку мыши

draw_Field(window)                % Прорисовка поля

set_Fishka_Start

draw_Fishka(window)

draw_Fishka_Icon(window,integer,integer,color)

draw_Selected_Fishka_Icon(window,integer,integer)

find_Step_Player(integer,integer) %%

find_Jump_Player(integer,integer) %% Проверка хода игрока

find_Jump_Player_Find(ilist)            %%

move_Computer                     % Ход Компьютера

move_Player                       % Ход Игрока

find_Best_Move(ilist)             %%

find_Step                   %%

find_Jump                   %% Предикаты поиска наилучшего

find_Jump_Find(ilist)             %% хода компьютера

best_Move(ilist,integer,ilist)    %%

calculate_Number_For_Fishka(ilist,integer)    % Рассчет оценки

nondeterm move(integer,integer,integer,integer,integer,integer)

nondeterm goal_Comp(integer,integer)

comp_Goal(integer,integer)

find_Position(pnt,integer,integer)      % Поиск позиции мыши

concat_List(ilist,ilist,ilist)

members(ilist,ilist)

reverse_List(ilist,ilist)

fin_States

CLAUSES

% Взять фишку

right_Button_Click(Win,PNT) :find_Position(PNT,Px,Py),data_Fishka(_,Px,Py,color_White),

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

draw_Selected_Fishka_Icon(Win,Px,Py),

assert(my_Move([Px,Py]),db),!.

% Отмена хода взятой фишкой

right_Button_Click(Win,_) :fishka_Selected(1),

retractall(my_Move(_),db),

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

win_Invalidate(Win),!.

% Запись хода

left_Button_Click(Win,PNT):-!,

find_Position(PNT,Pxn,Pyn), fishka_Selected(1),my_Move([Px1,Py1]),

not(find_Step_Player(Px1,Py1)),

not(find_Jump_Player(Px1,Py1)),

possible_Move(XY,_),

reverse_List(XY,[Pxn,Pyn|_]),

retract(data_Fishka(N,Px1,Py1,Clr),db),

assert(data_Fishka(N,Pxn,Pyn,Clr),db),

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