life 0.2.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +3 -3
- data/lib/life/cli.rb +42 -18
- data/lib/life/grid.rb +7 -0
- data/lib/life/version.rb +1 -1
- data/lib/life/world.rb +4 -0
- data/spec/life/grid_spec.rb +7 -0
- data/spec/life/world_spec.rb +7 -0
- metadata +2 -2
data/README.md
CHANGED
@@ -12,17 +12,17 @@ To use Life, run the `life new` command. It can be used with the following optio
|
|
12
12
|
* `--width` or `-w` specifies how many cells wide the game will be
|
13
13
|
* `--height` or `-h` specifies how many cells high the game will be
|
14
14
|
* `--generations` or `-g` specifies how many generations the simulation will run
|
15
|
+
* '--seed' or '-s' is the initial pattern of the game. Pass coordinate pairs using the following pattern: `x:y x:y x:y ...`
|
15
16
|
|
16
17
|
```
|
17
18
|
$ life new -w 3 -h 4 -g 5
|
18
19
|
```
|
19
20
|
This will create a 3x4 game that runs for 5 generations
|
20
21
|
|
21
|
-
When first creating a game, you will be prompted to
|
22
|
+
When first creating a game, you will be prompted to add cells some live cells.
|
22
23
|
|
23
24
|
## TODO
|
24
|
-
*
|
25
|
-
* Animate instead of displaying all the generations
|
25
|
+
* Add some default configurations to start the fun
|
26
26
|
|
27
27
|
## Contributing
|
28
28
|
|
data/lib/life/cli.rb
CHANGED
@@ -12,32 +12,56 @@ module Life
|
|
12
12
|
method_option :width, :type => :numeric, :aliases => '-w', :desc => "Width of board", :required => true
|
13
13
|
method_option :height, :type => :numeric,:aliases => '-h', :desc => "Height of board", :required => true
|
14
14
|
method_option :generations, :type => :numeric,:aliases => '-g', :desc => "How many generations to display", :required => true
|
15
|
+
method_option :seed, :type => :array, :aliases => '-s', :desc => "Initial Pattern"
|
15
16
|
|
16
17
|
def new
|
17
|
-
seed = []
|
18
|
-
|
19
|
-
|
20
|
-
y = ask "Please enter y coordinate"
|
21
|
-
seed << [(x.to_i) - 1, (y.to_i) -1]
|
22
|
-
end
|
23
|
-
|
24
|
-
world = World.new options[:width], options[:height], seed
|
18
|
+
seed = build_seed(options[:seed])
|
19
|
+
max_gen = options[:generations]
|
20
|
+
world = build_world(options[:width], options[:height], seed)
|
25
21
|
|
26
|
-
(1..
|
27
|
-
|
28
|
-
|
29
|
-
puts ""
|
22
|
+
(1..max_gen).each do |gen|
|
23
|
+
print world.to_s("@", "_") + eol(options[:height], gen, max_gen)
|
24
|
+
sleep(1)
|
30
25
|
world.tick
|
31
26
|
end
|
32
27
|
end
|
33
28
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
29
|
+
no_tasks do
|
30
|
+
def eol(height, curr_gen, max_gen)
|
31
|
+
curr_gen == max_gen ? "\n" : format("\e[1A" * (height-1) + "\r")
|
32
|
+
end
|
33
|
+
|
34
|
+
def build_seed(pattern)
|
35
|
+
pattern.map {|pair| pair.split(":").map { |coord| coord.to_i - 1 } }
|
36
|
+
end
|
37
|
+
|
38
|
+
def build_world(width, height, seed=[])
|
39
|
+
while yes? "Would you like to add a live cell to the grid? [Y/n]"
|
40
|
+
x = get_x(width)
|
41
|
+
y = get_y(height)
|
42
|
+
seed << [(x.to_i) - 1, (y.to_i) -1]
|
43
|
+
end
|
44
|
+
World.new height, width, seed
|
40
45
|
end
|
46
|
+
|
47
|
+
def get_x(width)
|
48
|
+
x = ask("Please enter x coordinate").to_i
|
49
|
+
while x > width
|
50
|
+
puts "This number is too big"
|
51
|
+
x = ask("Please enter x coordinate").to_i
|
52
|
+
end
|
53
|
+
return x
|
54
|
+
end
|
55
|
+
|
56
|
+
def get_y(height)
|
57
|
+
y = ask("Please enter y coordinate").to_i
|
58
|
+
while y > height
|
59
|
+
puts "This number is too big"
|
60
|
+
y = ask("Please enter y coordinate").to_i
|
61
|
+
end
|
62
|
+
return y
|
63
|
+
end
|
64
|
+
|
41
65
|
end
|
42
66
|
|
43
67
|
end
|
data/lib/life/grid.rb
CHANGED
data/lib/life/version.rb
CHANGED
data/lib/life/world.rb
CHANGED
data/spec/life/grid_spec.rb
CHANGED
@@ -15,6 +15,13 @@ describe Grid do
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
describe "#to_s" do
|
19
|
+
let(:grid) { World.new(3,3, [[0,0], [1,2], [2,1]])}
|
20
|
+
it "should output the correct string" do
|
21
|
+
grid.to_s("@", "_").should eq "@ _ _\n_ _ @\n_ @ _"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
18
25
|
describe "#deep_copy" do
|
19
26
|
let(:grid) { Grid.new(3,4) }
|
20
27
|
it "should create a distinct copy" do
|
data/spec/life/world_spec.rb
CHANGED
@@ -17,6 +17,13 @@ describe World do
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
describe "to_s" do
|
21
|
+
let(:world) { World.new(3,3, [[0,0], [1,2], [2,1]])}
|
22
|
+
it "should output the correct string" do
|
23
|
+
world.to_s("@", "_").should eq "@ _ _\n_ _ @\n_ @ _"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
20
27
|
describe "Rules" do
|
21
28
|
before { world.tick }
|
22
29
|
subject { world.current[1][1] }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: life
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|