2010-04-30 45 views
0

所以我試圖實現一個遞歸函數來生成井字遊戲的整個遊戲樹,我似乎無法讓它工作。我的遞歸函數有什麼問題?

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); 
    } 

實際功能的工作,我已經經歷了和調試它,它顯示了它的工作,因爲它應該是,但是當我看到生成的(對於井字棋的節點,順便說一句)通過斷點在Visual Studios中,它只顯示前9個分支。我知道更多的產生,因爲它需要幾秒鐘,我添加了一個計數器。

這是我如何調用代碼:

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

沒有抄襲我的位棋盤的所有代碼和諸如此類的東西在這裏,你可以看到什麼立即錯誤的邏輯是什麼?

回答

2
  nNode.m_branches.push_back(f); 

這會的push_back節點f的副本,所以裏面nNode.m_branches的東西將是無關的f修改以後。

+0

但是我添加了&nNode,所以它是一個引用,所以稍後會顯示這些更改嗎?如果不是,我該如何解決這個問題? – cam 2010-04-30 16:37:08

+0

啊,只是一個簡單的重新排序。謝謝! – cam 2010-04-30 16:44:13