cellular_automata 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0237b3c22f9d23179fc50a5c88bc5217ce95025e
4
- data.tar.gz: 93bcb9d782c3ec0643fdee8b9e04d0de01c62a3c
3
+ metadata.gz: cc753c35c9c45bb5df74f2678d37c0d2ba9af371
4
+ data.tar.gz: ff0800f910754856743abc46f147f4bb0ae19225
5
5
  SHA512:
6
- metadata.gz: b0ae054a68622f16753da6ca3968a20c64af2ea6af76a342a5223f10f435553cc71be98315f607b92f159cf7e29eb435411253f5a626dc13e96d9ba8855ab8f9
7
- data.tar.gz: dc06e35c815e74eeed6ba5048f352410937d8b51e67d827d7f7b3112c83cc087d3196f5910e357900fd61693d1f9227734cb316652be05de7c3fabe0f976acd7
6
+ metadata.gz: 30f23c199406a34c53c29a0887d0317cfb1cf78d4ba3deb1b69c949b6e446e6f8f847a077fae2e4459730fd9179b496a35f891b8a9a8f0cfeeea55377adb4e26
7
+ data.tar.gz: 3f27c51e0a612acd9921e20cf87e738d199ad5b2dc5767c1904adf29fdfe729e4f8bcfe6ea55386a2be6c6e90f0d675ef798cd2adb6736e002c9e4cb48f3560f
data/.gitignore CHANGED
@@ -9,3 +9,4 @@
9
9
  /tmp/
10
10
  *.gem
11
11
  /lib/*.bundle
12
+ /bin/cell_console
data/README.md CHANGED
@@ -21,7 +21,23 @@ Or install it yourself as:
21
21
 
22
22
  ## Usage
23
23
 
24
- At present, it can only play Conway's Game of Life. Run `cell` to watch.
24
+ ```
25
+ cell [options] RULE
26
+ -w, --width WIDTH Set width
27
+ -h, --height HEIGHT Set height
28
+ -s, --scale SCALE Factor by which to scale game board
29
+ -c, --cell-width WIDTH Factor by which to scale cells
30
+ Use 1 for an 'LED' look
31
+ Use 2 for no borders around cells
32
+ or choose anything in between
33
+ -f, --full-screen Full screen
34
+ -v, --version Print version information
35
+ --help Display this screen
36
+ ```
37
+
38
+ RULE is a [standard Life Rule](http://www.conwaylife.com/wiki/Cellular_automaton) in the format `S.../B...` The `/` is optional, and it doesn't matter which comes first.
39
+
40
+ `cell_console` (a console version with simple ASCII output) also exists, but isn't near as interesting!
25
41
 
26
42
  ## Development
27
43
 
@@ -30,10 +46,6 @@ Install gosu dependencies:
30
46
  % brew install sdl2 libogg libvorbis
31
47
  ```
32
48
 
33
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
34
-
35
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
36
-
37
49
  ## Contributing
38
50
 
39
51
  1. Fork it ( https://github.com/ffleming/cellular_automata/fork )
data/bin/cell CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'cellular_automata'
4
4
  require 'optparse'
5
+ require 'gosu'
5
6
 
6
7
  def opts_from_cli
7
8
  options = {}
@@ -10,7 +11,10 @@ def opts_from_cli
10
11
  opts.banner = "#{opts.program_name} [options] RULE"
11
12
  opts.on('-w WIDTH', '--width WIDTH', 'Set width') { |w| options[:width] = w.to_i }
12
13
  opts.on('-h HEIGHT', '--height HEIGHT', 'Set height') { |h| options[:height] = h.to_i }
13
- opts.on('-r REFRESH', '--refresh REFRESH', 'Set refresh rate in seconds') { |r| options[:refresh] = r.to_f }
14
+ opts.on('-s SCALE', '--scale SCALE', 'Factor by which to scale game board') { |s| options[:scale] = s.to_i }
15
+ opts.on('-c WIDTH', '--cell-width WIDTH', 'Factor by which to scale cells', 'Use 1 for an \'LED\' look',
16
+ 'Use 2 for no borders around cells', 'or choose anything in between') {|w| options[:cell_scale] = w.to_f }
17
+ opts.on('-f', '--full-screen', 'Full screen') { options[:fullscreen] = true }
14
18
  opts.on('-v', '--version', 'Print version information') do
15
19
  puts "#{File.basename(__FILE__)} #{CellularAutomata::VERSION}"
16
20
  exit true
@@ -30,19 +34,20 @@ def opts_from_cli
30
34
  end
31
35
 
32
36
  opts = opts_from_cli
33
- opts[:width] ||= 120
34
- opts[:height] ||= 30
35
- opts[:refresh] ||= 0.1
37
+ opts[:width] ||= 160
38
+ opts[:height] ||= 120
39
+ opts[:scale] ||= 2
40
+ opts[:cell_scale] ||= 2.0
41
+ opts[:cell_scale] = 2.0 if opts[:cell_scale] > 2.0
42
+ opts[:cell_scale] = 1.0 if opts[:cell_scale] < 1.0
43
+ opts[:fullscreen] ||= false
36
44
  rule = ARGV[0] || 'B3S2'
37
- board = CellularAutomata::Board.new(width: opts[:width], height: opts[:height], rule: rule)
45
+ opts[:rule] = rule
38
46
 
39
47
  trap 'SIGINT' do
40
48
  exit
41
49
  end
42
50
 
43
- while true do
44
- puts "\e[H\e[2J"
45
- board.tick!
46
- puts board.to_s
47
- sleep opts[:refresh]
48
- end
51
+ window = CellWindow.new(opts)
52
+ window.show
53
+ exit
data/bin/cell_console CHANGED
@@ -2,16 +2,47 @@
2
2
 
3
3
  require 'cellular_automata'
4
4
  require 'optparse'
5
- require 'byebug'
6
- require 'pry'
7
5
 
8
- width = 120
9
- height = 30
10
- rule = 'B3S2'
11
- board = CellularAutomata::Board.new(width: width, height: height, rule: rule)
12
- board.tick!
13
- board.tick!
14
- puts board.to_s
15
- state = board.state
16
- binding.pry
17
- exit
6
+ def opts_from_cli
7
+ options = {}
8
+ opt_parser = OptionParser.new do |opts|
9
+ opts.program_name = File.basename(__FILE__)
10
+ opts.banner = "#{opts.program_name} [options] RULE"
11
+ opts.on('-w WIDTH', '--width WIDTH', 'Set width') { |w| options[:width] = w.to_i }
12
+ opts.on('-h HEIGHT', '--height HEIGHT', 'Set height') { |h| options[:height] = h.to_i }
13
+ opts.on('-r REFRESH', '--refresh REFRESH', 'Set refresh rate in seconds') { |r| options[:refresh] = r.to_f }
14
+ opts.on('-v', '--version', 'Print version information') do
15
+ puts "#{File.basename(__FILE__)} #{CellularAutomata::VERSION}"
16
+ exit true
17
+ end
18
+ opts.on('--help', 'Display this screen') do
19
+ puts opts
20
+ exit true
21
+ end
22
+ end
23
+ begin
24
+ opt_parser.parse!
25
+ rescue OptionParser::InvalidOption => e
26
+ puts e.message
27
+ exit false
28
+ end
29
+ options
30
+ end
31
+
32
+ opts = opts_from_cli
33
+ opts[:width] ||= 120
34
+ opts[:height] ||= 30
35
+ opts[:refresh] ||= 0.1
36
+ rule = ARGV[0] || 'B3S2'
37
+ board = CellularAutomata::Board.new(width: opts[:width], height: opts[:height], rule: rule)
38
+
39
+ trap 'SIGINT' do
40
+ exit
41
+ end
42
+
43
+ while true do
44
+ puts "\e[H\e[2J"
45
+ board.tick!
46
+ puts board.to_s
47
+ sleep opts[:refresh]
48
+ end
@@ -8,7 +8,6 @@ require "cellular_automata/cell"
8
8
  require "cellular_automata/rule"
9
9
  require "cellular_automata/board"
10
10
  require "cellular_automata/gui_window"
11
- require "cellular_automata/gif_writer"
12
11
  require 'cellular_c.bundle'
13
12
 
14
13
  module CellularAutomata
@@ -1,3 +1,3 @@
1
1
  module CellularAutomata
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cellular_automata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Forrest Fleming
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-18 00:00:00.000000000 Z
11
+ date: 2015-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gosu
@@ -152,8 +152,6 @@ email:
152
152
  executables:
153
153
  - cell
154
154
  - cell_console
155
- - cell_gif
156
- - cell_gui
157
155
  extensions:
158
156
  - ext/cellular_c/extconf.rb
159
157
  extra_rdoc_files: []
@@ -166,15 +164,12 @@ files:
166
164
  - Rakefile
167
165
  - bin/cell
168
166
  - bin/cell_console
169
- - bin/cell_gif
170
- - bin/cell_gui
171
167
  - cellular_automata.gemspec
172
168
  - ext/cellular_c/cellular_c.c
173
169
  - ext/cellular_c/extconf.rb
174
170
  - lib/cellular_automata.rb
175
171
  - lib/cellular_automata/board.rb
176
172
  - lib/cellular_automata/cell.rb
177
- - lib/cellular_automata/gif_writer.rb
178
173
  - lib/cellular_automata/gui_window.rb
179
174
  - lib/cellular_automata/rule.rb
180
175
  - lib/cellular_automata/version.rb
data/bin/cell_gif DELETED
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'cellular_automata'
4
- require 'optparse'
5
- require 'gosu'
6
-
7
- def opts_from_cli
8
- options = {}
9
- opt_parser = OptionParser.new do |opts|
10
- opts.program_name = File.basename(__FILE__)
11
- opts.banner = "#{opts.program_name} [options] RULE"
12
- opts.on('-w WIDTH', '--width WIDTH', 'Set width') { |w| options[:width] = w.to_i }
13
- opts.on('-h HEIGHT', '--height HEIGHT', 'Set height') { |h| options[:height] = h.to_i }
14
- opts.on('-s SCALE', '--scale SCALE', 'Factor by which to scale game board') { |s| options[:scale] = s.to_i }
15
- opts.on('-c WIDTH', '--cell-width WIDTH', 'Factor by which to scale cells', 'Use 1 for an \'LED\' look',
16
- 'Use 2 for no borders around cells', 'or choose anything in between') {|w| options[:cell_scale] = w.to_f }
17
- opts.on('-f FRAMES', '--frames FRAMES', 'Number of frames to write') { |f| options[:frames] = f.to_i }
18
- opts.on('-v', '--version', 'Print version information') do
19
- puts "#{File.basename(__FILE__)} #{CellularAutomata::VERSION}"
20
- exit true
21
- end
22
- opts.on('--help', 'Display this screen') do
23
- puts opts
24
- exit true
25
- end
26
- end
27
- begin
28
- opt_parser.parse!
29
- rescue OptionParser::InvalidOption => e
30
- puts e.message
31
- exit false
32
- end
33
- options
34
- end
35
-
36
- opts = opts_from_cli
37
- opts[:width] ||= 160
38
- opts[:height] ||= 120
39
- opts[:scale] ||= 1
40
- opts[:cell_scale] ||= 2.0
41
- opts[:cell_scale] = 2.0 if opts[:cell_scale] > 2.0
42
- opts[:cell_scale] = 1.0 if opts[:cell_scale] < 1.0
43
- opts[:frames] ||= 100
44
- rule = ARGV[0] || 'B3S2'
45
- opts[:rule] = rule
46
-
47
- trap 'SIGINT' do
48
- exit
49
- end
50
-
51
- CellularAutomata::GifWriter.write(opts)
52
- exit
data/bin/cell_gui DELETED
@@ -1,53 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'cellular_automata'
4
- require 'optparse'
5
- require 'gosu'
6
-
7
- def opts_from_cli
8
- options = {}
9
- opt_parser = OptionParser.new do |opts|
10
- opts.program_name = File.basename(__FILE__)
11
- opts.banner = "#{opts.program_name} [options] RULE"
12
- opts.on('-w WIDTH', '--width WIDTH', 'Set width') { |w| options[:width] = w.to_i }
13
- opts.on('-h HEIGHT', '--height HEIGHT', 'Set height') { |h| options[:height] = h.to_i }
14
- opts.on('-s SCALE', '--scale SCALE', 'Factor by which to scale game board') { |s| options[:scale] = s.to_i }
15
- opts.on('-c WIDTH', '--cell-width WIDTH', 'Factor by which to scale cells', 'Use 1 for an \'LED\' look',
16
- 'Use 2 for no borders around cells', 'or choose anything in between') {|w| options[:cell_scale] = w.to_f }
17
- opts.on('-f', '--full-screen', 'Full screen') { options[:fullscreen] = true }
18
- opts.on('-v', '--version', 'Print version information') do
19
- puts "#{File.basename(__FILE__)} #{CellularAutomata::VERSION}"
20
- exit true
21
- end
22
- opts.on('--help', 'Display this screen') do
23
- puts opts
24
- exit true
25
- end
26
- end
27
- begin
28
- opt_parser.parse!
29
- rescue OptionParser::InvalidOption => e
30
- puts e.message
31
- exit false
32
- end
33
- options
34
- end
35
-
36
- opts = opts_from_cli
37
- opts[:width] ||= 160
38
- opts[:height] ||= 120
39
- opts[:scale] ||= 2
40
- opts[:cell_scale] ||= 2.0
41
- opts[:cell_scale] = 2.0 if opts[:cell_scale] > 2.0
42
- opts[:cell_scale] = 1.0 if opts[:cell_scale] < 1.0
43
- opts[:fullscreen] ||= false
44
- rule = ARGV[0] || 'B3S2'
45
- opts[:rule] = rule
46
-
47
- trap 'SIGINT' do
48
- exit
49
- end
50
-
51
- window = CellWindow.new(opts)
52
- window.show
53
- exit
@@ -1,56 +0,0 @@
1
- module CellularAutomata::GifWriter
2
- class << self
3
- def write(opts={})
4
- @scale = opts[:scale]
5
- @cell_width = scale**opts[:cell_scale]
6
- @board = CellularAutomata::Board.new(width: opts[:width]/scale, height: opts[:height]/scale, rule: opts[:rule])
7
- @gif = Magick::ImageList.new
8
- @width = opts[:width]
9
- @height = opts[:height]
10
- @frames = opts[:frames]
11
- write_gif('test.gif')
12
- end
13
-
14
- private
15
-
16
- attr_reader :board, :scale, :cell_width, :frames, :writer, :height, :width
17
-
18
- def write_gif(outfile)
19
- frames.times do |i|
20
- draw_frame
21
- board.tick!
22
- end
23
- @gif.write(outfile)
24
- end
25
-
26
- def draw_frame
27
- writer = Magick::Draw.new
28
- frame = Magick::Image.new(width, height) do
29
- self.background_color = '#000000'
30
- end
31
- board.each_cell do |cell|
32
- prev_1 = board.history[0][cell.y][cell.x]
33
- prev_2 = board.history[1][cell.y][cell.x]
34
- color = '#000000'
35
- if cell.alive?
36
- color = '#FFFF00'
37
- elsif prev_1.alive?
38
- color = '#AAAA00'
39
- elsif prev_2.alive?
40
- color = '#444400'
41
- end
42
- writer.stroke color
43
- writer.fill color
44
- x1 = cell.x * scale**2
45
- y1 = cell.y * scale**2
46
- x2 = x1 + cell_width
47
- y2 = y1 + cell_width
48
- writer.rectangle(x1, y1, x2, y2)
49
- end
50
- writer.draw(frame)
51
- @gif << frame
52
- print '.'
53
- end
54
- end
55
- end
56
-