maze/binary-tree
二叉树迷宫
选一种语言就能看到代码
def binary_tree_maze(w, h, rng): links = [0] * (w * h) for room in range(w * h): dirs = [d for d in (0, 1) if neighbor(room, d) >= 0] if not dirs: continue d = rng.choice(dirs) carve(links, room, neighbor(room, d), d) return links
function binaryTreeMaze(w, h, rng) { const links = new Array(w * h).fill(0); for (let room = 0; room < w * h; room++) { const dirs = []; if (neighbor(room, 0) >= 0) dirs.push(0); if (neighbor(room, 1) >= 0) dirs.push(1); if (dirs.length === 0) continue; const d = dirs[rng.below(dirs.length)]; carve(links, room, neighbor(room, d), d); } return links; }
void binary_tree_maze(int links[], int w, int h) { for (int room = 0; room < w * h; room++) { int dirs[2]; int count = 0; if (neighbor(room, 0) >= 0) dirs[count++] = 0; if (neighbor(room, 1) >= 0) dirs[count++] = 1; if (count == 0) continue; int d = dirs[rand() % count]; carve(links, room, neighbor(room, d), d); } }
void binary_tree_maze(std::vector<int>& links, int w, int h, std::mt19937& rng) { for (int room = 0; room < w * h; room++) { std::vector<int> dirs; for (int d : {0, 1}) { if (neighbor(room, d) >= 0) dirs.push_back(d); } if (dirs.empty()) continue; std::uniform_int_distribution<size_t> pick(0, dirs.size() - 1); int d = dirs[pick(rng)]; carve(links, room, neighbor(room, d), d); } }
static int[] BinaryTreeMaze(int w, int h, Random rng) { int[] links = new int[w * h]; for (int room = 0; room < w * h; room++) { var dirs = new List<int>(); foreach (int d in new[] { 0, 1 }) { if (Neighbor(room, d) >= 0) dirs.Add(d); } if (dirs.Count == 0) continue; int dir = dirs[rng.Next(dirs.Count)]; Carve(links, room, Neighbor(room, dir), dir); } return links; }
static int[] binaryTreeMaze(int w, int h, Random rng) { int[] links = new int[w * h]; for (int room = 0; room < w * h; room++) { List<Integer> dirs = new ArrayList<>(); for (int d : new int[] {0, 1}) { if (neighbor(room, d) >= 0) dirs.add(d); } if (dirs.isEmpty()) continue; int dir = dirs.get(rng.nextInt(dirs.size())); carve(links, room, neighbor(room, dir), dir); } return links; }