public void Run()
        {
            MatrixCoordinates kingCoordinates = new MatrixCoordinates(KingInitialRow, KingInitialColumn);
            King king = new King(kingCoordinates);

            MatrixCoordinates pawnACoordinates = new MatrixCoordinates(PawnAInitialRow, PawnAInitialColumn);
            Pawn pawnA = new Pawn('A', pawnACoordinates);

            MatrixCoordinates pawnBCoordinates = new MatrixCoordinates(PawnBInitialRow, PawnBInitialColumn);
            Pawn pawnB = new Pawn('B', pawnBCoordinates);

            MatrixCoordinates pawnCCoordinates = new MatrixCoordinates(PawnCInitialRow, PawnCInitialColumn);
            Pawn pawnC = new Pawn('C', pawnCCoordinates);

            MatrixCoordinates pawnDCoordinates = new MatrixCoordinates(PawnDInitialRow, PawnDInitialColumn);
            Pawn pawnD = new Pawn('D', pawnDCoordinates);

            bool endOfGame = false;
            int currentMove = 1;
            do
            {
                bool isValidMove = false;
                do
                {
                    try
                    {
                        Console.Clear();
                        Console.WriteLine(this.board.GetImage(king, pawnA, pawnB, pawnC, pawnD));
                        isValidMove = this.IsValidMove(currentMove, king, pawnA, pawnB, pawnC, pawnD);
                    }
                    catch (KingSurvivalException kse)
                    {
                        Console.WriteLine(kse.Message);
                        Console.ReadLine();
                    }
                }
                while (!isValidMove);

                endOfGame = this.HasGameEnded(currentMove, king, pawnA, pawnB, pawnC, pawnD);
                this.isKingWinner = this.HasKingWon(currentMove, endOfGame, king, pawnA, pawnB, pawnC, pawnD);
                currentMove++;
            }
            while (!endOfGame);

            if (endOfGame)
            {
                this.DisplayCurrentEndOnConsole(currentMove, king, pawnA, pawnB, pawnC, pawnD);
            }
        }
        private bool IsAvailableNextPosition(MatrixCoordinates newCoordinates, params MatrixCoordinates[] pawnsCoordinates)
        {
            foreach (MatrixCoordinates coordinates in pawnsCoordinates)
            {
                if (newCoordinates == coordinates)
                {
                    return false;
                }
            }

            return true;
        }
        private bool CanCurrentPawnMove(MatrixCoordinates currentPawnCoordinates, params MatrixCoordinates[] obstaclesCoordinates)
        {
            if (currentPawnCoordinates.Row == BoardMaxRow)
            {
                return false;
            }
            else if (currentPawnCoordinates.Column > 0 && currentPawnCoordinates.Column < BoardMaxColumn)
            {
                MatrixCoordinates newCoordinatesDownRight = currentPawnCoordinates + DownRightDirection;
                MatrixCoordinates newCoordinatesDownLeft = currentPawnCoordinates + DownLeftDirection;

                if (!this.IsAvailableNextPosition(newCoordinatesDownRight, obstaclesCoordinates) &&
                    !this.IsAvailableNextPosition(newCoordinatesDownLeft, obstaclesCoordinates))
                {
                    return false;
                }
            }
            else if (currentPawnCoordinates.Row == 0)
            {
                MatrixCoordinates newCoordinates = currentPawnCoordinates + DownRightDirection;

                if (!this.IsAvailableNextPosition(newCoordinates, obstaclesCoordinates))
                {
                    return false;
                }
            }
            else if (currentPawnCoordinates.Column == BoardMaxColumn)
            {
                MatrixCoordinates newCoordinates = currentPawnCoordinates + DownLeftDirection;

                if (!this.IsAvailableNextPosition(newCoordinates, obstaclesCoordinates))
                {
                    return false;
                }
            }

            return true;
        }