public double BuildABTree(StishMiniMaxNode CurrentNode, int DepthCount, double Alpha, double Beta, int colour)
        {
            if (CurrentNode == null || DepthCount == 0)
            {
                //returns if this is the root node or is a leaf node
                return(colour * CurrentNode.FindValue(CurrentNode, CurrentNode.NodeBoardState, CurrentNode.Allegiance));
            }

            double Value = double.MinValue;
            double ChildValue;

            ForeSight.Instance.GenerateChildren(CurrentNode);
            for (int index = 0; index < CurrentNode.CountChildren(); index++)
            {
                ChildValue = -1 * BuildABTree((StishMiniMaxNode)CurrentNode.GetChild(index), DepthCount - 1, -Beta, -Alpha, -colour);
                if (Value < ChildValue)
                {
                    Value = ChildValue;
                    CurrentNode.BestChild    = (StishMiniMaxNode)CurrentNode.GetChild(index);
                    CurrentNode.NegaMaxValue = Value;
                }
                Alpha = Math.Max(Alpha, Value);

                if (Alpha > Beta)
                {
                    //this return statement "prunes" the tree and prevents further growth on the tree in those bad areas
                    return(colour * CurrentNode.FindValue(CurrentNode, CurrentNode.NodeBoardState, CurrentNode.Allegiance));
                }
            }

            //if the node does not need to be pruned
            return(colour * CurrentNode.FindValue(CurrentNode, CurrentNode.NodeBoardState, CurrentNode.Allegiance));
        }
        public double TraverseTree(StishMiniMaxNode CurrentNode, int DepthCount, int colour)
        {
            //Depth count is given as 0 when called at root

            if (CurrentNode == null || DepthCount == 0)
            {
                //the number 3 is a variable to be changed as sight increases
                return(colour * CurrentNode.FindValue(CurrentNode, CurrentNode.NodeBoardState, CurrentNode.Allegiance));
            }

            double Value = double.MinValue;
            double ChildValue;

            for (int index = 0; index < CurrentNode.CountChildren(); index++)
            {
                ChildValue = -TraverseTree((StishMiniMaxNode)CurrentNode.GetChild(index), DepthCount - 1, -colour);
                if (Value < ChildValue)
                {
                    Value = ChildValue;
                    CurrentNode.BestChild    = (StishMiniMaxNode)CurrentNode.GetChild(index);
                    CurrentNode.NegaMaxValue = Value;
                }
            }
            return(Value);
        }