public static Map<float> CalculateWeightings(StaticMaps input) { const float goal = 999; const float cornergoal = 1.2f; var res = input.GoalMap.ToMap(goal, 0); foreach (var corner in input.CornerMap.TruePositions()) { if (res[corner] > 0) res[corner] *= cornergoal; } res = AverageOver(res, input.FloorMap, input.GoalMap); foreach (var dead in input.DeadMap.TruePositions()) { res[dead] = -1; } return res; }
public static bool DynamicCheck(StaticMaps staticMaps, IStateMaps node) { var both = staticMaps.WallMap.BitwiseOR(node.CrateMap); // Box Rule foreach (var crate in node.CrateMap.TruePositions()) { if (staticMaps.GoalMap[crate]) continue; if (both[crate + VectorInt2.Left] && both[crate + VectorInt2.Left + VectorInt2.Down] && both[crate + VectorInt2.Down] ) { return true; } if (both[crate + VectorInt2.Left] && both[crate + VectorInt2.Left + VectorInt2.Up] && both[crate + VectorInt2.Up] ) { return true; } if (both[crate + VectorInt2.Right] && both[crate + VectorInt2.Right + VectorInt2.Down] && both[crate + VectorInt2.Down] ) { return true; } if (both[crate + VectorInt2.Right] && both[crate + VectorInt2.Right + VectorInt2.Up] && both[crate + VectorInt2.Up] ) { return true; } } return false; }
public void CaseA() { var report = new TestReport(); var sample = new Puzzle(new string[] { "#############", "#a ### b##", "# A###### ##", "# ######B ##", "######### ##", "#############", }); var boundry = sample.ToMap('#', 'A', 'B' ); var staticMaps = new StaticMaps() { FloorMap = sample.ToMap(' ', 'a', 'b'), WallMap = sample.ToMap('#') }; var stateMaps = new StateMaps() { CrateMap = sample.ToMap('A', 'B'), MoveMap = FloodFill.Fill(staticMaps.WallMap, sample.First(x => x.State == 'a').Position) }; var pushMap = PushMap.Find(staticMaps, stateMaps, sample.First(x => x.State == 'A').Position, sample.First(x => x.State == 'a').Position); report.WriteLine(pushMap); Assert.That(report, Is.EqualTo(new TestReport( @"............. ..X.......... ............. ..X.......... ............. ............." ))); }
public static IBitmap FindDeadMap(StaticMaps staticMaps) { var dead = new Bitmap(staticMaps.FloorMap.Size); // All corners are dead (provided no goals) foreach (var corner in staticMaps.CornerMap.TruePositions()) { if (!staticMaps.GoalMap[corner]) dead[corner] = true; } // All recesses are dead (provided no goals) foreach (var recess in staticMaps.RecessMap) { if (!recess.Intersects(staticMaps.GoalMap)) { foreach (var cc in recess.TruePositions()) { dead[cc] = true; } } } return dead; }
public void OverAndBackAgain() { var report = new TestReport(); var sample = new Puzzle(new string[] { "#############", "#...........#", "#...........#", "#...........#", "######.######", "#......x....#", "#o.........p#", "#############", }); var staticMaps = new StaticMaps() { FloorMap = sample.ToMap('.', 'x','o', 'p'), WallMap = sample.ToMap('#') }; var crate = sample.ToMap('X', 'x'); var stateMaps = new StateMaps() { CrateMap = crate, MoveMap = FloodFill.Fill(staticMaps.WallMap.BitwiseOR(crate), sample.First(x => x.State == 'p').Position) }; var from = sample.First(x => x.State == 'x').Position; var to = sample.First(x => x.State == 'p').Position; var pushMap = PushMap.Find(staticMaps, stateMaps, from, to); report.WriteLine(pushMap); Assert.That(report, Is.EqualTo(new TestReport( @"............. .XXXXXXXXXXX. .XXXXXXXXXXX. .XXXXXXXXXXX. ......X...... .XXXXXXXXXXX. .XXXXXXXXXXX. ............. " ))); var playerRoute = pushMap.FindPlayerWalkRoute(to); report.WriteLine("pushMap.FindPlayerWalkRoute(to)"); report.WriteLine(playerRoute); var crateRoute = pushMap.FindCrateRoute(to); report.WriteLine("pushMap.FindCrateRoute(to)"); report.WriteLine(crateRoute); }
public void MultipleCrates() { var report = new TestReport(); var sample = new Puzzle(new string[] { "#############", "# x p##", "#x ##", "# ######X ##", "######### ##", "#############", }); var staticMaps = new StaticMaps() { FloorMap = sample.ToMap(' ', 'x', 'X', 'p'), WallMap = sample.ToMap('#') }; var crate = sample.ToMap('X', 'x'); var stateMaps = new StateMaps() { CrateMap = crate, MoveMap = FloodFill.Fill(staticMaps.WallMap.BitwiseOR(crate), sample.First(x => x.State == 'p').Position) }; var pushMap = PushMap.Find(staticMaps, stateMaps, sample.First(x => x.State == 'X').Position, sample.First(x => x.State == 'p').Position); report.WriteLine(pushMap); Assert.That(report, Is.EqualTo(new TestReport( @"............. .....XXXXXX.. ..XXXXXXXXX.. ..X......XX.. .........XX.. ............. " ))); }
public void CaseB_WithPath() { var report = new TestReport(); var sample = new Puzzle(new string[] { "#############", "#a ### b##", "# A###### ##", "# ######B ##", "######### ##", "#############", }); var staticMaps = new StaticMaps() { FloorMap = sample.ToMap(' ', 'a', 'b'), WallMap = sample.ToMap('#') }; var stateMaps = new StateMaps() { CrateMap = sample.ToMap('A', 'B'), MoveMap = FloodFill.Fill(staticMaps.WallMap, sample.First(x => x.State == 'b').Position) }; var pushMap = PushMap.Find(staticMaps, stateMaps, sample.First(x => x.State == 'B').Position, sample.First(x => x.State == 'b').Position); report.WriteLine(pushMap); var path = pushMap.FindPlayerWalkRoute(new VectorInt2(6, 1)); report.WriteLine(path); Assert.That(report, Is.EqualTo(new TestReport( @"............. ......XXXX... .........X... ............. .........X... ............. DDDLUURULLL "))); }
private static List<StaticMaps.LineBitmap> FindWalls(StaticMaps staticMaps) { var cornerAndSide = staticMaps.CornerMap.BitwiseOR(staticMaps.SideMap); var res = new List<StaticMaps.LineBitmap>(); res.AddRange(FindRunsHorx(cornerAndSide)); res.AddRange(FindRunsVert(cornerAndSide)); return res; }
private static IBitmap FindSides(StaticMaps staticMaps) { var res = new Bitmap(staticMaps.FloorMap.Size); foreach (var floor in staticMaps.FloorMap.TruePositions()) { if (staticMaps.CornerMap[floor]) continue; // Corners cannot be doors // ### // ?.? if (staticMaps.WallMap[floor + VectorInt2.Up] && staticMaps.WallMap[floor + VectorInt2.Up + VectorInt2.Left] && staticMaps.WallMap[floor + VectorInt2.Up + VectorInt2.Right]) res[floor] = true; // ?.? // ### if (staticMaps.WallMap[floor + VectorInt2.Down] && staticMaps.WallMap[floor + VectorInt2.Down + VectorInt2.Left] && staticMaps.WallMap[floor + VectorInt2.Down + VectorInt2.Right]) res[floor] = true; // #? // #. // #? if (staticMaps.WallMap[floor + VectorInt2.Left] && staticMaps.WallMap[floor + VectorInt2.Left + VectorInt2.Up] && staticMaps.WallMap[floor + VectorInt2.Left + VectorInt2.Down]) res[floor] = true; // ?# // .# // ?# if (staticMaps.WallMap[floor + VectorInt2.Right] && staticMaps.WallMap[floor + VectorInt2.Right + VectorInt2.Up] && staticMaps.WallMap[floor + VectorInt2.Right + VectorInt2.Down]) res[floor] = true; } return res; }
private static List<StaticMaps.LineBitmap> FindRecesses(StaticMaps staticMaps) { return staticMaps.IndividualWalls.Where(x => staticMaps.CornerMap[x.Start] && staticMaps.CornerMap[x.End]) .ToList(); }
public static StaticMaps Generate(Puzzle puzzle) { var s= new StaticMaps() { WallMap = puzzle.ToMap(puzzle.Definition.Wall, puzzle.Definition.Void), FloorMap = puzzle.ToMap(puzzle.Definition.AllFloors), GoalMap = puzzle.ToMap(puzzle.Definition.AllGoals), CrateStart = puzzle.ToMap(puzzle.Definition.AllCrates), }; // Complex s.CornerMap = FindCorners(s); s.DoorMap = FindDoors(s); s.SideMap = FindSides(s); s.IndividualWalls = FindWalls(s); s.RecessMap = FindRecesses(s); return s; }
public static IBitmap FindCorners(StaticMaps staticMaps) { var res = new Bitmap(staticMaps.FloorMap.Size); foreach (var floor in staticMaps.FloorMap.TruePositions()) { // ## // #. if (staticMaps.WallMap[floor + VectorInt2.Up] && staticMaps.WallMap[floor + VectorInt2.Left] ) { res[floor] = true; } // ## // .# if (staticMaps.WallMap[floor + VectorInt2.Up] && staticMaps.WallMap[floor + VectorInt2.Right] ) { res[floor] = true; } // .# // ## if (staticMaps.WallMap[floor + VectorInt2.Down] && staticMaps.WallMap[floor + VectorInt2.Right] ) { res[floor] = true; } // #. // ## if (staticMaps.WallMap[floor + VectorInt2.Down] && staticMaps.WallMap[floor + VectorInt2.Left] ) { res[floor] = true; } } return res; }