class Rsb::Gol::Universe

Constants

DEFAULT_COLUMNS
DEFAULT_ROWS

Attributes

clock[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/rsb/gol/universe.rb, line 10
def initialize(options = {})
  @grid = if options[:grid]
            options[:grid]
          elsif options[:cols] && options[:rows]
            Rsb::Gol::Grid.new(options[:rows], options[:cols])
          else
            Rsb::Gol::Grid.new(DEFAULT_ROWS, DEFAULT_COLUMNS)
          end
  @clock = 0
end

Public Instance Methods

evolution() click to toggle source
# File lib/rsb/gol/universe.rb, line 21
def evolution
  deaths = []
  births = []

  @grid.cell_neighbors do |state, x, y, neighbors|
    if state == 1
      deaths << [x, y] if neighbors.size < 2 || neighbors.size > 3
    end

    if state == 0
      births << [x, y] if neighbors.size == 3
    end
  end

  { deaths: deaths, births: births }
end
populate(population) click to toggle source
# File lib/rsb/gol/universe.rb, line 38
def populate(population)
  population[:deaths].each {|(x, y)| @grid.kill(x, y)}
  population[:births].each {|(x, y)| @grid.spawn(x, y)}
  {
    deaths: population[:deaths].size,
    births: population[:births].size
  }
end
seed(coords) click to toggle source
# File lib/rsb/gol/universe.rb, line 47
def seed(coords)
  coords.each do |x, y|
    @grid.spawn(x,y)
  end
end
tick!() click to toggle source
# File lib/rsb/gol/universe.rb, line 57
def tick!
  @clock += 1
  stats = populate(evolution())
  {
    empty_universe: stats[:deaths] == 0 && stats[:births] == 0,
    deaths: stats[:deaths],
    births: stats[:births],
    clock: clock
  }
end
visualize(alive = 'o', dead = ' ') click to toggle source
# File lib/rsb/gol/universe.rb, line 53
def visualize(alive = 'o', dead = ' ')
  @grid.visualize(alive, dead)
end