maze/sidewinder
사이드와인더
언어를 고르면 코드가 열린다
def sidewinder_maze(w, h, rng): links = [0] * (w * h) for y in range(h): run = [] for x in range(w): room = y * w + x run.append(room) if x + 1 < w and (y == 0 or rng.below(2) == 0): carve(links, room, neighbor(room, 1), 1) continue if y > 0: up = rng.choice(run) carve(links, up, neighbor(up, 0), 0) run = [] return links
function sidewinderMaze(w, h, rng) { const links = new Array(w * h).fill(0); for (let y = 0; y < h; y++) { let run = []; for (let x = 0; x < w; x++) { const room = y * w + x; run.push(room); if (x + 1 < w && (y === 0 || rng.below(2) === 0)) { carve(links, room, neighbor(room, 1), 1); continue; } if (y > 0) { const up = run[rng.below(run.length)]; carve(links, up, neighbor(up, 0), 0); } run = []; } } return links; }
void sidewinder_maze(int links[], int w, int h) { int* run = malloc(sizeof(int) * w); for (int y = 0; y < h; y++) { int count = 0; for (int x = 0; x < w; x++) { int room = y * w + x; run[count++] = room; if (x + 1 < w && (y == 0 || rand() % 2 == 0)) { carve(links, room, neighbor(room, 1), 1); continue; } if (y > 0) { int up = run[rand() % count]; carve(links, up, neighbor(up, 0), 0); } count = 0; } } free(run); }
void sidewinder_maze(std::vector<int>& links, int w, int h, std::mt19937& rng) { std::vector<int> run; std::uniform_int_distribution<int> coin(0, 1); for (int y = 0; y < h; y++) { run.clear(); for (int x = 0; x < w; x++) { int room = y * w + x; run.push_back(room); if (x + 1 < w && (y == 0 || coin(rng) == 0)) { carve(links, room, neighbor(room, 1), 1); continue; } if (y > 0) { std::uniform_int_distribution<size_t> pick(0, run.size() - 1); int up = run[pick(rng)]; carve(links, up, neighbor(up, 0), 0); } run.clear(); } } }
static int[] SidewinderMaze(int w, int h, Random rng) { int[] links = new int[w * h]; var run = new List<int>(); for (int y = 0; y < h; y++) { run.Clear(); for (int x = 0; x < w; x++) { int room = y * w + x; run.Add(room); if (x + 1 < w && (y == 0 || rng.Next(2) == 0)) { Carve(links, room, Neighbor(room, 1), 1); continue; } if (y > 0) { int up = run[rng.Next(run.Count)]; Carve(links, up, Neighbor(up, 0), 0); } run.Clear(); } } return links; }
static int[] sidewinderMaze(int w, int h, Random rng) { int[] links = new int[w * h]; List<Integer> run = new ArrayList<>(); for (int y = 0; y < h; y++) { run.clear(); for (int x = 0; x < w; x++) { int room = y * w + x; run.add(room); if (x + 1 < w && (y == 0 || rng.nextInt(2) == 0)) { carve(links, room, neighbor(room, 1), 1); continue; } if (y > 0) { int up = run.get(rng.nextInt(run.size())); carve(links, up, neighbor(up, 0), 0); } run.clear(); } } return links; }