Представьте, что в любой точке доски крестики-нолики каждый возможный ход - это ветвь. Текущее состояние платы - корень. Один ход - это ветка. Теперь представьте (по одному), что каждая ветвь становится текущим состоянием. Каждый возможный ход становится новой веткой. Лист дерева - это когда последний ход сделан и доска заполнена.
Причина, по которой вам нужно дерево, заключается в том, что после его построения вам нужно выяснить, какая ветвь имеет наибольшее количество листьев, которые являются сценариями 'WIN'. Вы строите ветвь из всех возможных результатов, складываете общее количество выигрышей, а затем делаете ход, который может закончиться с наибольшим количеством побед.
Сделайте дерево примерно таким:
class Node {
public:
std::list< Node > m_branches;
BoardState m_board;
int m_winCount;
}
std::list< Node > tree;
Теперь вы перебираете список ветвей в дереве, и для каждой ветви перебираете его ветви. Это можно сделать с помощью рекурсивной функции:
int recursiveTreeWalk( std::list< Node >& partialTree)
{
for each branch in tree
if node has no branches
calculate win 1/0;
else
recursiveTreeWalk( branch );
partialTree.m_winCount = sum of branch wins;
}
// initial call
recursiveTreeWalk( tree )
Очень псевдокод.