public static void ConstructGameTreeRecursive(GameState node, int currDepth)
 {
     int j;
     int temp;
     bool breakFlag = false;
     int[] s = new int[] { -1, -1 };
     //temp = node.getUtilVal();
     if (currDepth >= maxDepth)
     {
         node.getVal();
         return;
     }
     int[] possibleMoveInd;
     //GameState next = new GameState();
     //GameState next = (GameState)node.MemberwiseClone();
     possibleMoveInd = node.getPossibleMoves();
     GameState[] next = new GameState[possibleMoveInd.Length];
     GameState grandParent = node.parent;
     for (int i = 0; i < possibleMoveInd.Length; i++)
     {
         next[i] = node.cloneTurnAndData();
         s = ind2sub(possibleMoveInd[i]);
         if (next[i].makeMove(s[0], s[1]) == -1)
             return;
         next[i].nextMove();
         node.addChild(next[i]);
         ConstructGameTreeRecursive(next[i], currDepth + 1);
         next[i].dumpData(currDepth + 1);
         if (GameState.useAlphaBetaPr)
         {
             // alpha-beta control
             if (node.isComputersTurn())
             {
                 
                 breakFlag = false;
                 if (grandParent != null)
                 {
                     for (j = 0; j < grandParent.numChildren; j++)
                         if (grandParent.children[j] == node)
                             break;
                     for (int k = 0; k < j; k++)
                     {
                         if ((grandParent.children[k].val == Inf) || (grandParent.children[k].val == -Inf) || (next[i].val == Inf) || (next[i].val == -Inf))
                             break;
                         if (grandParent.children[k].val < next[i].val)
                         {
                             node.val = next[i].val;
                             // prune!
                             breakFlag = true;
                             break;
                         }
                     }
                 }
                 if (breakFlag)
                     // daha fazla cocuk ekleme, cik
                     break;
             }
             else
             {
                 breakFlag = false;
                 if (grandParent != null)
                 {
                     for (j = 0; j < grandParent.numChildren; j++)
                         if (grandParent.children[j] == node)
                             break;
                     for (int k = 0; k < j; k++)
                     {
                         if ((grandParent.children[k].val == Inf) || (grandParent.children[k].val == -Inf) || (next[i].val == Inf) || (next[i].val == -Inf))
                             break;
                         if (grandParent.children[k].val > next[i].val)
                         {
                             node.val = next[i].val;
                             // prune!
                             breakFlag = true;
                             break;
                         }
                     }
                 }
                 if (breakFlag)
                     // daha fazla cocuk ekleme, cik
                     break;
             }
         }
     }
     // tum cocuklar eklendigine gore intervali guncelle
     int max = -Inf;
     int min = Inf;
     int currVal;
     GameState temp1 = node.parent;
     if (temp1 == null)
         temp = 1;
     for (int i = 0; i < node.numChildren; i++)
     {
         currVal = node.children[i].getVal();
         if (currVal > max)
             max = currVal;
         if (currVal < min)
             min = currVal;
     }
     if (node.isComputersTurn())
         // max node
         node.val = max;
     else
         node.val = min;
 }