Ich habe versucht, ein "Bohrlabyrinth" mit Gem "Ruby2D" zu implementieren. Sie können sehen, wie die "Straße" in Echtzeit allmählich wächst. Das Bild oben ist mit einem YouTube-Video verknüpft.
dig_maze.rb
require "ruby2d"
L = 20 #Die Größe des Labyrinths
W = L * 2 + 3
Block_w = 10 #Die Größe eines Blocks
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)}
#Setzen Sie einen "Wächter"
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
Ich werde kurz die Methode von Ruby2D erklären.
--set
Legt die Größe des Fensters usw. fest.
--Square.new
Erstellt ein Objekt, das ein Quadrat darstellt. Objekte können durch Hinzufügen von .add``.remove
ein- oder ausgeblendet werden.
--update
Der Block wird in einem bestimmten Zeitraum (normalerweise 60 fps) aktualisiert. Hier wird es mit 10 fps angezeigt.
--show
Betritt die Hauptschleife.
Das Graben selbst wird durch einfache Rekursion implementiert. Wenn die Array-Variable "Feld" ein Labyrinth darstellt und der Wert "0" ist, bedeutet dies, dass es einen "Weg" gibt. Es gibt "Wachen", so dass es draußen keine "Straße" gibt.
Recommended Posts