maze_generation.sf 876 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Maze_generation#Sidef
  4. #
  5. var(w, h) = (5, 5);
  6. var avail = (w * h);
  7. # cell is padded by sentinel col and row, so I don't check array bounds
  8. var cell = (1..h -> map {([true] * w) + [false]} + [[false] * (w+1)]);
  9. var ver = (1..h -> map {["| "] * w });
  10. var hor = (0..h -> map {["+--"] * w });
  11. func walk(x, y) {
  12. cell[y][x] = false;
  13. avail-- > 0 || return();
  14. var d = [[-1, 0], [0, 1], [1, 0], [0, -1]];
  15. while (d.len) {
  16. var i = d.pop_rand;
  17. var (x1, y1) = (x + i[0], y + i[1]);
  18. cell[y1][x1] || next;
  19. if (x == x1) { hor[[y1, y].max][x] = '+ ' };
  20. if (y == y1) { ver[y][[x1, x].max] = ' ' };
  21. walk(x1, y1);
  22. }
  23. }
  24. walk(irand(1,w), irand(1, h)); # generate
  25. for i in range(0, h) {
  26. say (hor[i].join('') + '+');
  27. say (ver[i].join('') + '|') if (i < h);
  28. }