Два игрока, A и B, играют по очереди.
Нам дана функция подсчета f, которая оценивает данную позицию доски, P. Большие значения f (P) лучше для A и хуже для B (т. Е. F (P) является оценкой того, насколько «хорош» P для А без дальнейших заглядываний).
Рассмотрим позицию на доске P.
Если P является листовым узлом (т.е. P является выигрышной позицией или мы смотрели так далеко вперед, как нам хочется), то мы возвращаем f (P) в качестве оценки для этого узла.
В противном случае P не является листовым узлом и имеет дочерние элементы C1, ..., Cn. Мы рекурсивно вычисляем баллы для детей, давая S1, ..., Sn.
Если A играет в P, то счет для P будет максимальным {S1, ..., Sn}, поскольку A всегда будет играть, чтобы максимизировать свое преимущество.
Если B играет в P, то счет для P составляет min {S1, ..., Sn}, поскольку B всегда будет играть, чтобы минимизировать преимущество A.
Этого должно быть достаточно, чтобы превратиться в код.
После того, как вы это сделаете, взгляните на альфа-бета-обрезку, которая должна (радикально) уменьшить количество запросов, которые вам нужно сделать. Сокращение альфа-беты основано на идее, что, если A выводит, что B может играть, чтобы сделать максимальное преимущество A равным M, то нет никакого смысла рассматривать любое поддерево, чей счет больше, чем M, поскольку B никогда не допустит A такой опции!