battle_boats 0.0.4 → 0.0.5
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 +4 -4
- data/.codeclimate.yml +1 -1
- data/.rubocop.yml +2 -1
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +1 -1
- data/README.md +1 -1
- data/bin/battle_boats +24 -1
- data/lib/battle_boats/board.rb +51 -12
- data/lib/battle_boats/cell.rb +42 -0
- data/lib/battle_boats/console_ui.rb +17 -13
- data/lib/battle_boats/coordinate.rb +18 -0
- data/lib/battle_boats/engine.rb +3 -5
- data/lib/battle_boats/fleet.rb +11 -0
- data/lib/battle_boats/null_ship.rb +15 -0
- data/lib/battle_boats/ship.rb +15 -0
- data/lib/battle_boats/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0fc91ef81269dd27748b5d9d56ce2ca769e97eac
|
4
|
+
data.tar.gz: 191033ffb7cda58c5f6e9ae5a630434f1f3ae511
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 496aacce57286fbc9a644c889eb58a7ca49d67d3880194a10ec88014b81dd9126ecf09ee1c22e69b3d046b647b6050de9504f2ae59dc9e1698977413b7b6bd13
|
7
|
+
data.tar.gz: a2eab93f0dd9c5b4e4212767d71e7b568fd97ced611c16446bbc655817c7fdb7cdd2731b35a019457eea73f21bf09651de8becfae3efc2dbc3bfa6177b68a327
|
data/.codeclimate.yml
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
AllCops:
|
2
2
|
Exclude:
|
3
|
-
- 'spec/**/**'
|
4
3
|
- 'Gemfile'
|
5
4
|
- 'Rakefile'
|
6
5
|
- '*.gemspec'
|
@@ -214,6 +213,8 @@ Metrics/LineLength:
|
|
214
213
|
Description: 'Limit lines to 80 characters.'
|
215
214
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#80-character-limits'
|
216
215
|
Max: 80
|
216
|
+
Exclude:
|
217
|
+
- "spec/**/*"
|
217
218
|
|
218
219
|
Metrics/MethodLength:
|
219
220
|
Description: 'Avoid methods longer than 10 lines of code.'
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# 0.0.5
|
2
|
+
### New Features
|
3
|
+
- Starting the game will display a board of randomly placed enemy ships
|
4
|
+
- Hitting a ship will display a "You hit my `<<ship>>`" message
|
5
|
+
- Hitting a ship will display the initial of the ship you've hit on the board
|
6
|
+
|
1
7
|
# 0.0.4
|
2
8
|
### New Features
|
3
9
|
- Error messages for bad input
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Battle Boats [](https://travis-ci.org/Thomascountz/battle_boats) [](https://codeclimate.com/github/Thomascountz/battle_boats/maintainability) [](https://codeclimate.com/github/Thomascountz/battle_boats/test_coverage)
|
1
|
+
# Battle Boats [](https://badge.fury.io/rb/battle_boats) [](https://travis-ci.org/Thomascountz/battle_boats) [](https://codeclimate.com/github/Thomascountz/battle_boats/maintainability) [](https://codeclimate.com/github/Thomascountz/battle_boats/test_coverage)
|
2
2
|
|
3
3
|
|
4
4
|
Battle Boats is a ruby library implementation of [Battleship](https://en.wikipedia.org/wiki/Battleship_%28game%29)!
|
data/bin/battle_boats
CHANGED
@@ -1,4 +1,27 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'battle_boats/engine'
|
4
|
-
|
4
|
+
require 'battle_boats/board'
|
5
|
+
require 'battle_boats/fleet'
|
6
|
+
require 'battle_boats/coordinate'
|
7
|
+
|
8
|
+
board = BattleBoats::Board.new
|
9
|
+
|
10
|
+
BattleBoats::FLEET.each do |ship|
|
11
|
+
coin_toss = [1, 2].sample
|
12
|
+
random_coordinate = BattleBoats::Coordinate.new(row: rand(0..9), column: rand(0..9))
|
13
|
+
if coin_toss == 1
|
14
|
+
until board.place_ship_horizontally(coordinate: random_coordinate, ship: ship)
|
15
|
+
random_coordinate = BattleBoats::Coordinate.new(row: rand(0..9), column: rand(0..9))
|
16
|
+
end
|
17
|
+
else
|
18
|
+
until board.place_ship_vertically(coordinate: random_coordinate, ship: ship)
|
19
|
+
random_coordinate = BattleBoats::Coordinate.new(row: rand(0..9), column: rand(0..9))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
engine = BattleBoats::Engine.new(board: board)
|
26
|
+
engine.start
|
27
|
+
|
data/lib/battle_boats/board.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "battle_boats/cell"
|
2
|
+
|
1
3
|
module BattleBoats
|
2
4
|
class Board
|
3
5
|
attr_reader :play_area, :status_report, :error_messages
|
@@ -9,17 +11,18 @@ module BattleBoats
|
|
9
11
|
10.times do
|
10
12
|
row = []
|
11
13
|
10.times do
|
12
|
-
row <<
|
14
|
+
row << BattleBoats::Cell.new
|
13
15
|
end
|
14
16
|
@play_area << row
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
|
-
def strike_position(
|
19
|
-
validate_position(
|
20
|
+
def strike_position(coordinate:)
|
21
|
+
validate_position(coordinate: coordinate)
|
20
22
|
if @error_messages.empty?
|
21
|
-
|
22
|
-
|
23
|
+
cell = cell_at(coordinate: coordinate)
|
24
|
+
cell.strike
|
25
|
+
@status_report = cell.status_report
|
23
26
|
true
|
24
27
|
else
|
25
28
|
false
|
@@ -30,24 +33,46 @@ module BattleBoats
|
|
30
33
|
false
|
31
34
|
end
|
32
35
|
|
36
|
+
def cell_at(coordinate:)
|
37
|
+
if within_range?(coordinate.row) && within_range?(coordinate.column)
|
38
|
+
@play_area[coordinate.row.to_i][coordinate.column.to_i]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def place_ship_horizontally(coordinate:, ship:)
|
43
|
+
cells_to_occupy = Array.new(ship.length) do |offset|
|
44
|
+
cell_at(coordinate: coordinate.right(offset: offset))
|
45
|
+
end
|
46
|
+
|
47
|
+
occupy_cells(cells: cells_to_occupy, ship: ship)
|
48
|
+
end
|
49
|
+
|
50
|
+
def place_ship_vertically(coordinate:, ship:)
|
51
|
+
cells_to_occupy = Array.new(ship.length) do |offset|
|
52
|
+
cell_at(coordinate: coordinate.up(offset: offset))
|
53
|
+
end
|
54
|
+
|
55
|
+
occupy_cells(cells: cells_to_occupy, ship: ship)
|
56
|
+
end
|
57
|
+
|
33
58
|
private
|
34
59
|
|
35
|
-
def validate_position(
|
60
|
+
def validate_position(coordinate:)
|
36
61
|
@error_messages.clear
|
37
|
-
if !
|
62
|
+
if !within_range?(coordinate.row)
|
38
63
|
@error_messages << "The selected row is invalid"
|
39
64
|
end
|
40
|
-
if !
|
65
|
+
if !within_range?(coordinate.column)
|
41
66
|
@error_messages << "The selected column is invalid"
|
42
67
|
end
|
43
68
|
if @error_messages.empty?
|
44
|
-
if !position_available?(
|
69
|
+
if !position_available?(coordinate: coordinate)
|
45
70
|
@error_messages << "That position has already been hit"
|
46
71
|
end
|
47
72
|
end
|
48
73
|
end
|
49
74
|
|
50
|
-
def
|
75
|
+
def within_range?(input)
|
51
76
|
if input.to_s =~ /^[0-9]$/
|
52
77
|
true
|
53
78
|
else
|
@@ -55,8 +80,22 @@ module BattleBoats
|
|
55
80
|
end
|
56
81
|
end
|
57
82
|
|
58
|
-
def position_available?(
|
59
|
-
|
83
|
+
def position_available?(coordinate:)
|
84
|
+
!cell_at(coordinate: coordinate).hit?
|
85
|
+
end
|
86
|
+
|
87
|
+
def occupy_cells(cells:, ship:)
|
88
|
+
if cells_are_occupiable(cells)
|
89
|
+
cells.each do |cell|
|
90
|
+
cell.occupant = ship
|
91
|
+
end
|
92
|
+
else
|
93
|
+
false
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def cells_are_occupiable(cells)
|
98
|
+
cells.none?(&:nil?) && cells.none?(&:occupied?)
|
60
99
|
end
|
61
100
|
end
|
62
101
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative "null_ship"
|
2
|
+
|
3
|
+
module BattleBoats
|
4
|
+
class Cell
|
5
|
+
attr_accessor :occupant
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@hit = false
|
9
|
+
@occupant = BattleBoats::NullShip.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def hit?
|
13
|
+
@hit
|
14
|
+
end
|
15
|
+
|
16
|
+
def strike
|
17
|
+
if !hit?
|
18
|
+
@hit = true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
if hit?
|
24
|
+
occupant.symbol
|
25
|
+
else
|
26
|
+
"."
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def status_report
|
31
|
+
if hit?
|
32
|
+
"You hit my #{occupant.name}!"
|
33
|
+
else
|
34
|
+
"All Clear!"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def occupied?
|
39
|
+
!occupant.empty?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative "coordinate"
|
2
|
+
|
1
3
|
module BattleBoats
|
2
4
|
class ConsoleUI
|
3
5
|
def initialize(output: $stdout, input: $stdin)
|
@@ -13,14 +15,10 @@ module BattleBoats
|
|
13
15
|
output.puts format_board(board)
|
14
16
|
end
|
15
17
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
def get_column
|
22
|
-
output.puts "Target column:"
|
23
|
-
input.gets.chomp
|
18
|
+
def get_coordinate
|
19
|
+
row = get_row
|
20
|
+
column = get_column
|
21
|
+
BattleBoats::Coordinate.new(row: row, column: column)
|
24
22
|
end
|
25
23
|
|
26
24
|
def display_status_report(status_report)
|
@@ -46,11 +44,7 @@ module BattleBoats
|
|
46
44
|
board_string << " #{row_number} "
|
47
45
|
board_string << pipe
|
48
46
|
row.each do |cell|
|
49
|
-
board_string <<
|
50
|
-
" #{cell} "
|
51
|
-
else
|
52
|
-
" . "
|
53
|
-
end
|
47
|
+
board_string << " #{cell} "
|
54
48
|
board_string << pipe
|
55
49
|
end
|
56
50
|
board_string << newline
|
@@ -75,5 +69,15 @@ module BattleBoats
|
|
75
69
|
def pipe
|
76
70
|
"|"
|
77
71
|
end
|
72
|
+
|
73
|
+
def get_row
|
74
|
+
output.puts "Target row:"
|
75
|
+
input.gets.chomp
|
76
|
+
end
|
77
|
+
|
78
|
+
def get_column
|
79
|
+
output.puts "Target column:"
|
80
|
+
input.gets.chomp
|
81
|
+
end
|
78
82
|
end
|
79
83
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module BattleBoats
|
2
|
+
class Coordinate
|
3
|
+
attr_reader :row, :column
|
4
|
+
|
5
|
+
def initialize(row: nil, column: nil)
|
6
|
+
@row = row
|
7
|
+
@column = column
|
8
|
+
end
|
9
|
+
|
10
|
+
def up(offset: 1)
|
11
|
+
self.class.new(row: row - offset, column: column)
|
12
|
+
end
|
13
|
+
|
14
|
+
def right(offset: 1)
|
15
|
+
self.class.new(row: row, column: column + offset)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/battle_boats/engine.rb
CHANGED
@@ -13,12 +13,10 @@ module BattleBoats
|
|
13
13
|
interface.greet
|
14
14
|
until board.game_over?
|
15
15
|
interface.display_board(board)
|
16
|
-
|
17
|
-
|
18
|
-
until board.strike_position(row: row, column: column)
|
16
|
+
coordinate = interface.get_coordinate
|
17
|
+
until board.strike_position(coordinate: coordinate)
|
19
18
|
interface.display_errors(board.error_messages)
|
20
|
-
|
21
|
-
column = interface.get_column
|
19
|
+
coordinate = interface.get_coordinate
|
22
20
|
end
|
23
21
|
interface.display_status_report(board.status_report)
|
24
22
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require_relative "ship"
|
2
|
+
|
3
|
+
module BattleBoats
|
4
|
+
FLEET = [
|
5
|
+
BattleBoats::Ship.new(name: "Carrier", length: 5, symbol: "C"),
|
6
|
+
BattleBoats::Ship.new(name: "Battleship", length: 4, symbol: "B"),
|
7
|
+
BattleBoats::Ship.new(name: "Cruiser", length: 3, symbol: "R"),
|
8
|
+
BattleBoats::Ship.new(name: "Submarine", length: 3, symbol: "S"),
|
9
|
+
BattleBoats::Ship.new(name: "Destroyer", length: 2, symbol: "D"),
|
10
|
+
].freeze
|
11
|
+
end
|
data/lib/battle_boats/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: battle_boats
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Countz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -107,8 +107,13 @@ files:
|
|
107
107
|
- bin/setup
|
108
108
|
- lib/battle_boats.rb
|
109
109
|
- lib/battle_boats/board.rb
|
110
|
+
- lib/battle_boats/cell.rb
|
110
111
|
- lib/battle_boats/console_ui.rb
|
112
|
+
- lib/battle_boats/coordinate.rb
|
111
113
|
- lib/battle_boats/engine.rb
|
114
|
+
- lib/battle_boats/fleet.rb
|
115
|
+
- lib/battle_boats/null_ship.rb
|
116
|
+
- lib/battle_boats/ship.rb
|
112
117
|
- lib/battle_boats/version.rb
|
113
118
|
homepage: https://www.github.com/thomascountz/battle_boats
|
114
119
|
licenses:
|