Иллюстрированный самоучитель по Tirbo Pascal


Игра ним - часть 12


Procedure SetOwnerMove;

{Находит и отображает очередной ход программы}

{-----------------}

Function CheckField : Integer;

{Проверяет состояния игры. Возвращает 0, если нет ни одной фишки (победа игрока) , 1 - есть один ряд (победа машины) и - количество непустых рядов в остальных случаях}

begin {CheckField} 

end; {CheckField}

{-----------------}

Procedure PlayerVictory;

{Поздравить игрока с победой и усложнить игру}

begin {PlayerVictory} 

end; {PlayerVictory}

{-----------------}

Procedure OwnVictory; 

{Победа машины} 

begin {OwnVictory} 

end; {OwnVictory}

{-----------------}

Procedure ChooseMove;

{Выбор очередного хода}  

begin {ChooseMove} 

end; {ChooseMove}

{-----------------}

begin {SetOwnerMove} 

case CheckField of {Проверяем количество непустых рядов} 

0 : PlayerVictory; {Все ряды пусты - победа игрока} 

1 : OwnVictory; {Один непустой ряд - победа машины} 

else

ChooseMove; {Выбираем очередной ход} 

end; {case}

end; {SetOwnerMove}

Функция CHECKFIELD и процедуры PLAYERVICTORY и OWNVICTORY достаточно просты и их текст помещается без каких-либо пояснений в окончательный вариант программы (см. прил.5.3). Отмечу лишь, что в случае победы игрока нет смысла повторять партию заново с той же самой раскладкой фишек. Поэтому игра усложняется: в исходную раскладку добавляется еще по одной фишке в каждый ряд.

В процедуре CHOOSEMOVE анализируется позиция и выбирается очередной ход программы. Описание оптимальной стратегии уже приводилось выше. Действия программы заключаются в поиске первого слева (старшего) двоичного разряда, для которого сумма чисел нечетная. Если такой разряд не обнаружен, то текущая позиция безопасна для игрока, а значит любой ход программы сделает ее опасной. В этом случае для программы не существует оптимального выбора и она лишь убирает одну фишку из любого непустого ряда. Такая тактика означает пассивное ожидание ошибки игрока.

Если обнаружен разряд i с нечетной суммой, программа приступает к реализации оптимальной стратегии и тогда игрок обречен на поражение. Для выбора ряда, из которого следует взять фишки, программа просматривает последовательно все ряды и отыскивает тот ряд j, количество фишек в котором (в двоичном представлении) дает единицу в разряде i. Значение этого разряда для количества фишек в ряду j заменяется нулем. Затем программа продолжает подсчет суммы для оставшихся младших разрядов. Если в каком-либо из них вновь обнаружена нечетность, значение этого разряда для количества фишек в рядуj инвертируется, т.е. 0 заменяется на 1, а 1 на 0. Например, если двоичные представления числа фишек и четности сумм таковы:




- Начало -  - Назад -  - Вперед -



Книжный магазин