eat_the_ocean 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README +1 -0
- data/bin/battleship.rb +213 -0
- data/bin/eat_the_ocean +47 -0
- data/lib/battleship_hardmedium.rb +473 -0
- data/lib/evaluator.rb +41 -0
- data/lib/map.rb +42 -0
- data/lib/printer.rb +131 -0
- data/lib/ship.rb +126 -0
- data/test/battleship_test.rb +53 -0
- data/test/evaluator_test.rb +112 -0
- data/test/map_test.rb +46 -0
- data/test/ship_test.rb +86 -0
- metadata +76 -0
data/lib/ship.rb
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
module EatTheOcean
|
2
|
+
class Ship
|
3
|
+
attr_accessor :coordinates, :hits, :size, :sunk, :board_size, :other_ship_array
|
4
|
+
|
5
|
+
def initialize(other_ship_array = [], board_size = 4)
|
6
|
+
@other_ship_array = other_ship_array
|
7
|
+
@coordinates = []
|
8
|
+
@size = @coordinates.length
|
9
|
+
@sunk = 0
|
10
|
+
@hits = 0
|
11
|
+
@board_size = board_size
|
12
|
+
@sample_array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"][0..(@board_size - 1)]
|
13
|
+
end
|
14
|
+
|
15
|
+
def random_1x2
|
16
|
+
@coordinates[0] = @sample_array.sample + rand(1..@board_size).to_s
|
17
|
+
while @coordinates[0] == ((@sample_array[-1] + (@board_size - 1).to_s) || (@sample_array[-2] + (@board_size).to_s) || (@sample_array[-1] + @board_size.to_s))
|
18
|
+
@coordinates[0] = @sample_array.sample + rand(1..@board_size).to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
if self.on_bottom_edge?(@coordinates[0],2)
|
22
|
+
@coordinates [1] = @coordinates[0][0] + @coordinates[0][1].next
|
23
|
+
else
|
24
|
+
@coordinates [1] = @coordinates[0][0].next + @coordinates[0][1]
|
25
|
+
end
|
26
|
+
@coordinates
|
27
|
+
end
|
28
|
+
|
29
|
+
def random_1xSize(size)
|
30
|
+
@coordinates[0] = @sample_array.sample + rand(1..@board_size).to_s
|
31
|
+
while @other_ship_array.include?(@coordinates[0]) || in_corner?(@coordinates[0], size)
|
32
|
+
@coordinates[0] = @sample_array.sample + rand(1..@board_size).to_s
|
33
|
+
end
|
34
|
+
|
35
|
+
if on_bottom_edge?(@coordinates[0], size)
|
36
|
+
0.upto(size-2) do |x|
|
37
|
+
@coordinates << linear_placer(@coordinates[x], "h")
|
38
|
+
end
|
39
|
+
elsif on_right_edge?(@coordinates[0], size)
|
40
|
+
0.upto(size-2) do |x|
|
41
|
+
@coordinates << linear_placer(@coordinates[x], "v")
|
42
|
+
end
|
43
|
+
else
|
44
|
+
if rand > 0.5
|
45
|
+
0.upto(size-2) do |x|
|
46
|
+
@coordinates << linear_placer(@coordinates[x], "h")
|
47
|
+
end
|
48
|
+
else
|
49
|
+
0.upto(size-2) do |x|
|
50
|
+
@coordinates << linear_placer(@coordinates[x], "v")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
if blocked?(@coordinates)
|
56
|
+
self.random_1xSize(size)
|
57
|
+
end
|
58
|
+
|
59
|
+
@coordinates
|
60
|
+
end
|
61
|
+
|
62
|
+
def linear_placer(coordinate, vert_hor)
|
63
|
+
new_coordinate = nil
|
64
|
+
if vert_hor == "v"
|
65
|
+
new_coordinate = coordinate[0].next + coordinate[1]
|
66
|
+
else
|
67
|
+
new_coordinate = coordinate[0] + coordinate[1].next
|
68
|
+
end
|
69
|
+
new_coordinate
|
70
|
+
end
|
71
|
+
|
72
|
+
def in_corner?(coordinate, ship_size)
|
73
|
+
the_corner = []
|
74
|
+
the_corner << (@sample_array[ - (ship_size-1)] + (@board_size - (ship_size - 2)).to_s)
|
75
|
+
|
76
|
+
0.upto(ship_size - 3) do |x|
|
77
|
+
the_corner << linear_placer(the_corner[x], "v")
|
78
|
+
end
|
79
|
+
|
80
|
+
#it makes 1 more coordinate than necessary
|
81
|
+
array_length = the_corner.length
|
82
|
+
if array_length == 2
|
83
|
+
0.upto(1) do |x|
|
84
|
+
the_corner << linear_placer(the_corner[x], "h")
|
85
|
+
end
|
86
|
+
else
|
87
|
+
0.upto(array_length * (array_length - 1)) do |x|
|
88
|
+
the_corner << linear_placer(the_corner[x], "h")
|
89
|
+
end
|
90
|
+
end
|
91
|
+
return the_corner.include?(coordinate)
|
92
|
+
end
|
93
|
+
|
94
|
+
def on_bottom_edge?(coordinate, ship_size)
|
95
|
+
@sample_array[-(ship_size - 1)..-1].include?(coordinate[0])
|
96
|
+
end
|
97
|
+
|
98
|
+
def on_right_edge?(coordinate, ship_size)
|
99
|
+
((@board_size - ship_size + 2)..@board_size).to_a.include?(coordinate[1].to_i)
|
100
|
+
end
|
101
|
+
|
102
|
+
def straight?(array)
|
103
|
+
array.sort!
|
104
|
+
straight_count = 0
|
105
|
+
1.upto(array.length-1) do |x|
|
106
|
+
if array[x-1][0].next + array[x-1][1] == array[x]
|
107
|
+
straight_count += 1
|
108
|
+
elsif array[x-1][0] + array[x-1][1].next == array[x]
|
109
|
+
straight_count += 1
|
110
|
+
end
|
111
|
+
end
|
112
|
+
true if straight_count == array.length - 1
|
113
|
+
end
|
114
|
+
|
115
|
+
def blocked?(array)
|
116
|
+
blocked = false
|
117
|
+
array.each do |coordinate|
|
118
|
+
if @other_ship_array.include?(coordinate)
|
119
|
+
blocked = true
|
120
|
+
break
|
121
|
+
end
|
122
|
+
end
|
123
|
+
blocked
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/pride'
|
3
|
+
require './bin/battleship'
|
4
|
+
require './lib/ship'
|
5
|
+
require './lib/evaluator'
|
6
|
+
require './lib/printer'
|
7
|
+
require './lib/map'
|
8
|
+
module EatTheOcean
|
9
|
+
class BattleshipTest < MiniTest::Test
|
10
|
+
def setup
|
11
|
+
@battleship = EatTheOcean::Battleship.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_it_exists
|
15
|
+
assert @battleship
|
16
|
+
end
|
17
|
+
|
18
|
+
# def test_it_marks_initial_user_position_on_map
|
19
|
+
# @battleship.mark_initial_ship_position_on_map
|
20
|
+
# puts @battleship.user_map.grid_array
|
21
|
+
# puts @battleship.opponent_map.grid_array
|
22
|
+
# end
|
23
|
+
|
24
|
+
def test_it_validates_user_inputs
|
25
|
+
assert_equal "C2", @battleship.validate_input("C2")
|
26
|
+
# assert_equal Printer.invalid_input, @battleship.validate_input("CC")
|
27
|
+
end
|
28
|
+
|
29
|
+
# def test_it_registers_and_shows_successful_guesses
|
30
|
+
# @battleship.mark_initial_ship_position_on_map
|
31
|
+
# @battleship.opponent_ship_1x2.coordinates = ["A1", "A2"]
|
32
|
+
# @battleship.opponent_ship_1x3.coordinates = ["B1", "B2", "B3"]
|
33
|
+
# @battleship.guess("A1",@battleship.user_evaluator)
|
34
|
+
# @battleship.guess("B4",@battleship.user_evaluator)
|
35
|
+
# end
|
36
|
+
|
37
|
+
# def test_it_loops_for_repeat_guesses
|
38
|
+
# @battleship.user_evaluator.guess_record = ["A1","A2"]
|
39
|
+
# @battleship.user_guess
|
40
|
+
# end
|
41
|
+
|
42
|
+
def test_it_outputs_the_user_sunk_status
|
43
|
+
@battleship.mark_initial_ship_position_on_map
|
44
|
+
@battleship.opponent_ship_1x2.coordinates = ["A1", "A2"]
|
45
|
+
@battleship.opponent_ship_1x3.coordinates = ["B1", "B2", "B3"]
|
46
|
+
@battleship.guess("A1",@battleship.user_evaluator)
|
47
|
+
@battleship.guess("A2",@battleship.user_evaluator)
|
48
|
+
@battleship.guess("B1",@battleship.user_evaluator)
|
49
|
+
@battleship.guess("B2",@battleship.user_evaluator)
|
50
|
+
@battleship.guess("B3",@battleship.user_evaluator)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/pride'
|
3
|
+
require './lib/ship'
|
4
|
+
require './lib/evaluator'
|
5
|
+
require './lib/printer'
|
6
|
+
require './lib/map'
|
7
|
+
module EatTheOcean
|
8
|
+
class EvaluatorTest < MiniTest::Test
|
9
|
+
def setup
|
10
|
+
@ship_1x2 = EatTheOcean::Ship.new(nil, 4)
|
11
|
+
@ship_1x2.coordinates = ["A1", "A2"]
|
12
|
+
@ship_1x3 = EatTheOcean::Ship.new(@ship_1x2.coordinates, 4)
|
13
|
+
@evaluator = EatTheOcean::Evaluator.new(@ship_1x2)
|
14
|
+
@map = EatTheOcean::Map.new(4)
|
15
|
+
@evaluator.map = @map
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_it_exists
|
19
|
+
assert @evaluator
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_it_registers_a_hit
|
23
|
+
@evaluator.hit("A1")
|
24
|
+
assert_equal 1, @ship_1x2.hits
|
25
|
+
@evaluator.hit("A3")
|
26
|
+
assert_equal 1, @ship_1x2.hits
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_it_returns_true_on_hit
|
30
|
+
assert @evaluator.hit("A1")
|
31
|
+
refute @evaluator.hit("A4")
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_it_hits_on_a_hit
|
35
|
+
@evaluator.hit("A1")
|
36
|
+
@evaluator.hit("A2")
|
37
|
+
assert_equal 2, @ship_1x2.hits
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_it_sinks_a_1x2
|
41
|
+
@evaluator.hit("A1")
|
42
|
+
@evaluator.hit("A2")
|
43
|
+
assert_equal 1, @ship_1x2.sunk
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_it_sinks_a_1x3
|
47
|
+
@ship_1x3.random_1xSize(3)
|
48
|
+
@evaluator.ship_array[1] = @ship_1x3
|
49
|
+
@ship_1x3.coordinates[0] = "B1"
|
50
|
+
@ship_1x3.coordinates[1] = "B2"
|
51
|
+
@ship_1x3.coordinates[2] = "B3"
|
52
|
+
@evaluator.hit("B1")
|
53
|
+
@evaluator.hit("B2")
|
54
|
+
@evaluator.hit("B3")
|
55
|
+
assert_equal 1, @ship_1x3.sunk
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_it_ouputs_the_hit_entries
|
59
|
+
@evaluator.hit("A1")
|
60
|
+
@evaluator.hit("A2")
|
61
|
+
assert_equal ["A1", "A2"], @evaluator.hits_record
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_it_ouputs_the_miss_entries
|
65
|
+
miss_evaluator = EatTheOcean::Evaluator.new(Ship.new)
|
66
|
+
map = Map.new(4)
|
67
|
+
miss_evaluator.map = map
|
68
|
+
miss_evaluator.hit("A3")
|
69
|
+
miss_evaluator.hit("A4")
|
70
|
+
assert_equal ["A3", "A4"], miss_evaluator.misses_record
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_it_shows_hit_coordinates
|
74
|
+
@ship_1x3.random_1xSize(3)
|
75
|
+
@evaluator.ship_array[1] = @ship_1x3
|
76
|
+
@ship_1x3.coordinates = ["B1", "B2", "B3"]
|
77
|
+
@ship_1x2.coordinates.each do |coordinate|
|
78
|
+
@map.grid_mark(coordinate, "🐬")
|
79
|
+
end
|
80
|
+
@ship_1x3.coordinates.each do |coordinate|
|
81
|
+
@map.grid_mark(coordinate, "🐋")
|
82
|
+
end
|
83
|
+
@evaluator.hit("A1")
|
84
|
+
@evaluator.hit("B2")
|
85
|
+
@evaluator.hit("B3")
|
86
|
+
@evaluator.hit("B4")
|
87
|
+
@evaluator.hit("D1")
|
88
|
+
@evaluator.hit("D2")
|
89
|
+
puts @map.grid_array
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_it_sinks_both_ships
|
94
|
+
@ship_1x2.random_1x2
|
95
|
+
@ship_1x3.random_1xSize(3)
|
96
|
+
@evaluator.ship_array[0] = @ship_1x2
|
97
|
+
@evaluator.ship_array[1] = @ship_1x3
|
98
|
+
@ship_1x2.coordinates[0] = "A1"
|
99
|
+
@ship_1x2.coordinates[1] = "A2"
|
100
|
+
@ship_1x3.coordinates[0] = "B1"
|
101
|
+
@ship_1x3.coordinates[1] = "B2"
|
102
|
+
@ship_1x3.coordinates[2] = "B3"
|
103
|
+
@evaluator.hit("A1")
|
104
|
+
@evaluator.hit("A2")
|
105
|
+
@evaluator.hit("B1")
|
106
|
+
@evaluator.hit("B2")
|
107
|
+
@evaluator.hit("B3")
|
108
|
+
assert_equal 1, @ship_1x3.sunk
|
109
|
+
assert_equal 1, @ship_1x2.sunk
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
data/test/map_test.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/pride'
|
3
|
+
require './lib/ship'
|
4
|
+
require './lib/evaluator'
|
5
|
+
require './lib/printer'
|
6
|
+
require './lib/map'
|
7
|
+
module EatTheOcean
|
8
|
+
class MapTest < MiniTest::Test
|
9
|
+
def setup
|
10
|
+
@map = EatTheOcean::Map.new(12)
|
11
|
+
end
|
12
|
+
|
13
|
+
# def test_it_exists
|
14
|
+
# assert @map
|
15
|
+
# end
|
16
|
+
|
17
|
+
def test_it_generates_borders_of_varying_size
|
18
|
+
@map.size = 16
|
19
|
+
puts @map.border_create
|
20
|
+
end
|
21
|
+
|
22
|
+
# def test_it_generates_number_line
|
23
|
+
# puts @map.grid_create
|
24
|
+
# end
|
25
|
+
|
26
|
+
# def test_it_generates_the_grid
|
27
|
+
# @map.grid_create
|
28
|
+
# @map.border_create
|
29
|
+
# puts @map.grid_array
|
30
|
+
# end
|
31
|
+
|
32
|
+
def test_it_places_marks
|
33
|
+
@map.grid_create
|
34
|
+
@map.border_create
|
35
|
+
@map.grid_mark("A1", "🐋")
|
36
|
+
@map.grid_mark("A2", "🐋")
|
37
|
+
@map.grid_mark("A3", "🍣")
|
38
|
+
@map.grid_mark("B1", "🐬")
|
39
|
+
@map.grid_mark("B2", "🐬")
|
40
|
+
@map.grid_mark("D1", "🐬")
|
41
|
+
@map.grid_mark("D2", "🍣")
|
42
|
+
@map.grid_mark("D3", "💦")
|
43
|
+
puts @map.grid_array
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/test/ship_test.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/pride'
|
3
|
+
require './lib/ship'
|
4
|
+
require './lib/evaluator'
|
5
|
+
require './lib/printer'
|
6
|
+
require './lib/map'
|
7
|
+
module EatTheOcean
|
8
|
+
class ShipTest < MiniTest::Test
|
9
|
+
def setup
|
10
|
+
@ship_1x2 = EatTheOcean::Ship.new
|
11
|
+
@ship_1x2.coordinates = ["A1", "A2"]
|
12
|
+
@ship_1x3 = EatTheOcean::Ship.new(@ship_1x2.coordinates)
|
13
|
+
@ship_1x3.random_1xSize(3)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_it_generates_a_predictable_1x2_ship
|
17
|
+
assert_equal ["A1", "A2"], @ship_1x2.coordinates
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_it_generates_a_random_1x2_ship
|
21
|
+
random_1x2 = EatTheOcean::Ship.new(nil, 10)
|
22
|
+
puts random_1x2.random_1x2
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_it_straights
|
26
|
+
assert @ship_1x2.straight?(["A1","A2"])
|
27
|
+
assert @ship_1x2.straight?(["A1","B1"])
|
28
|
+
refute @ship_1x2.straight?(["A1","B2"])
|
29
|
+
end
|
30
|
+
|
31
|
+
# def test_it_blocks
|
32
|
+
# refute @ship_1x3.blocked?(["B2","B3","B4"])
|
33
|
+
# assert @ship_1x3.blocked?(["A1","A2","A3"])
|
34
|
+
# assert @ship_1x3.blocked?(["A2","B2","C2"])
|
35
|
+
# end
|
36
|
+
|
37
|
+
def test_it_places_linearly_or_vertically
|
38
|
+
assert_equal "B2", @ship_1x3.linear_placer("A2","v")
|
39
|
+
assert_equal "A3", @ship_1x3.linear_placer("A2","h")
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_is_the_given_ship_cornered
|
43
|
+
assert @ship_1x3.in_corner?("C3", 3)
|
44
|
+
refute @ship_1x3.in_corner?("C2", 3)
|
45
|
+
assert @ship_1x3.in_corner?("C4", 3)
|
46
|
+
assert @ship_1x3.in_corner?("D4", 3)
|
47
|
+
another_ship = EatTheOcean::Ship.new(nil, 5)
|
48
|
+
assert another_ship.in_corner?("E3", 4)
|
49
|
+
assert another_ship.in_corner?("C3", 4)
|
50
|
+
refute another_ship.in_corner?("C2", 4)
|
51
|
+
assert another_ship.in_corner?("D4", 4)
|
52
|
+
assert another_ship.in_corner?("E5", 4)
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_it_knows_bottom_and_top_edges
|
56
|
+
new_ship = EatTheOcean::Ship.new(nil, 4)
|
57
|
+
assert new_ship.on_bottom_edge?("C2", 3)
|
58
|
+
refute new_ship.on_bottom_edge?("B2", 3)
|
59
|
+
assert new_ship.on_right_edge?("C3",3)
|
60
|
+
refute new_ship.on_right_edge?("C2",3)
|
61
|
+
new_ship_2 = EatTheOcean::Ship.new(nil, 6)
|
62
|
+
assert new_ship_2.on_bottom_edge?("C2", 5)
|
63
|
+
refute new_ship_2.on_bottom_edge?("B2", 5)
|
64
|
+
assert new_ship_2.on_right_edge?("C3", 5)
|
65
|
+
refute new_ship_2.on_right_edge?("C2", 5)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_it_generates_random_coordinate_according_to_size
|
69
|
+
@ship_1x2.coordinates = ["A1", "A2"]
|
70
|
+
new_ship = EatTheOcean::Ship.new(@ship_1x2.coordinates, 4)
|
71
|
+
puts new_ship.random_1xSize(3)
|
72
|
+
end
|
73
|
+
|
74
|
+
# def test_it_generates_a_1x4_on_a_5x5_grid
|
75
|
+
# ship_1x2 = Ship.new(nil, 9)
|
76
|
+
# ship_1x2.random_1x2
|
77
|
+
# ship_1x3 = Ship.new(ship_1x2.coordinates, 9)
|
78
|
+
# ship_1x3.random_1xSize(3)
|
79
|
+
# ship_1x4 = Ship.new(ship_1x2.coordinates + ship_1x3.coordinates, 9)
|
80
|
+
# ship_1x4.random_1xSize(4)
|
81
|
+
|
82
|
+
# puts ship_1x2.coordinates + ship_1x3.coordinates + ship_1x4.coordinates
|
83
|
+
# end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: eat_the_ocean
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jeffrey Gu
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: minitest
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: A marine animal-skinned version of battleship. You can initialize 4x4,
|
28
|
+
6x6, and 8x8 gameboards.
|
29
|
+
email: jeffwgu@gmail.com
|
30
|
+
executables:
|
31
|
+
- eat_the_ocean
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- bin/battleship.rb
|
36
|
+
- bin/eat_the_ocean
|
37
|
+
- lib/battleship_hardmedium.rb
|
38
|
+
- lib/evaluator.rb
|
39
|
+
- lib/map.rb
|
40
|
+
- lib/printer.rb
|
41
|
+
- lib/ship.rb
|
42
|
+
- test/battleship_test.rb
|
43
|
+
- test/evaluator_test.rb
|
44
|
+
- test/map_test.rb
|
45
|
+
- test/ship_test.rb
|
46
|
+
- LICENSE
|
47
|
+
- README
|
48
|
+
homepage: http://www.jeffreygu.com
|
49
|
+
licenses:
|
50
|
+
- MIT
|
51
|
+
metadata: {}
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options: []
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '2.0'
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
requirements: []
|
67
|
+
rubyforge_project:
|
68
|
+
rubygems_version: 2.0.14
|
69
|
+
signing_key:
|
70
|
+
specification_version: 4
|
71
|
+
summary: A marine animal-skinned version of battleship.
|
72
|
+
test_files:
|
73
|
+
- test/battleship_test.rb
|
74
|
+
- test/evaluator_test.rb
|
75
|
+
- test/map_test.rb
|
76
|
+
- test/ship_test.rb
|