/// <summary>
        /// Routine that changes the owner of a tile based on indices stored in TilesToTurn list.
        /// </summary>
        private void DoTurnTiles()
        {
            PlayerModel player      = null;;
            bool        playerFound = false;

            foreach (KeyValuePair <int, ClientModel> model in CurrentPlayersList)
            {
                ReversiClientModel reversiClientModel = (ReversiClientModel)model.Value;

                if (reversiClientModel.ClientPlayer.IdType == CurrentPlayer)
                {
                    player      = reversiClientModel.ClientPlayer;
                    playerFound = true;
                }
            }

            // If we didnt find the player, return
            if (!playerFound)
            {
                return;
            }

            foreach (int index in TilesToTurn)
            {
                Gameboard.Squares[index].Piece.Owner = player;

                //// TODO: For each tile being flipped...play a sounds
                //ReversiSounds.PlaySounds(GameSounds.SOUND_FLIPTILE);
            }

            // Now clear the tiles to turn array since all the moves have been made
            TilesToTurn.Clear();
        }
        public override bool PlayTurn()
        {
            // Clear the tiles to turn array
            AvailableMovesList.Clear();
            TilesToTurn.Clear();

            return(MakePlayerMove(CurrentMoveIndex));
        }
        /// <summary>
        /// Determine if the new placement location is valid.
        /// </summary>
        /// <param name="index">The square index where they are placing the piece</param>
        /// <param name="p">The player placing the tile</param>
        /// <returns></returns>
        public override bool ValidateTilePlacement(int index, Players p)
        {
            // Determine our opponent
            Players player   = p;
            Players opponent = (player == Players.Player1) ? Players.Player2 : Players.Player1;

            if (ValidateInitialPlacementPosition(index, p) == false)
            {
                return(false);
            }

            var tmp_index = index; // returns -1 if the neighbor is a boundary

            // 1 2 3
            // 4 X 5
            // 6 7 8
            foreach (DirectionVectors dv in Enum.GetValues(typeof(DirectionVectors)))
            {
                List <int> result = new List <int>(); // stores the values of a valid placement
                if (ValidateDirectionFromIndex(index, player, opponent, dv, out result) == true)
                {
                    foreach (int item in result)
                    {
                        Console.WriteLine("...VALID to " + dv);
                        if (TilesToTurn.Contains(item) == false)
                        {
                            TilesToTurn.Add(item);
                        }
                    }
                }
            }

            // Print the Tiles to Turn list

            string str = string.Empty;

            foreach (int item in TilesToTurn)
            {
                str += item.ToString() + " ";
            }
            Console.WriteLine(index + ": -- " + str + "\n");

            return(TilesToTurn.Count > 0);
        }
        /// <summary>
        /// Primary routine for a player to make a move
        /// </summary>
        /// <param name="index">the index of the move being made</param>
        internal bool MakePlayerMove(int index)
        {
            PlayerModel player      = null;;
            bool        playerFound = false;

            foreach (KeyValuePair <int, ClientModel> model in CurrentPlayersList)
            {
                ReversiClientModel reversiClientModel = (ReversiClientModel)model.Value;

                if (reversiClientModel.ClientPlayer.IdType == CurrentPlayer)
                {
                    player      = reversiClientModel.ClientPlayer;
                    playerFound = true;
                    break;
                }
            }

            if ((player == null) || (playerFound == false))
            {
                return(false);
            }

            bool placementIsValid = ValidateTilePlacement(index, CurrentPlayer);

            if (placementIsValid)
            {
                // Add a new game piece at the location
                GamePieceModel piece = new GamePieceModel(Pieceshapes.Ellipse, player);
                Gameboard.AddPiece(index, piece);

                // Capture the opponents tiles
                DoTurnTiles();

                // Reset the tiles to be turned array
                TilesToTurn.Clear();
                return(true);
            }

            return(false);
            //MessageBox.Show(Gameboard.DrawGameboard() + "\nCurrent Player: " + CurrentPlayer.IDType + " : " + CurrentPlayer.Name);
        }