Esempio n. 1
0
        /// <summary>
        /// Function that solves the maze using the solver.
        /// </summary>
        public void Solve(IMazeSolver solver, Action <IEnumerable <IMazeCell> > solvedResultCallback)
        {
            if (solver == null)
            {
                throw new ArgumentNullException("solver", "Solver cannot be null");
            }

            if (solvedResultCallback == null)
            {
                throw new ArgumentNullException("solvedResultCallback", "Please provide a callback action");
            }


            _logger.LogInformation($"Solve Using: {solver.GetType().Name}");


            //calls solver's solve method.
            solver.Solve(this, (solvedPath) =>
            {
                if (solvedPath == null)
                {
                    solvedResultCallback(new List <IMazeCell>(0));//return a empty path if the solver could not solve the maze.
                }
                else
                {
                    solvedResultCallback(solvedPath);
                }
            });
        }
Esempio n. 2
0
        /// <summary>
        /// Complex and memory consuming resources may be prepared before the controller is started.
        /// </summary>
        public void PrepareForStart()
        {
            // Prepare the solver.
            if (mazeForm != null)
            {
                solver = SolverFactory.CreateSolver(mazeForm.StrategyName, this.Maze, mazePainter);
            }
            else
            {
                solver = SolverFactory.CreateSolver(null, this.Maze, mazePainter);
            }

            // Prepare the solution path.
            solutionPath = SolverFactory.SolutionPath(this.Maze);

            // If our Maze has embedded mazes, we need to supply them with embedded solvers.
            CreateEmbeddedSolvers();

            // Prepare embedded solvers.
            foreach (EmbeddedSolverController item in embeddedControllers)
            {
                item.PrepareForStart();
            }

            // After all controllers have been created, some resources need to be shared with the master controller.
            if (this.Maze.MazeId == MazeSquare.PrimaryMazeId)
            {
                CoordinateEmbeddedControllers(this);
            }
        }
Esempio n. 3
0
        public void SF_CreateSolverTest_01()
        {
            string testObject = "SWA.Ariadne.Logic.SolverFactory.CreateSolver";

            Maze        maze       = NewMaze();
            IMazeDrawer mazeDrawer = null;
            IMazeSolver actual     = SolverFactory.CreateSolver(null, maze, mazeDrawer);

            Assert.IsInstanceOfType(actual, typeof(IMazeSolver), testObject + " did not return an instanze of IMazeSolver");
        }
Esempio n. 4
0
        public void SF_CreateDefaultSolverTest_01()
        {
            string testObject = "SWA.Ariadne.Logic.SolverFactory.CreateDefaultSolver";

            Maze        maze       = NewMaze();
            IMazeDrawer mazeDrawer = null;
            IMazeSolver actual     = SolverFactory.CreateDefaultSolver(maze, mazeDrawer);

            Assert.IsInstanceOfType(actual, SolverFactory.DefaultStrategy, testObject + " did not return an instance of the default strategy.");
        }
Esempio n. 5
0
        public void SF_CreateSolverTest_type_01()
        {
            string testObject = "SWA.Ariadne.Logic.SolverFactory.CreateSolver(type)";

            foreach (Type solverType in SolverFactory.SolverTypes)
            {
                Maze        maze       = NewMaze();
                IMazeDrawer mazeDrawer = null;
                IMazeSolver actual     = SWA_Ariadne_Logic_SolverFactoryAccessor.CreateSolver(solverType, maze, mazeDrawer);

                Assert.IsInstanceOfType(actual, typeof(IMazeSolver), testObject + " did not return an instanze of IMazeSolver");
                Assert.IsInstanceOfType(actual, solverType, testObject + " did not return the given type");
            }
        }
Esempio n. 6
0
        public void SB_SolveTest_01()
        {
            string testObject = "SWA.Ariadne.Logic.SolverBase.Solve";

            foreach (Type solverType in SolverFactory.SolverTypes)
            {
                Maze        maze       = SolverFactoryTest.NewMaze();
                IMazeDrawer mazeDrawer = null;
                IMazeSolver target     = SWA_Ariadne_Logic_SolverFactoryAccessor.CreateSolver(solverType, maze, mazeDrawer);
                target.Solve();

                Assert.IsTrue(maze.IsSolved, testObject + ": " + target.GetType().Name + " did not solve the maze.");
            }
        }
Esempio n. 7
0
        private void FillMaze()
        {
            // Create a maze with fixed layout.
            mazeUserControl.Setup(5, 2, 3);

            // Draw the maze walls.
            mazeUserControl.MazePainter.PaintMaze(null);

            // Solve the maze.
            IMazeSolver solver = SolverFactory.CreateDefaultSolver(mazeUserControl.Maze, mazeUserControl.MazePainter);

            solver.Reset();
            solver.Solve();
        }
Esempio n. 8
0
        /// <summary>
        /// Returns a new MazeSolver of the given Type.
        /// </summary>
        /// <param name="solverType"></param>
        /// <param name="maze"></param>
        /// <returns></returns>
        private static IMazeSolver CreateSolver(Type solverType, Maze maze, IMazeDrawer mazeDrawer)
        {
            IMazeSolver result = (IMazeSolver)solverType.GetConstructor(
                new Type[2] {
                typeof(Maze), typeof(IMazeDrawer)
            }).Invoke(
                new object[2] {
                maze, mazeDrawer
            }
                );

            result.Reset();

            return(result);
        }
Esempio n. 9
0
        /// <summary>
        /// Returns a new MazeSolver.
        /// A (reasonably) intelligent strategy is chosen randomly.
        /// </summary>
        /// <param name="maze"></param>
        /// <returns></returns>
        private static IMazeSolver CreateSolver(Maze maze, IMazeDrawer mazeDrawer)
        {
            Random r = SWA.Utilities.RandomFactory.CreateRandom();

            while (true)
            {
                Type t = solverTypes[r.Next(solverTypes.Length)];
                bool shouldBeEfficient = (r.Next(2) == 0);
                shouldBeEfficient &= RegisteredOptions.GetBoolSetting(RegisteredOptions.OPT_EFFICIENT_SOLVERS);
                bool shouldUseHeuristic = (r.Next(2) == 0);
                // Note: There is currently no equivaelnt OPT_HEURISTIC_SOLVERS option.

                if (t == typeof(RandomWalker))
                {
                    // too dumb
                    continue;
                }

                if (t == typeof(MasterSolver))
                {
                    // too smart
                    continue;
                }

                IMazeSolver result = CreateSolver(t, maze, mazeDrawer);

                if (shouldBeEfficient && HasEfficientVariant(t))
                {
                    result.MakeEfficient();
                }
                if (shouldUseHeuristic && HasHeuristicVariant(t))
                {
                    result.UseHeuristic();
                }

                return(result);
            }
        }
Esempio n. 10
0
        public void SB_OpenWallsTest_01()
        {
            string testObject = "SWA.Ariadne.Logic.SolverBase.OpenWalls";

            MazeSquare sq = new MazeSquare(0, 0);

            for (WallPosition wp = WallPosition.WP_MIN; wp <= WallPosition.WP_MAX; wp++)
            {
                sq[wp] = WallState.WS_CLOSED;
            }

            Maze maze = new Maze(0, 0);

            maze.CreateMaze();
            IMazeSolver target = SolverFactory.CreateDefaultSolver(maze, null);
            SWA_Ariadne_Logic_SolverBaseAccessor accessor = new SWA_Ariadne_Logic_SolverBaseAccessor(target);

            bool notVisitedOnly = false;
            List <WallPosition> actual;

            actual = accessor.OpenWalls(sq, notVisitedOnly);

            Assert.AreEqual(0, actual.Count, testObject + " did not return the expected value.");
        }
Esempio n. 11
0
 /// <summary>
 /// When the controller is Ready or Finished, memory consuming
 /// resources should be deallocated.
 /// </summary>
 public void ReleaseResources()
 {
     solver       = null;
     solutionPath = null;
     embeddedControllers.Clear();
 }
Esempio n. 12
0
 public MazeGame(IMazeGenerator mazeGenerator, IMazeSolver mazeSolver)
 {
     _mazeGenerator = mazeGenerator;
     _mazeSolver    = mazeSolver;
 }
Esempio n. 13
0
 public MazeController(IMazeSolver mazeSolver)
 {
     _mazeSolver = mazeSolver;
 }