1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ruby2D で穴掘り迷路を作る

Last updated at Posted at 2020-07-18

IMAGE ALT TEXT HERE
Gem "Ruby2D" を使ってなんとなく「穴掘り迷路」を実装してみました。「道」が段々伸びていくのがリアルタイムで見られるようになっています。上画像は YouTube 動画にリンクされています。

##コード

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

Ruby2D のメソッドを簡単に解説します。

  • set ウィンドウの大きさなどを設定します。
  • Square.new 正方形をあらわすオブジェクトを生成します。オブジェクトは.add .removeを付けることで表示されたり、非表示になったりします。
  • update ブロック内が一定の時間(ふつうは60fps)で更新されます。ここでは 10fps で表示しています。
  • show メインループに入ります。

穴掘り自体は簡単な再帰で実装しています。配列変数fieldが迷路をあらわしていて、値が0ならば「道」があることを意味しています。周囲には「番兵」を置いていて、その外へ「道」が出ないようにしています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?