Imagine que en cualquier punto de un tablero de tres en raya, cada movimiento posible es una rama. El estado actual de la placa es la raíz. Un movimiento es una rama. Ahora pretenda (uno a la vez), que cada rama se convierta en el estado actual. Cada movimiento posible se convierte en una nueva rama. La hoja del árbol es cuando se realiza el último movimiento y el tablero está lleno.
La razón por la que necesita tener un árbol, es que una vez que está construido, necesita averiguar qué rama tiene la mayor cantidad de hojas que son escenarios 'GANAR'. Cree la rama de todos los resultados posibles, sume la cantidad total de WIN y luego haga la jugada que tenga la oportunidad de obtener la mayor cantidad de ganancias.
Hacer el árbol de algo como esto:
class Node {
public:
std::list<Node> m_branches;
BoardState m_board;
int m_winCount;
}
std::list<Node> tree;
Ahora, iterar a través de la lista de las ramas en el árbol, y para cada rama, iterar a través de sus ramas. Esto se puede hacer con una función recursiva:
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)
Muy pseudocódigo.
¿Qué clase de árbol? Un árbol Minimax? –
Cualquier árbol que almacena el estado para el próximo movimiento posible. Un árbol minimax funcionaría, solo estoy buscando ver cómo se llena/navega un "árbol"/etc. No tengo ninguna experiencia trabajando con árboles – cam