algoalgo-world
algoalgo-world/maze/sidewinder
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;
}
돌려 보고 코드도 본다