Читаем Prolog полностью

                расст( Б, Л, Р1),

                расст( Ч, Л, Р2),

                ( ЧейХод = б,  !,  Р1 > Р2 + 1;

                  ЧейХод = ч,  !,  Р1 > Р2 ).

        ближе_к_клетке( Поз, КорнПоз) :-

                расст_до_клетки( Поз, Р1),

                расст_до_клетки( КорнПоз, Р2),

                Р1 < Р2.

        расст_до_клетки( Поз, Мрасст) :-

                                                          % Манхеттеновское расстояние

                бк( Поз, БК),                   % между БК и критической клеткой

                кк( Поз, КК),                   % Критическая клетка

                манх_расст( БК, КК, Мрасст).

        раздел( _..Бх : Бу..Лх : Лу.. Чх : Чу.._ ) :-

                упоряд( Бх, Лх, Чх),  !;

                упоряд( Бу, Лу, Чу).

        l_конфиг( _..Б..Л..Ч.._ ) :-                           % L - конфигурация

                манх_расст( Б, Ч, 2),

                манх_расст( Л, Ч, 3).

        не дальше_от_ладьи( _..Б..Л.._, _..Б1..Л1.._ ) :-

                расст( Б, Л, Р),

                расст( Б1, Л1, Р1),

                Р =< Р1.

        простр_больше_2( Поз) :-

                простр( Поз, Пр),

                Пр > 2.

        наш_король_на_краю( _..Х : Y.._ ) :-

                                                          % Белый король на краю

                ( X = 1,  !;  X = 8,  !;  Y = 1,  !;  Y = 8).

        король_противника_на_краю( _..Б..Л..Х : Y.._ ) :-

                                                          % Черный король на краю

                ( X = 1,  !;  X = 8,  !;  Y = 1,  !;  Y = 8).

        короли_рядом( Поз) :-                                       % Расстояние между королями  <  4

                бк( Поз, БК), чк( Поз, ЧК),

                расст( БК, ЧК, Р),

                Р < 4.

        потеря_ладьи( _..Б..Л..Л.._ )-                       % Ладья взята

        потеря_ладьи( ч..Б..Л..Ч.._ ) :-

                сосед( Ч, Л),                    % Черный король напал на ладью

                not сосед( Б, Л).              % Белый король не защищает ладью

        расст( X : Y, X1 : Y1, Р) :-                                % Расстояние до короля

                абс_разн( X, X1, Рх),

                абс_разн( Y, Y1, Ру),

                макс( Рх, Ру, Р).

        абс_разн( А, В, С) :-

                А > В,  !,  С is A - В;

                С is В - А.

        макс( А, В, М) :-

                А >= В,  !,  М = А;

                М = В.

        манх_расст( X : Y, X1 : Y1, Р) :-                  % Манхеттеновское расстояние

                абс_разн( X, X1, Рх),

                абс_разн( Y, Y1, Ру),

                P is Рх + Ру.

        простр( Поз, Пр) :-

                                    % Область, в которой "заперт" черный король

                бл( Поз, Лх : Лу),

                чк( Поз, Чх : Чу),

                ( Чх < Лх, СторонаХ is Лх - 1;

                  Чх > Лх, СторонаХ is 8 - Лх ),

                ( Чу < Лу, СторонаY is Лу - 1;

                  Чу > Лу, СторонаY is 8 - Лу ),

                Пр is СторонаХ * СторонаY,  !;

                Пр = 64.      % Ладья и черный король на одной линии

        кк( _..Б..Лх : Лу.. Чх : Чу.._, Кх : Ку) :-

                                    % Критическая клетка

                ( Чх < Лх,  !,  Кх is Лх - 1;  Кх is Лх + 1),

                ( Чу < Лу,  !,  Ку is Лу - 1;  Ку is Лу + 1).

% Процедуры для отображения позиций

        отобр( Поз) :-

                nl,

                коорд( Y), nl,

                коорд( X),

                печ_фиг( X : Y, Поз),

                fail.

        отобр( Поз) :-

                чей_ход( Поз, ЧХ), глуб( Поз, Г),

                nl, write( 'ЧейХод='), write( ЧХ),

                write( 'Глубина='), write( Г), nl.

        печ_фиг( Клетка, Поз):-

                бк( Поз, Клетка),  !,  write( 'Б');

                бл( Поз, Клетка),  !,  write( 'Л');

                чк( Поз, Клетка),  !,  write( 'Ч');

                write( '.').

        показать_ход( Ход) :-

                nl,    write( Ход),  nl.

Рис. 15. 10.  Библиотека предикатов для окончания "король и ладья против короля".

Резюме

Игры двух лиц поддаются формальному представлению в виде И / ИЛИ-графов. Поэтому процедуры поиска в И / ИЛИ-графах применимы для поиска в игровых деревьях.

Простой алгоритм поиска в глубину в игровых деревьях легко программируется, но для игр, представляющих интерес, он не эффективен. Более реалистичный подход - минимаксный принцип в сочетании с оценочной функцией и поиском, ограниченным по глубине.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных