/**
         * Set player who opens the game.
         * called by parallel thread in a server game
         */
        public override void SetStarter(bool b)
        {
            if (b)
            {
                // computer starts
                if (VERBOSE)
                {
                    Debug.WriteLine("Computer starts");
                }
                m_humanColor  = IController.BLACK;
                m_humanStarts = false;
            }
            else
            {
                // human starts
                if (VERBOSE)
                {
                    Debug.WriteLine("Human starts");
                }
                m_humanColor  = IController.WHITE;
                m_humanStarts = true;
            }

            // refresh gui: must be called after beginning player have been chosen
            m_view.PrepareBoard();

            // create new game tree
            m_gameTree = new GameTree();
            if (b)
            {
                // computer will open the game
                m_gameTree.Create(TREEDEPTH, null);
                if (VERBOSE)
                {
                    Debug.WriteLine("\tgame tree created; tree size: " + m_gameTree.Size());
                }
            }
        }
        /**
         * Play human player action
         * @param a Action
         * @return status flag
         */
        private Status Human(ActionPM a)
        {
            State s = m_gameTree.CurrentState();

            // play human action
            if (s == null)
            {
                if (a is Placing)
                {
                    if (m_humanColor != IController.WHITE)
                    {
                        throw new Exception("wrong human player color");
                    }
                    m_gameTree.Create(TREEDEPTH, (Placing)a);
                    s = m_gameTree.CurrentState();
                    if (VERBOSE)
                    {
                        Debug.WriteLine("Human has played\n\ttree size: " + m_gameTree.Size());
                    }
                }
                else
                {
                    m_view.UpdateBoard(m_gameTree.CurrentState(), a, false);
                    return(Status.INVALIDACTION);
                }
            }
            else
            {
                // check if a is a valid human player action
                if (a.IsValid(s))
                {
                    var sCopy = s.Clone();

                    // update temporary state with user action
                    a.Update(sCopy);

                    // check if a mill has been closed
                    if (sCopy.InMill(a.EndPosition, a.Color()))
                    {
                        // action is not yet played, because it is part of a taking action
                        if (VERBOSE)
                        {
                            Debug.WriteLine("Human closed mill\n\ttree size: " + m_gameTree.Size());
                        }
                        // redraw game board
                        m_view.UpdateBoard(sCopy, a, false);
                        return(Status.CLOSEDMILL);
                    }
                    else
                    {
                        // play human player action a
                        m_gameTree.HumanPlayer(a);
                        if (VERBOSE)
                        {
                            Debug.WriteLine("Human has played\n\ttree size: " + m_gameTree.Size());
                        }
                    }
                }
                else
                {
                    if (VERBOSE)
                    {
                        Debug.WriteLine("Human played an invalid action");
                    }
                    m_view.UpdateBoard(m_gameTree.CurrentState(), a, false);
                    return(Status.INVALIDACTION);
                }
            }

            if (s.Finished())
            {
                if (VERBOSE)
                {
                    Debug.WriteLine("Human has won");
                }
                m_view.UpdateBoard(m_gameTree.CurrentState(), a, false);
                return(Status.FINISHED);
            }
            else
            {
                m_view.UpdateBoard(m_gameTree.CurrentState(), a, false);
                return(Status.OK);
            }
        }