summaryrefslogtreecommitdiffstats
path: root/CLI/ruby/lib
diff options
context:
space:
mode:
authora14m <[email protected]>2020-12-03 13:33:02 +0100
committera14m <[email protected]>2020-12-03 15:03:09 +0100
commit27b78771d819c4d9c1fe8537429d16fbc41d6a34 (patch)
treecd67f8de5e29e65463b5684c7e9e3477c9cdbcae /CLI/ruby/lib
parent05730269d4d2d690d871548ae3930d3ce20cdcad (diff)
Add the GameOfLife module API for generating universes and running them
Diffstat (limited to 'CLI/ruby/lib')
-rw-r--r--CLI/ruby/lib/game_of_life.rb52
1 files changed, 51 insertions, 1 deletions
diff --git a/CLI/ruby/lib/game_of_life.rb b/CLI/ruby/lib/game_of_life.rb
index 7f70933..f8eba24 100644
--- a/CLI/ruby/lib/game_of_life.rb
+++ b/CLI/ruby/lib/game_of_life.rb
@@ -1,11 +1,61 @@
# frozen_string_literal: true
require "game_of_life/version"
+require "game_of_life/plane"
require "game_of_life/universe"
require "game_of_life/cell"
+# Game of Life module entry point
module GameOfLife
- class Error < StandardError; end
+ class << self
+ # Generate a universe based on the options (from an input file/URI) or using a random/passed seed
+ # This method also sets the Classes/Modules constants for the run defining the options for
+ # Cell (Dead/Live) state representations, and the delay introduced after rendering each universe/generation
+ # and the banner for the info/options
+ #
+ # @param options [Hash] CLI options to generate initial conditions
+ # @option options [String | nil] "input" path to a local file or URL to open
+ # @option options [Numeric] "seed" number to use if no "input" is provided (defaults to random)
+ # @option options [Numeric] "width" of the universe
+ # @option options [Numeric] "height" of the universe
+ # @option options [Numeric] "delay" introduced after each cycle
+ # @option options [String] "live-cell" representation
+ # @option options [String] "dead-cell" representation
+ # @return [GameOfLife::Universe] populated with the parsed input/seed
+ def generate(options)
+ # Define the constants for Cell representation
+ GameOfLife::Cell.const_set(:LIVE_CELL, options["live-cell"])
+ GameOfLife::Cell.const_set(:DEAD_CELL, options["dead-cell"])
+ # Define the constant used for delay
+ GameOfLife.const_set(:DELAY, options["delay"].to_f)
+
+ banner = options["input"] ? "Input: #{options['input']}" : "Seed: #{options['seed']}"
+ # Define the constant used for banner info
+ GameOfLife.const_set(:BANNER, banner)
+
+ return GameOfLife::Generators::Input.new(options) if options["input"]
+ GameOfLife::Generators::Seed.new(options)
+ end
+
+ # The infinite running loop for rendering the current state of a universe
+ # and then evolving it and repeating.
+ def run(universe)
+ Kernel.loop do
+ GameOfLife.render(universe)
+ universe.evolve!
+ end
+ end
+
+ # Private method to do the terminal screen/scrollback buffer cleaning
+ # and rendering of the current universe/banner info
+ # based on the delay configured by the user
+ def render(universe)
+ puts "\33c\e[3J" # Clears the screen and scrollback buffer.
+ puts universe.to_s
+ puts BANNER
+ sleep(DELAY / 1000.0)
+ end
+ end
# Generators module for generating the universe initial state
module Generators