private static void GetExit(PortalLoc portalLoc, out int nextX, out int nextY, int[,] map, int R, int C) { nextX = -1; nextY = -1; if (portalLoc.dir == 0) { if (Wall(portalLoc.X, portalLoc.Y - 1, map, R, C)) { nextX = portalLoc.X; nextY = portalLoc.Y; return; } if (Wall(portalLoc.X, portalLoc.Y, map, R, C)) { nextX = portalLoc.X; nextY = portalLoc.Y-1; return; } } if (portalLoc.dir == 1) { if (Wall(portalLoc.X-1, portalLoc.Y, map, R, C)) { nextX = portalLoc.X; nextY = portalLoc.Y; return; } if (Wall(portalLoc.X, portalLoc.Y, map, R, C)) { nextX = portalLoc.X-1; nextY = portalLoc.Y; return; } } }
private static List<PortalLoc> GetPortalLocs(int[,] map, int startX, int startY, int R, int C) { if (portalLocCache[startX, startY] != null) return portalLocCache[startX, startY]; List<PortalLoc> locs = new List<PortalLoc>(); for (int i = startX + 1; i <= C; i++) { if (Wall(i, startY, map, R, C)) { PortalLoc loc = new PortalLoc(); loc.X = i; loc.Y = startY; loc.dir = 1; locs.Add(loc); break; } } for (int i = startX - 1; i >= -1; i--) { if (Wall(i, startY, map, R, C)) { PortalLoc loc = new PortalLoc(); loc.X = i + 1; loc.Y = startY; loc.dir = 1; locs.Add(loc); break; } } for (int i = startY + 1; i <= R; i++) { if (Wall(startX, i, map, R, C)) { PortalLoc loc = new PortalLoc(); loc.X = startX; loc.Y = i; loc.dir = 0; locs.Add(loc); break; } } for (int i = startY - 1; i >= -1; i--) { if (Wall(startX, i, map, R, C)) { PortalLoc loc = new PortalLoc(); loc.X = startX; loc.Y = i+1; loc.dir = 0; locs.Add(loc); break; } } portalLocCache[startX, startY] = locs; return locs; }
private static bool NextTo(int X, int Y, PortalLoc portalLoc, int[,] map, int R, int C) { if (portalLoc.dir == 0) { if (portalLoc.X == X && portalLoc.Y == Y && Wall(X, Y - 1, map, R, C)) return true; if (portalLoc.X == X && portalLoc.Y == Y + 1 && Wall(X, Y + 1, map, R, C)) return true; } if (portalLoc.dir == 1) { if (portalLoc.Y == Y && portalLoc.X == X && Wall(X - 1, Y, map, R, C)) return true; if (portalLoc.Y == Y && portalLoc.X == X + 1 && Wall(X + 1, Y, map, R, C)) return true; } return false; }