루비 2D로 드릴링 미로 만들기

11068 단어 Ruby2DRuby

"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은'길'이 있음을 나타낸다.주위에'번병'을 두어'길'이 나오지 못하게 하다.

    좋은 웹페이지 즐겨찾기