public List <string> CreateSaveText()
    {
        saveText.Add(elementsBounds.GamePlaneBounds.ToString() + " is GamePlaneBounds");
        saveText.Add(saveSystemBoundary.FindStartPlaceForPathFinding().Index + "is StartPlaceForPathFinding");
        saveText.Add(saveSystemBoundary.FindDestinationPlaceForPathFinding().Index + "is DestinationPlaceForPathFinding");
        saveText.Add(planeBuilder.IntagerNumberOfMazeElementsOnXAndY.ToString() + " is IntagerNumberOfElementsOnXAndY");

        for (int i = 0; i < planeBuilder.IntagerNumberOfMazeElementsOnXAndY.x; i++)
        {
            for (int j = 0; j < planeBuilder.IntagerNumberOfMazeElementsOnXAndY.y; j++)
            {
                if (planeBuilder.GetFromMazeArray(i, j).IsMazeWall)
                {
                    string mazeElementIndex = planeBuilder.GetFromMazeArray(i, j).Index.ToString();
                    saveText.Add(mazeElementIndex + " is maze wall element");
                }
            }
        }
        return(saveText);
    }
    public virtual IPathFindAlgo CreatePathFindAlgo(
        EPathFindAlgorithms ePathFindAlgorithm,
        IMazeSpecialElementsSeeker pathFindAlgoBoundary,
        List <IMazeElement> pathFromStartToEnd,
        IPlaneBuilder planeBuilder,
        List <IMazeElement> unexploredMazeElementsList,
        List <IMazeElement> openList,
        List <IMazeElement> closeList,
        IPathFindProcessMetric pathFindProcessMetric)
    {
        PathFindAlgo pathFindAlgo = null;

        switch (ePathFindAlgorithm)
        {
        case EPathFindAlgorithms.DijkstraAlgorithm:

            pathFindAlgo = new PathFindAlgo(
                pathFindAlgoBoundary,
                pathFromStartToEnd,
                new DijkstraPathFinder(
                    planeBuilder,
                    new UnexploredMazeElements(
                        planeBuilder,
                        unexploredMazeElementsList),
                    pathFindAlgoBoundary.FindStartPlaceForPathFinding(),
                    pathFindAlgoBoundary.FindDestinationPlaceForPathFinding(),
                    pathFindProcessMetric),
                new MazeRestarter(
                    planeBuilder));

            break;

        case EPathFindAlgorithms.EuclideanAStar:

            pathFindAlgo = new PathFindAlgo(
                pathFindAlgoBoundary,
                pathFromStartToEnd,
                new AStarPathFinder(
                    pathFindAlgoBoundary.FindStartPlaceForPathFinding(),
                    pathFindAlgoBoundary.FindDestinationPlaceForPathFinding(),
                    new OpenCloseListController(
                        openList,
                        closeList),
                    new NeighboursPathFindParametersProcessor(
                        planeBuilder,
                        pathFindAlgoBoundary.FindDestinationPlaceForPathFinding(),
                        new AStarEuclideanDistanceHeuristic()),
                    pathFindProcessMetric),
                new MazeRestarter(
                    planeBuilder));

            break;

        case EPathFindAlgorithms.ManhattanAStar:

            pathFindAlgo = new PathFindAlgo(
                pathFindAlgoBoundary,
                pathFromStartToEnd,
                new AStarPathFinder(
                    pathFindAlgoBoundary.FindStartPlaceForPathFinding(),
                    pathFindAlgoBoundary.FindDestinationPlaceForPathFinding(),
                    new OpenCloseListController(
                        openList,
                        closeList),
                    new NeighboursPathFindParametersProcessor(
                        planeBuilder,
                        pathFindAlgoBoundary.FindDestinationPlaceForPathFinding(),
                        new AStarManhattanDistanceHeuristic()),
                    pathFindProcessMetric),
                new MazeRestarter(
                    planeBuilder));

            break;
        }


        return(pathFindAlgo);
    }