private double EvaluateMove(Move move, Game game)
        {
            var gameWithMove      = game.Move(move.ChessPiece, move.ToX, move.ToY);
            var opponents         = move.ChessPiece.IsWhite ? gameWithMove.BlackChessPieces : gameWithMove.WhiteChessPieces;
            var nextOpponentMoves = _moveGenerator.NextMoves(opponents, gameWithMove).ToArray();
            var friends           = (move.ChessPiece.IsWhite ? gameWithMove.WhiteChessPieces : gameWithMove.BlackChessPieces).Where(x => x.Id != move.ChessPiece.Id);
            var nextFriendMoves   = _moveGenerator.NextMoves(friends, gameWithMove).ToArray();

            var ctx = new ChessContext()
            {
                Move = move, GameBeforeMove = game, GameAfterMove = gameWithMove, NextOpponentMoves = nextOpponentMoves, NextFriendMoves = nextFriendMoves
            };

            var rating = _knowledge.EvaluateMove(ctx);

            return(rating);
        }
        public void Run(Game game)
        {
            Output.Print(game);
            Thread.Sleep(500);
            while (game.WhiteChessPieces.Length > 0 && game.BlackChessPieces.Length > 0)
            {
                var whiteMoves    = _moveGenerator.NextMoves(game.WhiteChessPieces, game);
                var bestWhiteMove = _evaluator.GetBestMove(whiteMoves, game);
                if (bestWhiteMove == null)
                {
                    break;
                }
                Animate(bestWhiteMove, game);
                game = Execute(bestWhiteMove, game);
                Output.Print(game);
                Thread.Sleep(250);
                if (game.WhiteWins)
                {
                    break;
                }

                var blackMoves    = _moveGenerator.NextMoves(game.BlackChessPieces, game);
                var bestBlackMove = _evaluator.GetBestMove(blackMoves, game);
                if (bestBlackMove == null)
                {
                    break;
                }
                Animate(bestBlackMove, game);
                game = Execute(bestBlackMove, game);
                Output.Print(game);
                Thread.Sleep(250);
                if (game.BlackWins)
                {
                    break;
                }
            }

            if (game.WhiteWins)
            {
                Output.PrintMessage("White wins.");
            }
            else if (game.BlackWins)
            {
                Output.PrintMessage("Black wins.");
            }
        }