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