루비 2D로 드릴링 미로 만들기
"Gem""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
Rubby2D 방법을 간단히 설명합니다.set 창의 크기 등을 설정합니다.Square.new 정사각형을 나타내는 대상을 생성한다.객체는 추가.add.remove를 통해 표시되거나 숨겨집니다.update 블록 내에서 일정 시간(보통 60fps)에 업데이트됩니다.여기에는 10fps로 표시한다.show 주순환에 들어간다.field는 미로를 표시하고, 값0은'길'이 있음을 나타낸다.주위에'번병'을 두어'길'이 나오지 못하게 하다.
Reference
이 문제에 관하여(루비 2D로 드릴링 미로 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/obelisk68/items/153f1e3c085a6e75fe00텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)