Стратегия получения лучшего хода при игре для 2-х игроков была описана еще математиком Клодом Шенноном. Мы должны получить набор позиций-ходов из данной и перебрать их все. Каждую позицию, полученную в результате хода нужно оценить и выбрать наилучшую, т,е, - наилучшее перемещение. Чтобы оценить каждое перемещение, мы рекурсивно вызываем нашу же функцию, только для другого цвета фигур. Рекурсивное углубление продолжается до тех пор, пока не найдена конечная позиция в строке (согласно правилам игры) или пока не исчерпана глубина просчета. В конечных точках вызывается функция, возвращающая статическую оценку позиции. В самом простейшем случае - это просто подсчет фигур на доске.
Некоторые соглашения:
Generate - функция, генерирующая набор позиций, полученных из данной
в результате легальных (согласно правилам игры) ходов.
Evaluate - статическая оценка позиции.
int NegaMax(int depth)
{
int score,tmp;
if(depth <= 0) return Evaluate();
Generate();
while(moveList)
{
tmp
= -NegaMax(depth-1);
if(tmp
> score) score = tmp;
}
return score;
}
Этот алгоритм называется NegaMax. Оценка позиции инвертированная для
каждой стороны. Известна еще одна интерпритация данного алгоритма
под названием MiniMax. В нем оценка одного знака, но одна сторона
максимизирует ее, а другая минимизирует.
Число позиций, рассмотренных этим алгоритмом, приблизительно равно
N^D, где:
N - среднее количество легальных перемещений в каждом узле
D - глубина перебора