見てのとおり、穴掘り迷路です。Gem 'ruby2d' を使いました。Ruby2D についてはこちら。
コード。
dig_maze.rb
require "ruby2d" L = 20 #迷路の大きさ W = L * 2 + 3 Block_w = 10 set width: W * Block_w, height: W * Block_w, fps_cap: 10 blocks = W.times.map {|y| W.times.map {|x| Square.new x: x * Block_w, y: y * Block_w, size: Block_w, color: "green" } } field = Array.new(W) {Array.new(W, 1)} field[0] = field[-1] = Array.new(W, -1) (1..W - 2).each {|y| field[y][0] = field[y][-1] = -1} field.define_singleton_method(:show) do each_index do |y| self[y].each_index do |x| self[y][x].zero? ? blocks[y][x].remove : blocks[y][x].add end end end start = [2, 2] stack = [start] show_stack = [start] dig = ->(now) { movable = [] [[1, 0], [0, -1], [-1, 0], [0, 1]].each do |dx, dy| x = now[0] + dx * 2 y = now[1] + dy * 2 movable << [x, y] if field[y][x] == 1 end if movable.empty? return if stack.empty? jump = stack.delete_at(rand(stack.size)) dig.(jump) else nxt = movable.sample show_stack << [(now[0] + nxt[0]) / 2, (now[1] + nxt[1]) / 2] show_stack << nxt stack << nxt end } update do now = show_stack.shift next unless now field[now[1]][now[0]] = 0 field.show dig.(now) if show_stack.empty? end show