Initial Commit
This commit is contained in:
commit
4a5fdb75aa
16
binary_tree.rb
Normal file
16
binary_tree.rb
Normal file
@ -0,0 +1,16 @@
|
||||
class BinaryTree
|
||||
def self.on(grid)
|
||||
grid.each_cell do |cell|
|
||||
neighbors = []
|
||||
neighbors << cell.north if cell.north
|
||||
neighbors << cell.east if cell.east
|
||||
|
||||
neighbor = neighbors.sample
|
||||
|
||||
cell.link(neighbor) if neighbor
|
||||
|
||||
end
|
||||
|
||||
grid
|
||||
end
|
||||
end
|
9
binary_tree_demo.rb
Normal file
9
binary_tree_demo.rb
Normal file
@ -0,0 +1,9 @@
|
||||
require "grid"
|
||||
require "binary_tree"
|
||||
|
||||
grid = Grid.new(6, 10)
|
||||
BinaryTree.on(grid)
|
||||
|
||||
puts grid
|
||||
img = grid.to_png
|
||||
img.save "bt.png"
|
38
cell.rb
Normal file
38
cell.rb
Normal file
@ -0,0 +1,38 @@
|
||||
class Cell
|
||||
attr_reader :row, :column
|
||||
attr_accessor :north, :south, :east, :west
|
||||
|
||||
def initialize(row, column)
|
||||
@row, @column = row, column
|
||||
@links = {}
|
||||
end
|
||||
|
||||
def link(cell, bidi=true)
|
||||
@links[cell] = true
|
||||
cell.link(self, false) if bidi
|
||||
self
|
||||
end
|
||||
|
||||
def unlink(cell, bidi=true)
|
||||
@links.delete(cell)
|
||||
cell.unlink(self, false) if bidi
|
||||
self
|
||||
end
|
||||
|
||||
def links
|
||||
@links.keys
|
||||
end
|
||||
|
||||
def linked?(cell)
|
||||
@links.key?(cell)
|
||||
end
|
||||
|
||||
def neighbors
|
||||
list = []
|
||||
list << north if north
|
||||
list << south if south
|
||||
list << east if east
|
||||
list << west if west
|
||||
list
|
||||
end
|
||||
end
|
116
grid.rb
Normal file
116
grid.rb
Normal file
@ -0,0 +1,116 @@
|
||||
require "cell"
|
||||
require "chunky_png"
|
||||
|
||||
class Grid
|
||||
attr_reader :rows, :columns
|
||||
|
||||
def initialize(rows, columns)
|
||||
@rows = rows
|
||||
@columns = columns
|
||||
|
||||
@grid = prepare_grid
|
||||
configure_cells
|
||||
end
|
||||
|
||||
def prepare_grid
|
||||
Array.new(rows) do |row|
|
||||
Array.new(columns) do |column|
|
||||
Cell.new(row, column)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def configure_cells
|
||||
each_cell do |cell|
|
||||
row, col = cell.row, cell.column
|
||||
|
||||
cell.north = self[row - 1, col]
|
||||
cell.south = self[row + 1, col]
|
||||
cell.west = self[row, col - 1]
|
||||
cell.east = self[row, col + 1]
|
||||
end
|
||||
end
|
||||
|
||||
def [](row, column)
|
||||
return nil unless row.between?(0, @rows - 1)
|
||||
return nil unless column.between?(0, @grid[row].count - 1)
|
||||
@grid[row][column]
|
||||
end
|
||||
|
||||
def random_cell
|
||||
row = rand(@rows)
|
||||
column = rand(@grid[row].count)
|
||||
|
||||
self[row, column]
|
||||
end
|
||||
|
||||
def size
|
||||
@rows * @columns
|
||||
end
|
||||
|
||||
def each_row
|
||||
@grid.each do |row|
|
||||
yield row
|
||||
end
|
||||
end
|
||||
|
||||
def each_cell
|
||||
each_row do |row|
|
||||
row.each do |cell|
|
||||
yield cell if cell
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def to_s
|
||||
output = "+" + "---+" * columns + "\n"
|
||||
corner = "+"
|
||||
|
||||
each_row do |row|
|
||||
top = "|"
|
||||
bottom = "+"
|
||||
|
||||
row.each do |cell|
|
||||
cell = Cell.new(-1, -1) unless cell
|
||||
body = " "
|
||||
east_boundary = (cell.linked?(cell.east) ? " " : "|")
|
||||
top << body << east_boundary
|
||||
|
||||
south_boundary = (cell.linked?(cell.south) ? " " : "---")
|
||||
bottom << south_boundary << corner
|
||||
end
|
||||
|
||||
output << top << "\n"
|
||||
output << bottom << "\n"
|
||||
end
|
||||
|
||||
output
|
||||
end
|
||||
|
||||
def to_png(cell_size: 10)
|
||||
img_width = cell_size * columns
|
||||
img_height = cell_size * rows
|
||||
|
||||
background = ChunkyPNG::Color::WHITE
|
||||
wall = ChunkyPNG::Color::BLACK
|
||||
|
||||
img = ChunkyPNG::Image.new(img_width + 1, img_height + 1, background)
|
||||
|
||||
each_cell do |cell|
|
||||
x1 = cell.column * cell_size
|
||||
y1 = cell.row * cell_size
|
||||
x2 = (cell.column+1) * cell_size
|
||||
y2 = (cell.row+1) * cell_size
|
||||
|
||||
img.line(x1, y1, x2, y1, wall) unless cell.north
|
||||
img.line(x1, y1, x1, y2, wall) unless cell.west
|
||||
img.line(x2, y1, x2, y2, wall) unless cell.linked?(cell.east)
|
||||
img.line(x1, y2, x2, y2, wall) unless cell.linked?(cell.south)
|
||||
end
|
||||
|
||||
img
|
||||
|
||||
end
|
||||
|
||||
end
|
26
sidewinder.rb
Normal file
26
sidewinder.rb
Normal file
@ -0,0 +1,26 @@
|
||||
class Sidewinder
|
||||
def self.on(grid)
|
||||
grid.each_row do |row|
|
||||
run = []
|
||||
row.each do |cell|
|
||||
run << cell
|
||||
|
||||
at_eastern_boundary = (cell.east == nil)
|
||||
at_northern_boundary = (cell.north == nil)
|
||||
|
||||
should_close_out = at_eastern_boundary || (!at_northern_boundary && rand(2) == 0)
|
||||
|
||||
if should_close_out
|
||||
member = run.sample
|
||||
member.link(member.north) if member.north
|
||||
run.clear
|
||||
else
|
||||
cell.link(cell.east)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
grid
|
||||
end
|
||||
end
|
9
sidewinder_demo.rb
Normal file
9
sidewinder_demo.rb
Normal file
@ -0,0 +1,9 @@
|
||||
require "grid"
|
||||
require "sidewinder"
|
||||
|
||||
grid = Grid.new(6, 10)
|
||||
Sidewinder.on(grid)
|
||||
|
||||
puts grid
|
||||
img = grid.to_png
|
||||
img.save "sw.png"
|
Loading…
Reference in New Issue
Block a user