void HandleAIMove()
        {
            Player player = Player.GetPlayerFromTurn(turn, player1, player2);

            if (player.Mode != Player.Modes.Human)
            {
                List <Tuple <int, int> > validMoves = Game.GetValidMoves(board, player.Tile);
                Tuple <int, int>         move       = null;
                if (validMoves.Count > 0)
                {
                    if (player.Mode == Player.Modes.AILegendary)
                    {
                        move = Game.GetAIMove(board, 4, player.Tile);
                    }
                    else if (player.Mode == Player.Modes.AIHard)
                    {
                        move = Game.GetAIMove(board, 3, player.Tile);
                    }
                    else if (player.Mode == Player.Modes.AINormal)
                    {
                        move = Game.GetAIMove(board, 2, player.Tile);
                    }
                    else if (player.Mode == Player.Modes.AIEasy)
                    {
                        move = Game.GetMaxScoreMove(board, player.Tile);
                    }
                }
                HandleNextMove(move);
            }
        }
        private void cellButton_Click(object sender, RoutedEventArgs e)
        {
            Player currentPlayer = Player.GetPlayerFromTurn(turn, player1, player2);

            if (currentPlayer.Mode == Player.Modes.Human)
            {
                int senderIndex       = BoardUniformGrid.Children.IndexOf(sender as UIElement);
                Tuple <int, int> move = Game.ToIndex2D(senderIndex);
                HandleNextMove(move);
            }
        }
        void RenderBoard(byte[,] board)
        {
            if (animationPaused)
            {
                animationPending = true;
                return;
            }
            bool changesOccurred = false;

            for (int index = 0; index < 64; index++)
            {
                Tuple <int, int> index2D = Game.ToIndex2D(index);
                int  x     = index2D.Item1;
                int  y     = index2D.Item2;
                byte value = board[x, y];

                if (value == Game.White || value == Game.Black || value == Game.Empty)
                {
                    Button cellButton = BoardUniformGrid.Children[index] as Button;
                    cellButton.Tag  = Game.ValueAsString(value);
                    changesOccurred = true;
                }
            }
            if (changesOccurred)
            {
                animationPaused = true;
                animationTimer.Start();
            }
            Player currentPlayer = Player.GetPlayerFromTurn(turn, player1, player2);

            if (currentPlayer == player1)
            {
                Player1Display.IsEnabled = true;
                Player2Display.IsEnabled = false;
            }
            else
            {
                Player1Display.IsEnabled = false;
                Player2Display.IsEnabled = true;
            }
            Player1Score.Text = Game.GetScore(board, Game.White).ToString();
            Player2Score.Text = Game.GetScore(board, Game.Black).ToString();

            //Trace.WriteLine(Game.GenerateString(board));
        }
        void HandleNextMove(Tuple <int, int> move)
        {
            if (Game.GetWinner(board) == Game.Empty)
            {
                Player currentPlayer = Player.GetPlayerFromTurn(turn, player1, player2);
                List <Tuple <int, int> > validMoves = Game.GetValidMoves(board, currentPlayer.Tile);
                if (validMoves.Count > 0 && move != null)
                {
                    if (validMoves.Contains(move))
                    {
                        Game.MakeMove(board, move, currentPlayer.Tile);
                        boardHistories.Add(board.Clone() as byte[, ]);
                        turn++;
                        RenderBoard(board);
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    turn++;
                }

                if (Game.GetWinner(board) != Game.Empty)
                {
                    HandleWinner();
                }
                Player nextPlayer = Player.GetPlayerFromTurn(turn, player1, player2);
                if (nextPlayer.Mode != Player.Modes.Human)
                {
                    HandleAIMove();
                }
            }
        }