2010-04-30 6 views
0

J'essaie donc d'implémenter une fonction récursive qui génère l'intégralité de l'arbre de jeu de Tic-Tac-Toe, et je n'arrive pas à le faire fonctionner.Quel est le problème avec ma fonction récursive?

void BuildTree(Node& nNode, const int& nextPlayer) 
    { 
     //Copy last board 
     Ticboard tBoard = nNode.m_board; 
     do 
     { 
//Return first valid move 
      int validMove = tBoard.FirstValidMove(); 
      if (validMove != -1) 
      { 
       Node f; 
       Ticboard tempBoard = nNode.m_board; 
       tempBoard.Move(validMove, nextPlayer); 
       tBoard.Move(validMove, nextPlayer); 
       f.m_board = tempBoard; 
       f.m_winCount = 0; 
       nNode.m_branches.push_back(f); 
       int currPlay = (nextPlayer == 1 ? 2 : 1); 
       BuildTree(f,currPlay); 
      } 
      else 
      { 
       break; 
      } 
     }while(true); 
    } 

La fonction réelle fonctionne, je suis allé à travers et débogué et il montre qu'il fonctionne comme il est censé le faire, mais quand je regarde les noeuds générés (pour Tic-Tac-Toe, par la voie) dans Visual Studios via le point d'arrêt, il montre seulement les 9 premières branches. Je sais que d'autres ont été générés car cela prend quelques secondes, et j'ai ajouté un compteur.

Voilà comment j'appelle le code:

Ticboard lol; 
Node startTree; 
startTree.m_board = lol; 
int startPlay = 1; 
BuildTree(startTree, startPlay); 

Sans copier tout mon code pour bitboards et tout le reste ici, pouvez-vous voir immédiatement quelque chose de mal avec la logique?

Répondre

2
  nNode.m_branches.push_back(f); 

Cela push_back une copie du nœud f, de sorte que la substance à l'intérieur nNode.m_branches ne sera pas pertinente à la modification de f plus tard.

+0

Mais j'ai ajouté & nNode, donc c'est une référence, donc les changements ne seront-ils pas montrés plus tard? Si non, comment puis-je résoudre ce problème? – cam

+0

Ah, juste une réorganisation simple. Merci! – cam

Questions connexes