class RubyLife::Grid
Attributes
size[R]
Public Class Methods
new(size, state: nil)
click to toggle source
# File lib/ruby_life/grid.rb, line 5 def initialize(size, state: nil) @size = size if state raise BadInitialState unless size_matches_state?(@size, state) @storage = state.map { |status| Cell.new(status) } else @storage = number_of_cells(@size).times.map { Cell.new } end end
Public Instance Methods
[](x, y)
click to toggle source
# File lib/ruby_life/grid.rb, line 36 def [](x, y) @storage[x + (y * size)] end
generate!()
click to toggle source
# File lib/ruby_life/grid.rb, line 40 def generate! next_generation = {} @storage.each_with_index do |cell, index| neighbors = get_neighbors_from_index(index) living_neighbor_count = neighbors.select(&:alive?).count if cell.alive? && [2, 3].include?(living_neighbor_count) next_generation[index] = :alive elsif cell.alive? && living_neighbor_count == 4 next_generation[index] = :dead elsif cell.dead? && living_neighbor_count == 3 next_generation[index] = :alive else next_generation[index] = :dead end end next_generation.each do |index, status| status == :alive ? @storage[index].live! : @storage[index].die! end end
get_neighbors_from_index(index)
click to toggle source
# File lib/ruby_life/grid.rb, line 16 def get_neighbors_from_index(index) indices_to_retrieve = [] indices_to_retrieve << (index - 1) unless beginning_of_row?(index) indices_to_retrieve << (index + 1) unless end_of_row?(index) unless first_row?(index) indices_to_retrieve << (above(index - 1)) unless beginning_of_row?(index) indices_to_retrieve << (above(index + 1)) unless end_of_row?(index) indices_to_retrieve << (above(index)) end unless last_row?(index) indices_to_retrieve << (below(index) - 1) unless beginning_of_row?(index) indices_to_retrieve << (below(index) + 1) unless end_of_row?(index) indices_to_retrieve << (below(index)) end indices_to_retrieve.map { |i| @storage[i] } end
state()
click to toggle source
# File lib/ruby_life/grid.rb, line 63 def state @storage.map(&:status) end
to_s()
click to toggle source
# File lib/ruby_life/grid.rb, line 67 def to_s grid_string = "" @storage.each_with_index do |cell, index| grid_string += " #{cell}" grid_string += "\n" if end_of_row?(index) end grid_string end
Private Instance Methods
above(index)
click to toggle source
# File lib/ruby_life/grid.rb, line 99 def above(index) index - size end
beginning_of_row?(index)
click to toggle source
# File lib/ruby_life/grid.rb, line 79 def beginning_of_row?(index) index % size == 0 end
below(index)
click to toggle source
# File lib/ruby_life/grid.rb, line 103 def below(index) index + size end
end_of_row?(index)
click to toggle source
# File lib/ruby_life/grid.rb, line 83 def end_of_row?(index) (index + 1) % size == 0 end
first_row?(index)
click to toggle source
# File lib/ruby_life/grid.rb, line 87 def first_row?(index) index < size end
last_row?(index)
click to toggle source
# File lib/ruby_life/grid.rb, line 91 def last_row?(index) index >= (number_of_cells(size) - size) end
number_of_cells(size)
click to toggle source
# File lib/ruby_life/grid.rb, line 107 def number_of_cells(size) size * size end
size_matches_state?(size, state)
click to toggle source
# File lib/ruby_life/grid.rb, line 95 def size_matches_state?(size, state) number_of_cells(size) == state.length end