Example #1
0
        public HeuristicsResults GetResults(AlgorithmRunResults results)
        {
            var shortestPath = _shortestPathSolver.GetGraph(results.Carver);

            return(new HeuristicsResults
            {
                TotalCells = GetTotalSize(results.Carver.Size),
                ShortestPathResult = shortestPath,
                Stats = _mazeStatsGenerator.GetResultsFromMaze(results)
            });
        }
 public MazeStatsResult GetResultsFromMaze(AlgorithmRunResults results)
 {
     return(GetResult(results.DirectionsCarvedIn));
 }
Example #3
0
        public MazeGenerationResults GenerateMaze(MazeGenerationSettings settings)
        {
            IMazeCarver carver         = null;
            var         modelBuildTime = _timeRecorder.GetRunningTime(() =>
            {
                var model = _mazeModelFactory.BuildMaze(settings);
                carver    = _mazeFactory.GetMazeCarver(model);
            });

            AlgorithmRunResults results = null;
            int extraWallsAdded         = 0;
            var generationTime          = _timeRecorder.GetRunningTime(() =>
            {
                switch (settings.Algorithm)
                {
                case Algorithm.None:
                    throw new ArgumentException("None not supported");

                case Algorithm.GrowingTreeAlgorithm:
                    results = _growingTreeAlgorithm.GenerateMaze(carver, settings);
                    break;

                case Algorithm.RecursiveBacktrackerAlgorithm:
                    results = _recursiveBacktrackerAlgorithm.GenerateMaze(carver, settings);
                    break;

                case Algorithm.BinaryTreeAlgorithm:
                    results = _binaryTreeAlgorithm.GenerateMaze(carver, settings);
                    break;

                default:
                    throw new ArgumentException("Unsupported algorithm type");
                }
                carver          = results.Carver;
                extraWallsAdded = _extraWall.Calulate(carver.Size);
                _randomCarver.CarveRandomWalls(carver, settings.ExtraWalls, extraWallsAdded);
            });

            DeadEndFillerResult deadEndFillerResults = null;
            var deadEndFillerTime = _timeRecorder.GetRunningTime(() =>
            {
                deadEndFillerResults = _deadEndFiller.Fill(carver);
            });
            AgentResults result = null;
            var          agentGenerationTime = _timeRecorder.GetRunningTime(() =>
            {
                if (settings.AgentType != AgentType.None)
                {
                    result = _agentFactory.MakeAgent(settings.AgentType).RunAgent(carver);
                }
            });

            HeuristicsResults heuristicsResults = null;
            var heuristicsTime = _timeRecorder.GetRunningTime(() =>
            {
                heuristicsResults = _heuristicsGenerator.GetResults(results);
            });

            var times     = new [] { modelBuildTime, generationTime, deadEndFillerTime, agentGenerationTime, heuristicsTime };
            var totalTime = times.Aggregate(new TimeSpan(), (seed, value) => seed.Add(value));

            return(new MazeGenerationResults
            {
                MazeJumper = carver.CarvingFinished(),
                HeuristicsResults = heuristicsResults,
                DirectionsCarvedIn = results.DirectionsCarvedIn,
                DeadEndFillerResults = deadEndFillerResults,
                ModelTime = modelBuildTime,
                AgentResults = result,
                GenerationTime = generationTime,
                DeadEndFillerTime = deadEndFillerTime,
                AgentGenerationTime = agentGenerationTime,
                HeuristicsTime = heuristicsTime,
                TotalTime = totalTime
            });
        }