J'ai essayé d'implémenter un "labyrinthe de forage" en utilisant Gem "Ruby2D". Vous pouvez voir la "route" grandir progressivement en temps réel. L'image ci-dessus est liée à une vidéo YouTube.
dig_maze.rb
require "ruby2d"
L = 20    #La taille du labyrinthe
W = L * 2 + 3
Block_w = 10   #La taille d'un bloc
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)}
#Mettez un "tuteur"
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
Je vais expliquer brièvement la méthode de Ruby2D.
--set Définit la taille de la fenêtre, etc.
--Square.new Crée un objet qui représente un carré. Les objets peuvent être affichés ou masqués en ajoutant .add`` .remove.
--ʻUpdate Le bloc est mis à jour dans une certaine période de temps (généralement 60fps). Ici, il est affiché à 10 fps.  --show` Entrez dans la boucle principale.
Le creusement lui-même est implémenté par simple récursif. Si la variable de tableau «field» représente un labyrinthe et que la valeur est «0», cela signifie qu'il existe un «moyen». Il y a des «gardes» autour, de sorte qu'il n'y a pas de «route» à l'extérieur.
Recommended Posts