public void FloodCrateMoveMap() { SokobanMap map = new SokobanMap(); map.SetFromStrings(new string[] { "~~~###~~~~~", "~~##.#~####", "~##..###..#", "##.X......#", "#...PX.#..#", "###.X###..#", "~~#..#OO..#", "~##.##O#.##", "~#......##~", "~#.....##~~", "~#######~~~" }); Bitmap result = CrateAnalysis.BuildCrateMoveMap(map, new VectorInt(3,3)); Assert.IsNotNull(result); Debug.WriteLine(map.ToString()); Debug.WriteLine(result.ToString()); Debug.WriteLine("done."); }
public void TestRoom() { string[] puzzle = new string[] { "~~###########", "~##.....#..P#", "###.X.XX#...#", "#.##X....XX.#", "#..#..X.#...#", "######.######", "#OO.OOX.#$##~", "#.OO....###~~", "#..OO#####~~~", "#########~~~~" }; SokobanMap map = new SokobanMap(); map.SetFromStrings(puzzle); PuzzleMap pMap = new PuzzleMap((Puzzle)null); pMap.Map = map; SolverController solver = new SolverController(pMap); solver.Init(); }
public void TestReverseStrategyCoreSimple() { CodeTimer timer = new CodeTimer(""); timer.Start(); try { SokobanMap map = new SokobanMap(); map.SetFromStrings(new string[] { "~##~#####", "##.##.O.#", "#.##.XO.#", "~##.X...#", "##.XP.###", "#.X..##~~", "#OO.##.##", "#...#~##~", "#####~#~~" }); PuzzleMap pMap = new PuzzleMap((Puzzle)null); pMap.Map = map; SolverController controller = new SolverController(pMap); controller.Init(); controller.State = SolverController.States.Running; // Manually set state, as we are not using the controller; but the strategy uses the controller to check if it should exit ReverseStrategy rev = new ReverseStrategy(controller); Evaluator<SolverNode> eval = new Evaluator<SolverNode>(); EvalStatus result = eval.Evaluate(rev); Assert.AreEqual(EvalStatus.CompleteSolution, result, "Should find a solution"); } finally { timer.Stop(); System.Console.WriteLine("Total Time: " + timer.Duration(1)); } }
public void TestFindCratePath() { SokobanMap map = new SokobanMap(); map.SetFromStrings(new string[] { "~~~###~~~~~", "~~##.#~####", "~##..###..#", "##.X......#", "#...PX.#..#", "###.X###..#", "~~#..#OO..#", "~##.##O#.##", "~#......##~", "~#.....##~~", "~#######~~~" }); CrateAnalysis.ShortestCratePath result = CrateAnalysis.FindCratePath(map, new VectorInt(3, 3), new VectorInt(9, 5)); Assert.IsNotNull(result); Debug.WriteLine(map.ToString()); Debug.WriteLine(result.CratePath.ToString()); Debug.WriteLine(result.PlayerPath.ToString()); Debug.WriteLine("done."); }
protected SolverResult SolveFromString(string[] puzzle) { SokobanMap map = new SokobanMap(); map.SetFromStrings(puzzle); return Solve(map); }
public override ReturnCodes Execute(ConsoleCommandController controller) { if (ArgReport != null) { reportFile = File.CreateText(ArgReport); } if (!string.IsNullOrEmpty(ArgSolverLibrary)) { DateTime start = DateTime.Now; // MODE: Progress + Library ProgressComponent comp = new ProgressComponent(); Library lib = null; // It is exists load... if (File.Exists(ArgSolverLibrary)) { comp.Load(ArgSolverLibrary); } // If a library is specified, merge/add it... if (!string.IsNullOrEmpty(ArgLibrary)) { XmlProvider xml = new XmlProvider(); lib = xml.Load(ArgLibrary); comp.Add(lib); } int cc = 0; foreach (SolverPuzzle item in comp.Items) { if (ArgNonSolutionOnly && item.HasSolution) { controller.DisplayLable("Skipping solution", item.Name); cc++; continue; } TimeSpan left = TimeSpan.FromSeconds((double) (comp.Items.Count - cc)*ArgMaxTime); controller.DisplayLable("Est. Time Left", left.ToString()); controller.DisplayLable("Time Elapsed", (DateTime.Now-start).ToString()); controller.Display("=========================================================================="); controller.Display(""); controller.DisplayLable("Attempt", string.Format("{0}/{1} {2}%, maxtime={3}", cc, comp.Items.Count, cc*100/comp.Items.Count, TimeSpan.FromSeconds(ArgMaxTime))); controller.DisplayLable("Name", item.Name); controller.DisplayLable("Rating", string.Format("{0}, size=({1}, {2})", item.Rating, item.Width, item.Height)); controller.Display(StringHelper.Join(item.NormalisedMap, null, Environment.NewLine)); SokobanMap map = new SokobanMap(); map.SetFromStrings(item.NormalisedMap); using (SolverController ctrl = new SolverController(map)) { ctrl.ExitConditions.MaxDepth = 1000; ctrl.ExitConditions.MaxItterations = 10000000; ctrl.ExitConditions.MaxTimeSecs = (float) ArgMaxTime; SolverResult res = ctrl.Solve(); if (res.Exception != null) { controller.Display(res.Exception); } controller.DisplayLable("Result", res.Summary); comp.Update(res); } CheckForceGC(); controller.Display("---------------------------------------------------------------------------"); if (System.Console.KeyAvailable && System.Console.ReadKey().KeyChar == 'Q') { controller.Display("BREAK REQUESTED... Exiting"); break; } cc++; } comp.Save(ArgSolverLibrary); } else if (!string.IsNullOrEmpty(ArgLibrary)) { // MODE: Only Library XmlProvider xml = new XmlProvider(); Library lib = xml.Load(ArgLibrary); if (ArgPuzzle == "*") { int cc = 0; foreach (Puzzle puzzle in lib.Puzzles) { cc++; controller.Display(""); controller.DisplayLable("Attempting", string.Format("{0:000} of {1:000}", cc, lib.Puzzles.Count)); SolvePuzzle(puzzle.MasterMap, puzzle.GetDetails().Name); CheckForceGC(); if (System.Console.KeyAvailable && System.Console.ReadKey().KeyChar == 'Q') { controller.Display("BREAK REQUESTED... Exiting"); break; } } } else { Puzzle pux = lib.GetPuzzleByID(ArgPuzzle); SolvePuzzle(pux.MasterMap, pux.GetDetails().Name); } } if (reportFile != null) { reportFile.Close(); reportFile.Dispose(); } return ReturnCodes.OK; }