Drzewo gry składa się z węzłów, a każdy węzeł reprezentuje konkretną sytuację na planszy. Każdy węzeł może mieć też wiele dzieci, i ma jednego rodzica.
Zatem węzeł może wyglądać tak:
class CTreeNode
{
CBoardState m_board; // reprezentacja sytuacji na planszy
CTreeNode* m_pParent; // wskaźnik na rodzica
QList <CTreeNode*> m_children; // lista wskaźników na dzieci
// mogą się też przydać...
quint8 m_ucLevel; // poziom zagnieżdżenia w drzewie
qint32 m_uiValue; // ocena planszy wg jakiegoś algorytmu
};
Samo drzewo potrzebuje tylko wskaźnika na root drzewa:
class CTree
{
CTreeNode *m_root;
};
Po stworzeniu pustego drzewa musisz dodać węzły-dzieci do roota. To będą wszystkie możliwe plansze po wykonaniu pierwszego ruchu. Czyli najpierw szukasz wszystkich możliwych do wykonania ruchów i zapisujesz je. Potem dla każdego ruchu tworzysz nową planszę (CBoardState) i wykonujesz na niej odpowiedni ruch. Każda z otrzymanych planszy tworzy nowy węzeł drzewa gry, dzieci roota.
Potem na każdym z dzieci wykonujesz to samo, szukasz możliwych ruchów, i wykonujesz je na osobnych planszach. Tak powstają kolejne dzieci i poziomy drzewa.
Mam nadzieję że mój opis trochę pomógł:)